Skip to content

Instantly share code, notes, and snippets.

@rounakdatta
Created September 4, 2018 14:09
Show Gist options
  • Save rounakdatta/1764a022056bb43b5fac6dbb56ffd36e to your computer and use it in GitHub Desktop.
Save rounakdatta/1764a022056bb43b5fac6dbb56ffd36e to your computer and use it in GitHub Desktop.
var floating_header = function() {
this.header = document.createElement('table');
this.header_height = 0;
this.getkeys = function(obj) {
var keys = new Array();
for ( var key in obj ) {
keys.push(key);
}
return keys;
};
this.getXY = function( o ) {
var y = 0;
var x = 0;
while( o != null ) {
y += o.offsetTop;
x += o.offsetLeft;
o = o.offsetParent;
}
return { "x": x, "y": y };
}
this.setheader = function() {
var win = window.pageYOffset ? window.pageYOffset : 0;
var cel = document.documentElement ? document.documentElement.scrollTop : 0;
var body = document.body ? document.body.scrollTop : 0;
var result = win ? win : 0;
if ( cel && ( ! result || ( result > cel ))) result = cel;
var screenpos = body && ( ! result || ( result > body ) ) ? body : result;
var theady_max = this.getXY(this.table_obj.getElementsByTagName('THEAD')[0]).y + this.table_obj.offsetHeight - this.header_height;
if ( screenpos > this.theady && screenpos < theady_max ) {
this.header.style.top=Math.round(screenpos);
this.header.style.display = 'block';
this.header_height = header.offsetHeight;
}
else {
this.header.style.display = 'none';
}
}
this.addclass = function(obj, newclass) {
if ( obj.classes == null ) {
obj.classes = new Array();
}
obj.classes[newclass] = 1;
obj.className = this.getkeys(obj.classes).join(' ');
return true;
};
this.theady = 0;
this.build_header = function() {
this.table_obj = document.getElementsByTagName('THEAD');
if ( ! this.table_obj ) {
alert("you MUST have <thead> and </thead> tags wrapping the part of the table you want to keep on the screen");
return;
}
this.table_obj = this.table_obj[0];
while ( this.table_obj.tagName != 'TABLE' ) {
if ( this.table_obj.tagName == 'BODY' ) {
alert('The THEAD section MUST be inside a table - how did you do that???');
return;
}
this.table_obj = this.table_obj.parentNode;
}
thead = this.table_obj.getElementsByTagName('THEAD')[0].cloneNode(1);
thead.id = 'copyrow';
this.header.style.position='absolute';
this.header.style.display='none';
this.header.appendChild(thead);
this.header.style.width = this.table_obj.offsetWidth;
var srcths = this.table_obj.getElementsByTagName('THEAD')[0].getElementsByTagName('*');
var copyths = thead.getElementsByTagName('*');
for ( var x = 0; x < copyths.length; x++ ) {
copyths[x].className = srcths[x].className;
copyths[x].align = srcths[x].align;
copyths[x].background = srcths[x].background;
copyths[x].bgColor = srcths[x].bgColor;
copyths[x].colSpan = srcths[x].colSpan;
copyths[x].height = srcths[x].height;
copyths[x].rowSpan = srcths[x].rowSpan;
pr = Math.round(srcths[x].style.paddingRight.split('px')[0]);
pl = Math.round(srcths[x].style.paddingLeft.split('px')[0]);
bl = ( Math.round(srcths[x].style.borderLeftWidth.split('px')[0]) ) ? Math.round(srcths[x].style.borderLeftWidth.split('px')[0]) : 0;
br = ( Math.round(srcths[x].style.borderRightWidth.split('px')[0]) ) ? Math.round(srcths[x].style.borderRightWidth.split('px')[0]) : 0;
pt = Math.round(srcths[x].style.paddingTop.split('px')[0]);
pb = Math.round(srcths[x].style.paddingBottom.split('px')[0]);
bt = Math.round(srcths[x].style.borderTopWidth.split('px')[0]);
bb = Math.round(srcths[x].style.borderBottomWidth.split('px')[0]);
if ( srcths[x].currentStyle ) {
for ( var y in srcths[x].currentStyle ) {
if ( y == 'font' || y == 'top' ) continue;
copyths[x].style[y] = srcths[x].currentStyle[y];
}
pr = Math.round(srcths[x].currentStyle.paddingRight.split('px')[0]);
pl = Math.round(srcths[x].currentStyle.paddingLeft.split('px')[0]);
bl = ( Math.round(srcths[x].currentStyle.borderLeftWidth.split('px')[0]) ) ? Math.round(srcths[x].currentStyle.borderLeftWidth.split('px')[0]) : 0;
pt = Math.round(srcths[x].currentStyle.paddingTop.split('px')[0]);
pb = Math.round(srcths[x].currentStyle.paddingBottom.split('px')[0]);
bt = Math.round(srcths[x].currentStyle.borderTopWidth.split('px')[0]);
}
if ( srcths[x].onclick ) copyths[x].onclick = srcths[x].onclick;
var width = ( srcths[x].offsetWidth - pr - pl > 0 ) ? srcths[x].offsetWidth - pr - pl : 0;
copyths[x].style.position = srcths[x].style.position;
copyths[x].style.top = ( srcths[x].offsetTop - pt - pb > 0 ) ? srcths[x].offsetTop - pt - pb : srcths[x].offsetTop;
copyths[x].style.top = srcths[x].style.top;
copyths[x].style.height = srcths[x].offsetHeight;
copyths[x].style.left = srcths[x].offsetLeft;
if ( ! copyths[x].currentStyle ) {
//copyths[x].style.width = Math.floor(document.defaultView.getComputedStyle(srcths[x],"").getPropertyValue("width").split('px')[0]);
copyths[x].style.width = document.defaultView.getComputedStyle(srcths[x],"").getPropertyValue("width");
}
else {
copyths[x].style.width = srcths[x].offsetWidth - pr - pl; // - bl;
copyths[x].width = srcths[x].width;
}
if ( x == copyths.length - 1 ) {
this.header.style.paddingBottom = pb;
this.header.style.borderBottom = bb;
}
}
this.addclass(this.header, 'main');
document.body.appendChild(this.header);
theady = this.getXY(this.table_obj.getElementsByTagName('THEAD')[0]).y;
}
var origonload = window.onload;
window.onload = function() {
if (origonload) {
origonload();
}
this.build_header();
};
window.onscroll=this.setheader;
};
floating_header();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment