/* * jQuery.fixedThead.js * By Zarino at mySociety */ (function ($) { // Call this on a 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));