
This jQuery plugin converts a properly formatted table, having thead and tbody elements (tfoot optional), into a scrollable table. Scrollable tables are most useful when having to display lots of tubular data in a fixed space.
Show Me The Money (Demo)
| city | state code | zip | latitude | longitude | county |
| 10 | 2 | 15 | - | - | 9 |
| Holtsville | NY | 00501 | 40.8152 | -73.0455 | Suffolk |
| Holtsville | NY | 00544 | 40.8152 | -73.0455 | Suffolk |
| Adjuntas | PR | 00601 | 18.1788 | -66.7516 | Adjuntas |
| Aguada | PR | 00602 | 18.381389 | -67.188611 | Aguada |
| Aguadilla | PR | 00603 | 18.4554 | -67.1308 | Aguadilla |
| Aguadilla | PR | 00604 | 18.4812 | -67.1467 | Aguadilla |
| Aguadilla | PR | 00605 | 18.429444 | -67.154444 | Aguadilla |
| Maricao | PR | 00606 | 18.182778 | -66.980278 | Maricao |
| Anasco | PR | 00610 | 18.284722 | -67.14 | Anasco |
| Angeles | PR | 00611 | 18.286944 | -66.799722 | Utuado |
| Arecibo | PR | 00612 | 18.4389 | -66.6924 | Arecibo |
| Arecibo | PR | 00613 | 18.1399 | -66.6344 | Arecibo |
| Arecibo | PR | 00614 | 18.1399 | -66.6344 | Arecibo |
| Bajadero | PR | 00616 | 18.428611 | -66.683611 | Arecibo |
| Barceloneta | PR | 00617 | 18.4525 | -66.538889 | Barceloneta |
Table Scroll Plugin Overview
The tablescroll jQuery plugin is a simple markup manipulation plugin, it will manipulate the table, create a couple of new elements and wrap everything in a DIV.
Using the plugin is pretty straight forward, when you download the plugin you can view the demo file to get up to speed and begin working with it immediately.
The HTML TABLE markup is also pretty basic:
<table id="thetable" cellspacing="0"> <thead> <tr> <td>city</td> <td>state code</td> <td>zip</td> <td>latitude</td> <td>longitude</td> <td>county</td> </tr> </thead> <tfoot> <tr> <td>city</td> <td>state code</td> <td>zip</td> <td>latitude</td> <td>longitude</td> <td>county</td> </tr> </tfoot> <tbody> <tr class="first"> <td>Holtsville</td> <td>NY</td> <td>00501</td> <td>40.8152</td> <td>-73.0455</td> <td>Suffolk</td> </tr> <tr> <td>Holtsville</td> <td>NY</td> <td>00544</td> <td>40.8152</td> <td>-73.0455</td> <td>Suffolk</td> </tr> <tr> <td>Adjuntas</td> <td>PR</td> <td>00601</td> <td>18.1788</td> <td>-66.7516</td> <td>Adjuntas</td> </tr> </tbody> </table>
Styling the table should go pretty smoothly, but be warned, the plugin does some width/height calculations which require the styles to be in place prior to doing the calculations.
Here is the demo CSS which should get you started:
.tablescroll {
font: 12px normal Tahoma, Geneva, "Helvetica Neue", Helvetica, Arial, sans-serif;
}
.tablescroll td,
.tablescroll_wrapper,
.tablescroll_head,
.tablescroll_foot {
border:1px solid #ccc;
}
.tablescroll td {
padding:3px 5px;
border-bottom:0;
border-right:0;
}
.tablescroll_wrapper {
background-color:#fff;
border-left:0;
}
.tablescroll_head,
.tablescroll_foot {
background-color:#eee;
border-left:0;
border-top:0;
font-size:11px;
font-weight:bold;
}
.tablescroll_head {
margin-bottom:3px;
}
.tablescroll_foot {
margin-top:3px;
}
.tablescroll tbody tr.first td {
border-top:0;
}
The plugin is basic and only has a few options:
$.fn.tableScroll.defaults =
{
flush: true, // makes the last thead and tbody column flush with the scrollbar
width: null, // width of the table (head, body and foot), null defaults to the tables natural width
height: 100, // height of the scrollable area
containerClass: 'tablescroll' // the plugin wraps the table in a div with this css class
};
Like most jQuery plugins, implementation is a snap:
jQuery(document).ready(function($)
{
$('#thetable').tableScroll({height:200});
// other examples
// sets the table to have a scrollable area of 200px
$('#thetable').tableScroll({height:200});
// sets a hard width limit for the table, setting this too small
// may not always work
$('#thetable').tableScroll({width:400});
// by default the plugin will wrap everything in a div with this
// css class, if it finds that you have manually wrapped the
// table with a custom element using this same css class it
// will forgo creating a container DIV element
$('#thetable').tableScroll({containerClass:'myCustomClass'});
});
Like many projects, we developers build out of necessity. I couldn’t quite find what I needed, so i wrote my own! This plugin accomplished all of what I needed, and I thought it useful enough that I would share. If you have any feature requests and/or bug reports please let me know. And the plugin name is pretty generic too (if you have a better one, feel free to drop me a line).
I’ve tested the plugin on Windows with Chrome, FF 3.6, IE 6, IE 8, Safari 4. If anyone is on a Mac, please let me know what your results are?
Download
jQuery TableScroll plugin, this project is on github

Great Plugin, thx.
However, ive found it acts very strange when the table your effecting is itself wrapped in a normal table (it adds rightside padding for some reason)
If i get to the bottom of it, ill post further.
I found changing width:0px; on line 39 of the code resolved my issue.
Hope that helps someone else.
Please explain the use of flush. I want to have the vertical scroll on the right of the total width of newly created div not at the end of Thead and TBody column???
Plz.
Thanks for developing this. I can totally relate to your comment about “build[ing] out of necessity”. You saved me a bunch of time by sharing this project. Kudos!
Nice Plugin, exactly what I was looking for.
Thanks also to Larry Woods (February 4, 2011 at 7:49 pm), I also had issues where the CSS formatting was missing if the number of rows resulted in the height being less than the scroll bar height.
Looking great now.
Thanks!
Nice! I’d love to see a sort by column option as well.
Hi Dimas,
Markus Ernst asked a while back about getting the data in the table to display for print. I had the same problem and discovered that if you use this rule in your print css you can get the data to display for print:
.tablescroll_wrapper {
overflow: visible !important;
height: 100% !important;
}
Hope that helps someone. Thanks for the plugin Dimas!
I have been trying to plug this into some tables today that sometimes have a second set of titles (spanning multiple columns).
I replaced this line:
var thead_tr_first = $('thead tr:first',tb);with:
if (spantitle) { var thead_tr_first = $('thead tr:eq(1)',tb); } else { var thead_tr_first = $('thead tr:eq(0)',tb); }and set the spantitle variable before calling tablescroll.
If spantitle is true, it skips over the widths for the first row and uses the second row as the basis for the column widths.
I hope this helps others. I’d also like to add my thanks. Apart from this minor issue, this works great.
Table header are not properly aligned with the data, looks like the header widths are not measured properly. My table is retrieved through a AJAX call when i click on a tab. Here is the code snippet.
$(function(){ $('#tabs').tabs({ select: function(event, ui) { if(ui.panel.id == 'tabs-7'){ $('#tabs-7').html($.ajax({url: "./scripts/table.php",async: false}).responseText); $('#mytbl').tableScroll({height:400,width:800}); } } }); });Its a great plugin…
How can i make this work with live or livequery, any ideas?
Figured out how to take it live
jQuery(document).ready(function($) { $('#thetable').livequery(function(){ $(this).tableScroll({height:650}); }); $('#thetable2').livequery(function(){ $(this).tableScroll({height:650}); }); });You really helped me out here, thanks!
@ramana try this:
$(function(){ $('#tabs').tabs({ select: function(event, ui) { if(ui.panel.id == 'tabs-7'){ $('#tabs-7').html($.ajax({url: "./scripts/table.php",async: false}).responseText); $('#mytbl').tableScroll({height:400,width:800,flush:false}); } } }); });I am having the same problem as @ramana.. The headers won’t align properly with the data…
I needed to make tables inside of tables for popups to other items… Yeah I know. Just being difficult.
So I changed this and it seemed to work. Looks for the immediate child sets so I do not have to worry about it finding every thead or tfoot and pre-pending it to the first thead grouping it does.
Changed from:
if (has_thead) { var tbh = $('').insertBefore(wrapper).prepend($('thead',tb)); } if (has_tfoot) { var tbf = $('').insertAfter(wrapper).prepend($('tfoot',tb)); }Changed to:
if (has_thead) { var tbh = $('').insertBefore(wrapper).prepend($('> thead',tb)); } if (has_tfoot) { var tbf = $('').insertAfter(wrapper).prepend($('> tfoot',tb)); }This is great
However I have the same problem as ramana (the thead seems to get out of sync when refilling the table via ajax.)
I tried the flush, and that does not work, I also tried to pass an undo string like this
$(‘#myTable’).tableScroll(“undo”);
because the code seems to have some support for that, but that does not work either
anybody got a quick fix for ajax refill?
Hey, nice plugin. I’ve tried to use many fixed-headers plugins, but only your has worked
However, it doesnt has a horizontal scroller with a fixed vertical scroll. Do you plan to add this feature on it’s next update?
Congrats
this is a great tool, but the scrollbars are not visible on the iPad and therefore it does not scroll.
any ideas why?
thanks
Is there a way to lock the first 2 columns?
Awesome plugin, Thanks
can you set the columns to a specified width?
thanks!
Bob
Hi,
Thanks so much for making this.
I had a little problem with my header lining up with the table, so I added this when I invoked it:
$(‘.tablescroll_head’).css(‘width’, $(‘.tablescroll_body’).width());
$(‘.tablescroll_head th’).css(‘padding’,’3px 5px’);
Dan
Hi,
I am using the code, could you provide some guidelines on the following thing:
I am using while loop for table data as its from database and I want to use it in dynamic way
and this way for other fields
The thing is all thing is working fine with Mozilla or chrome, but when trying this on IE-8 its putting some space blank between End of THead and Start of TBody which is same irrespective of browser and its height is same.
Is it related to while looping in JSP OR
Its about DocType declaration at the top of the JSP.
I have searched all possible option.
Please guide.
Thanks.
Please see the code for my previous comment/ question:
x
y
z
@Dan,
excuse me, where would you put this you say?
$(‘.tablescroll_head’).css(‘width’, $(‘.tablescroll_body’).width());
$(‘.tablescroll_head th’).css(‘padding’,’3px 5px’);
Thanks!