diff options
author | Zarino Zappia <mail@zarino.co.uk> | 2015-05-21 15:57:42 +0100 |
---|---|---|
committer | Matthew Somerville <matthew@mysociety.org> | 2015-07-28 17:12:15 +0100 |
commit | ecb7a3525ad2afaba7a524922a9de26a3531eb37 (patch) | |
tree | 1cb3d428391316208c0a780de92592a7aee6ee86 /web/js | |
parent | aaa1947c2ec5a45cfca0b01213464afcc10e4c9a (diff) |
Fix “All Reports” table headers on scroll.
This reuses some JavaScript I originally wrote for mySociety’s
EveryPolitician project.
Diffstat (limited to 'web/js')
-rw-r--r-- | web/js/jquery.fixedthead.js | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/web/js/jquery.fixedthead.js b/web/js/jquery.fixedthead.js new file mode 100644 index 000000000..33e60f721 --- /dev/null +++ b/web/js/jquery.fixedthead.js @@ -0,0 +1,81 @@ +/* + * jQuery.fixedThead.js + * By Zarino at mySociety + */ + +(function ($) { + + // Call this on a <thead> element and it'll be given a class + // of '.js-fixed-thead__clone' when you scroll down. eg: + // $('#my-table thead').fixedThead() + // + // You'll probably want to specify some CSS styles like: + // .js-fixed-thead__clone { position: fixed; background: #fff; } + + $.fn.fixedThead = function() { + + var calculateCloneDimensions = function calculateCloneDimensions($originalThead, $cloneThead){ + $cloneThead.css({ + width: $originalThead.width() + }); + + $('tr', $originalThead).each(function(tr_index, tr){ + $('th', tr).each(function(th_index, th){ + $cloneThead.find('tr:eq(' + tr_index + ') th:eq(' + th_index + ')').css({ + width: $(th).width() + }); + }); + }); + } + + var showOrHideClone = function showOrHideClone($table, $originalThead, $cloneThead){ + var bounds = $table[0].getBoundingClientRect(); + + // First we detect whether *any* of the table is visible, + // then, if it is, we position the fixed thead so that it + // never extends outside of the table bounds even when the + // visible portion of the table is shorter than the thead. + + if(bounds.top <= 0 && bounds.bottom >= 0){ + $cloneThead.css('display', $originalThead.css('display')); + + var rowHeight = $cloneThead.outerHeight(); + if(bounds.bottom < rowHeight){ + $cloneThead.css({ + top: (rowHeight - bounds.bottom) * -1 + }); + } else { + $cloneThead.css({ + top: 0 + }); + } + + } else { + $cloneThead.css('display', 'none'); + } + } + + return this.each(function() { + var $originalThead = $(this); + var $table = $originalThead.parent('table'); + var $cloneThead = $originalThead.clone().addClass('js-fixed-thead__clone'); + + $cloneThead.insertAfter($originalThead); + $cloneThead.css('display', 'none'); + + calculateCloneDimensions($originalThead, $cloneThead); + showOrHideClone($table, $originalThead, $cloneThead); + + $(window).resize(function(){ + calculateCloneDimensions($originalThead, $cloneThead); + showOrHideClone($table, $originalThead, $cloneThead); + }); + + $(window).scroll(function(){ + showOrHideClone($table, $originalThead, $cloneThead); + }); + }); + + }; + +}(jQuery)); |