bPratik bPratik - 6 months ago 540
jQuery Question

DataTables fixed headers misaligned with columns in wide tables

Problem



When using the
sScrollX
,
sScrollXInner
and/or
sScrollY
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/

Output



Chrome:

Chrome Screenshot

IE:

IE9 Screenshot

Firefox

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 )
    and
    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
sScrollX
and
sScrollY
, 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!

Note



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
http://jsfiddle.net/pratik136/etL73/#REV#
where
1 <= #REV# <=12


History



StackO

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.

External

This issue has also been flagged on the DataTables forum:



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

Answer

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,
    //true
    "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())});
Comments