Frozen table header inside scrollable div Frozen table header inside scrollable div asp.net asp.net

Frozen table header inside scrollable div


I've just put together a jQuery plugin that does exactly what you want. Its very small in size and really easy to implement.

All that is required is a table that has a thead and tbody.

You can wrap that table in a DIV with a classname and the table will always resize to fit in that div. so for example if your div scales with the browser window so will the table. The header will be fixed when scrolling. The footer will be fixed (if you enable a footer). You also have the option to clone the header in the footer and have it fixed. Also if you make your browser window too small and all columns can't fit...it will also scroll horizontally (header too).

you just pass the DIV's classname to the plugin like so: $('.myDiv').fixedHeaderTable({footer: true, footerId: 'myFooterId'});and the plugin will do the rest. FooterID is a element on the page that contains the mark-up for your footer. this is used if you want to have pagination as your footer.

If you have multiple tables on the page it will also work for each table you want to have a fixed header.

check it out here: http://fixedheadertable.mmalek.com/

Keep in mind its still 'beta' so I am adding new features and bug fixes daily.

Supported browsers: IE6, IE7, IE8, FireFox, Safari, and Chrome


Solution is really simple. You need 3 DIVs: a general container (in my case of class "outer"), a table container (in my case of class "inner") and a DIV in which you make a clone of an existing table using jQuery or javaScript (in my case of class "header").

Solution uses CSS and a few lines of jQuery code, which clones HTML of "inner" into "header" and sets its width and height. Supports fixed and variable columns width. Tested with IE8, Firefox 9, Safari and Google Chrome.

Here is a sample code:

    	$(document).ready(function() {    		$('.header').html( $('.inner').html() );    		$('.header').css('width', $('.inner table').outerWidth() );    		$('.header').css('height', $('.inner table thead').outerHeight() );    	});
table {  width:100%;}th {  border-top:1px solid #999;  text-align:left;}td, th {  border-bottom:1px solid #999;  background-color:#EEE;}.outer {  position:relative;  width:500px;}.inner {  height:150px;  overflow:auto;}.header {  position:absolute;  top:0;  left:0;  overflow:hidden;}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script><body><div class="outer">  <div class="inner">    <table cellspacing="0" cellpadding="0">      <thead>        <tr>          <th>a</th>          <th>b</th>          <th>c</th>          <th>d</th>        </tr>      </thead>      <tbody>        <tr><td>1</td><td>b</td><td>c</td><td>d</td></tr>        <tr><td>2</td><td>b</td><td>c</td><td>d</td></tr>        <tr><td>3</td><td>b</td><td>c</td><td>d</td></tr>        <tr><td>4</td><td>b</td><td>c</td><td>d</td></tr>        <tr><td>5</td><td>b</td><td>c</td><td>d</td></tr>        <tr><td>6</td><td>b</td><td>c</td><td>d</td></tr>        <tr><td>7</td><td>b</td><td>c</td><td>d</td></tr>        <tr><td>8</td><td>b</td><td>c</td><td>d</td></tr>        <tr><td>9</td><td>b</td><td>c</td><td>d</td></tr>        <tr><td>10</td><td>b</td><td>c</td><td>d</td></tr>        <tr><td>11</td><td>b</td><td>c</td><td>d</td></tr>        <tr><td>12</td><td>b</td><td>c</td><td>d</td></tr>      </tbody>    </table>  </div>  <div class="header">  </div></div></body>


Here is a basic solution using javascript:

function position(table) {    table.rows[0].style.position="absolute";    table.rows[0].style.top="0px";    table.style.marginTop = table.rows[0].clientHeight/1.2;    var widths = Array();    for(var i = 0; i < table.rows[0].cells.length; i++) {        widths[i] = max(table.rows[0].cells[i].clientWidth, table.rows[1].cells[i].clientWidth);    }    for(var row = 0; row < table.rows.length; row++) {        for(var col = 0; col < widths.length; col ++) {            table.rows[row].cells[col].style.width = widths[col] + "px";        }    }}function max(num1, num2) { return (num1 > num2) ? num1 : num2; }