bPratik bPratik - 1 year ago 1290
jQuery Question

DataTables fixed headers misaligned with columns in wide tables


When using the
to achieve a fixed header table with its inner content scrolling, the headers of the table go out of alignment with the rest of the body in Chrome and IE. Firefox on the other hand displays them perfectly.

Using the version 1.9.4, as far as I can tell, this issue only occurs when there is a lot of data with fluctuating widths, and with words that are very long/unwrappable combined in the same columns as small ones. Also the table in question needs to be fairly wide.

All these factors are demonstrated in this fiddle: http://jsfiddle.net/pratik136/etL73/12/embedded/result/



Chrome Screenshot


IE9 Screenshot


Firefox Screenshot

Suggested Solutions

These solutions have been suggested before but have had no effect on my implementation. Owing to some of these suggestions, I setup a clean plain vanilla demo as I wanted to ensure that no other code was contributing to this effect.

  • turn-off/remove all my css

  • setTimeout( function () { oTable.fnAdjustColumnSizing(); }, 10 );

  • calling
    oTable.fnFilter( "x",0 )
    oTable.fnFilter( "",0 )
    in that order

  • "sScrollXInner": "100%"

  • get rid of all widths

The only solution that I found to the misaligned headers was taking out
, but this can't be counted as a solution as you lose the fixed header/inner content scrolling functionality. So sadly it's a temporary hack, not a fix!


To edit/play with the latest fiddle: http://jsfiddle.net/pratik136/etL73/12

I have tried various combinations which can be observed in the revision history of the fiddle by using the link
1 <= #REV# <=12



This question has been asked before: jQuery Datatables Header Misaligned With Vertical Scrolling

but the vital difference is that the OP of that question mentioned that they were able to fix the issue if all CSS was removed, which is untrue in my case, and I have tried a few permutations, thus thought the question worthy of a repost.


This issue has also been flagged on the DataTables forum:

This issue has driven me nuts! Please contribute your thoughts!

Answer Source

EDIT: See latest Fiddle with "fixed header": http://jsfiddle.net/ruslans_uralovs/zDaGk/

The Fiddle: http://jsfiddle.net/hDgHs/

One of the solutions is to implement scrolling yourself instead of letting DataTables plugin do it for you.

I've taken your example and commented out sScrollX option. When this option is not present DataTables plugin will simply put your table as is into a container div. This table will stretch out of the screen therefore to fix that we can put it into a div with required width and an overflow preperty set - this is exactly what the last jQuery statement does - it wraps existing table into a 300px wide div. You probably will not need to set the width on the wrapping div at all (300px in this example), i have it here so that clipping effect is easily visible. And be nice, don't forget to replace that inline style with a class.

$(document).ready(function() {
var stdTable1 = $(".standard-grid1").dataTable({
    "iDisplayLength": -1,
    "bPaginate": true,
    "iCookieDuration": 60,
    "bStateSave": false,
    "bAutoWidth": false,
    "bScrollAutoCss": true,
    "bProcessing": true,
    "bRetrieve": true,
    "bJQueryUI": true,
    //"sDom": 't',
    "sDom": '<"H"CTrf>t<"F"lip>',
    "aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
    //"sScrollY": "500px",
    //"sScrollX": "100%",
    "sScrollXInner": "110%",
    "fnInitComplete": function() {
        this.css("visibility", "visible");

var tableId = 'PeopleIndexTable';
$('<div style="width: 300px; overflow: auto"></div>').append($('#' + tableId)).insertAfter($('#' + tableId + '_wrapper div').first())});
Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download