datatable jQuery-表标题宽度与主体宽度不对齐


74

我正在使用jQuery数据表。运行该应用程序时,标头宽度与主体宽度不对齐。但是,当我单击页眉时,它与主体的宽度对齐,但是即使那样,仍有一些光线未对齐。仅在IE中会出现此问题。

JSFiddle

页面加载后的外观如下:

在此处输入图片说明

单击标题后:

在此处输入图片说明

我的数据表代码:

$("#rates").dataTable({
    "bPaginate": false,
    "sScrollY": "250px",
    "bAutoWidth": false,
    "bScrollCollapse": true,
    "bLengthChange": false,
    "bFilter": false,
    "sDom": '<"top">rt<"bottom"flp><"clear">',
    "aoColumns": [{
            "bSortable": false
        },
        null,
        null,
        null,
        null
    ]
});

rates是我的表格ID。
有人可以帮我吗?提前致谢。


您可以创建一个jsFiddle以便我们看到并测试该问题吗?jsfiddle.net
CFS

我无法创建jsfiddle。我的代码中有一些依赖的数据库。
kishore 2013年

你能用本地数据模拟表吗?使用aaData参数?
比照2013年

因此,我附上了屏幕截图,以便您可以猜测出问题所在。
kishore 2013年

cfs:您可以从屏幕截图中猜测吗?我还添加了数据表代码
kishore 2013年

Answers:


70

原因

您的表很可能最初是隐藏的,这阻止jQuery DataTables计算列宽。

  • 如果table在可折叠元素中,则当可折叠元素变为可见时,您需要调整标题。

    例如,对于Bootstrap Collapse插件:

    $('#myCollapsible').on('shown.bs.collapse', function () {
       $($.fn.dataTable.tables(true)).DataTable()
          .columns.adjust();
    });
    
  • 如果表格在标签中,则需要在标签可见时调整标题。

    例如,对于Bootstrap Tab插件:

    $('a[data-toggle="tab"]').on('shown.bs.tab', function(e){
       $($.fn.dataTable.tables(true)).DataTable()
          .columns.adjust();
    });
    

上面的代码调整页面上所有表的列宽。看到columns().adjust()更多信息,API方法。

响应式,滚动式或固定列扩展

如果您使用的是响应式,Scroller或FixedColumns扩展,则需要使用其他API方法来解决此问题。

链接

有关最初隐藏表时jQuery DataTables列中最常见问题的解决方案,请参见jQuery DataTables –具有Bootstrap选项卡的列宽问题


5
出色的答案,+ 1
NorCalKnockOut18年

这对我有用,非常感谢。===>如果表格在选项卡中,则需要在选项卡变为可见时调整标题。例如,对于Bootstrap Tab插件:$('a [data-toggle =“ tab”]')。on('shown.bs.tab',function(e){$($。fn.dataTable.tables(true ))。DataTable().columns.adjust();});
SENA

1
正是我想要的,scrolX: true标题的添加和宽度正在变成width: 0px,仅此而已,它在一个tab...里面!谢谢!
Juan

1
与标签插件斗争了几个小时之后,你的答案化险为夷,+1
阿尼尔

53

我用一个包裹“dataTable的”表解决了这个问题divoverflow:auto

.dataTables_scroll
{
    overflow:auto;
}

并在dataTable初始化后添加此JS :

jQuery('.dataTable').wrap('<div class="dataTables_scroll" />');

不要使用sScrollXsScrollY,请删除它们,然后div自己添加一个包装纸,这样做也可以。


您还需要添加position:relative,否则标题中的标签将保持固定,而无需跟随包装器的滚动。
alexroat 2014年

2
我尝试了10多个解决方案建议,但除此以外,它们都没有帮助我。谢谢!
Fatikhan Gasimov

我只是禁用sScrollX,sScrollY,然后它起作用了
Larry Cai

1
@LarryCai保存了这一天。尝试了很多事情和建议,我所要做的就是注释掉滚动条。谢谢。
NoBullMan

20

找到了解决方案:

添加table-layout:fixed到表中。并以IE模式打开应用程序。


您是说添加选项还是为类attr添加名称?
廖三Kai

8
@JaxSwagger-刚发出一条消息,说:“此页面使用了仅在IE中有效的损坏的插件。” lmao
Christine

你让我开心,非常感谢!和@Shaggy,只需添加浏览器检测即可;)
Ritooon


4

以上解决方案均不适用于我,但最终我找到了一个可行的解决方案。

我这个问题的版本是由第三方CSS文件引起的,该文件将“ box-sizing”设置为其他值。我可以使用以下代码解决此问题,而不会影响其他元素:

    $table.closest(".dataTables_wrapper").find("*").css("box-sizing","content-box").css("-moz-box-sizing","content-box");

希望这对某人有帮助!


但是我在使用iceweasel(firefox debianized)时遇到问题...与chrome完美搭配
tonjo 2015年

4

正如Gyrocode.com所说:“您的表很可能一开始就被隐藏了,这阻止了jQuery DataTables计算列宽。”

我也有这个问题,并在显示div后仅通过初始化dataTable来解决它

例如

$('#my_div').show();
$('#my_table').DataTable();

4

问题是在DOM上绘制数据表之前调用了数据表,请在调用数据表之前使用设置超时。

setTimeout(function(){ 
    var table = $('#exampleSummary').removeAttr('width').DataTable( {
        scrollY:        "300px",
        scrollX:        true,
        scrollCollapse: true,
        paging:         true,
        columnDefs: [
            { width: 200, targets: 0 }
        ],
        fixedColumns: false
    } );
}, 100);

3
$("#rates").dataTable({
"bPaginate": false,
"sScrollY": "250px",
"bAutoWidth": false,
"bScrollCollapse": true,
"bLengthChange": false,
"bFilter": false,
"sDom": '<"top">rt<"bottom"flp><"clear">',
"aoColumns": [{
        "bSortable": false
    },
    null,
    null,
    null,
    null
]}).fnAdjustColumnSizing( false );

尝试在数据表调用结束时调用fnAdjustColumSizing(false)。上面修改的代码。

列大小问题的讨论


1
如果那不能解决问题,那么您是否偶然有一些周围的CSS引起了问题。您可以禁用CSS并查看滚动和列宽是否按预期运行。
Mike Ramsey 2013年

1
@MikeRamsey。感谢线索fnAdjustColumnSizing(false);
斯科特,

3

确保表格宽度为100%

然后“ autoWidth”:true


3
为您的答案提供准确的代码是有益的。对于javascript / css答案,欢迎使用JSFiddle。
Suever,2016年

表格为truewidth: 100%时不执行任何操作autoWidth,它以行内设置像素宽度,有效地覆盖了100%规则。autoWidth可以单独解决问题,但是您不能拥有100%的宽度表,至少对我来说这是交易破坏者。
ruuter

有趣的是,宽度100%独自解决了我的问题,感谢您指出正确的方向!
Irfan

3

不需要提出各种拐杖,表格标题宽度与主体不对齐,因为由于表格没有足够的时间为此而填写数据,因此请执行setTimeout

   setTimeout(function() {
     //your datatable code 
  }, 1000);

谢谢你救了我!
Ganesh

1

通过链接Mike Ramsey的答案,我最终发现表在DOM加载之前已初始化。

为了解决这个问题,我将初始化函数放在以下位置:

document.addEventListener('DOMContentLoaded', function() {
    InitTables();
}, false);

1

以上解决方案都不适合我,因此我将发布解决方案:我将表加载到隐藏的div中,然后在构建表后显示div。当我首先显示/取消隐藏div,然后在可见表时构建表时,它起作用了。

因此,DataTables无法在隐藏的div中调整列的大小,这很可能是因为在隐藏表时,后端的列宽为0px。


1

只需将表标签元素包装在具有溢出自动和相对位置的div中即可。它将在chrome和IE8中运行。我添加了400px高度,以便即使重新加载数据后也能保持表格大小不变。

table = $('<table cellpadding="0" cellspacing="0" border="0" class="display" id="datat"></table>').appendTo('#candidati').dataTable({
        //"sScrollY": "400px",//NO MORE REQUIRED - SEE wrap BELOW
        //"sScrollX": "100%",//NO MORE REQUIRED - SEE wrap BELOW
        //"bScrollCollapse": true,//NO MORE REQUIRED - SEE wrap BELOW
        //"bScrollAutoCss": true,//NO MORE REQUIRED - SEE wrap BELOW
        "sAjaxSource": "datass.php",
        "aoColumns": colf,
        "bJQueryUI": true,
        "sPaginationType": "two_button",
        "bProcessing": true,
        "bJQueryUI":true,
        "bPaginate": true,
        "table-layout": "fixed",
        "fnServerData": function(sSource, aoData, fnCallback, oSettings) {
            aoData.push({"name": "filters", "value": $.toJSON(getSearchFilters())});//inserisce i filtri
            oSettings.jqXHR = $.ajax({
                "dataType": 'JSON',
                "type": "POST",
                "url": sSource,
                "data": aoData,
                "success": fnCallback
            });
        },
        "fnRowCallback": function(nRow, aData, iDisplayIndex) {
            $(nRow).click(function() {
                $(".row_selected").removeClass("row_selected");
                $(this).addClass("row_selected");
                //mostra il detaglio
                showDetail(aData.CandidateID);
            });
        },
        "fnDrawCallback": function(oSettings) {

        },
        "aaSorting": [[1, 'asc']]
}).wrap("<div style='position:relative;overflow:auto;height:400px;'/>"); //correzione per il disallineamento dello header

+ 1,因为它可以工作,但是并不能解决问题,因为我丢失了滚动到表底部的标题列。
Sydwell

1
我知道。实际上,我在一个小项目中保留了数据表,在该项目中,我必须保持固定的头部和可滚动的琴身。我必须创建自己的表和自定义js
alexroat,

1

使用这些命令

$('#rates').DataTable({
        "scrollX": true,
        "sScrollXInner": "100%",
    });

0

标头上的一些简单CSS可以为您完成此操作。

#rates_info, #rates_paginate
{
    float: left;
    width: 100%;
    text-align: center;
}

不能保证它会按原样工作,因为我没有看到您的html,但请尝试一下,如果没有,您可以发布您的html,我将对其进行更新。


您能否解释一下“#rates_info,#rates_paginate”是什么
kishore 2013年

它们是由数据表添加的页眉和页脚的ID。我遇到过这样的情况,将这些问题解决可以解决您遇到的问题。
chockleyc


0

我面临着同样的问题。我为dataTable添加了scrollX:true属性,它起作用了。无需更改数据表的CSS

jQuery('#myTable').DataTable({
                            "fixedHeader":true,
                            "scrollY":"450px",
                            "scrollX":true,
                            "paging":   false,
                            "ordering": false,
                            "info":     false,
                            "searching": false,
                            "scrollCollapse": true
                            });

2
当我添加"scrollX": true
Stephen

0

我知道这很老了,但是我遇到了问题,却没有找到好的解决方案。因此,我决定使用一些js来获取scrollBody的高度(与表格高度相比)。如果scrollBody小于表格,则我将表格宽度增加15px以解决滚动条。我也在resize事件上对此进行了设置,以便它在我的容器更改大小时起作用:

const tableHeight = $('#' + this.options.id).height();
const scrollBodyHeight = $('#' + this.options.id).closest('.dataTables_scrollBody').height();

if (tableHeight > scrollBodyHeight) {
    $('#' + this.options.id).closest('.dataTables_scrollBody').css({
        width: "calc(100% + 15px)",
    })
} else {
    $('#' + this.options.id).closest('.dataTables_scrollBody').css({
        width: "100%",
    })
}

0

$('。DataTables_sort_wrapper')。trigger(“ click”);


请使用4个空格/制表符缩进,以使您的代码的格式类似于代码块。也许您还应该注释您的代码,因为它尚不清楚与问题的关系,放置位置等。最好的问候
YakovL 2017年

0

不幸的是,这些解决方案都不适合我。也许由于表初始化的不同,我们得到了不同的结果。这些解决方案之一可能会为某人工作。无论如何,想分享我的解决方案,以防万一仍然有人对此问题感到困扰。不过,它有点黑,但是对我有用,因为以后我不会更改表格的宽度。

加载页面并单击标题后,它会展开并正常显示,然后检查表标题并记录.dataTables_scrollHeadInnerdiv的宽度。以我715px为例,例如。然后将该宽度添加到CSS:

.dataTables_scrollHeadInner
{
  width: 715px !important;
}


0

Gyrocode.com的问题答案是完全正确的,但他的解决方案并非在所有情况下都有效。一种更通用的方法是在document.ready函数之外添加以下内容:

$(document).on( 'init.dt', function ( e, settings ) {
    var api = new $.fn.dataTable.Api( settings );
    window.setTimeout(function () {
            api.table().columns.adjust().draw();
        },1);
} );

0

为容器表添加固定宽度

JS:

otableCorreo = $("#indexTablaEnvios").DataTable({                
    "fnInitComplete": function (oSettings, json) {
        $(otableCorreo.table().container()).addClass("tablaChildren");
    },
});

CSS:

.tablaChildren {
    width: 97%;
}

0

我有一个类似的问题。我将在可扩展/可折叠面板中创建表。只要表格可见,就没有问题。但是,如果您折叠面板,调整浏览器的大小,然后再展开,则问题就出在这里。每当此功能扩展面板时,我通过在面板标题的click函数中放置以下内容来修复该问题:

            // recalculate column widths, because they aren't recalculated when the table is hidden'
            $('.homeTable').DataTable()
                .columns.adjust()
                .responsive.recalc();

0

使用此方法:替换您的模式名称,清除数据表并加载

$('#modalCandidateAssessmentDetail').on('shown.bs.modal', function (e) {

});


0

我正在使用Bootstrap 4,并已将类添加table-sm到表中。那弄乱了格式。删除该类可以解决此问题。


如果您无法删除该类,我怀疑可以通过javascript将其添加到标头表中。scrollX启用后,数据表使用两个表来显示一个表-一个用于标题,一个用于主体。


0

我确实有这个问题一段时间了,我意识到我的桌子是在显示之前绘制的。

<div class="row">
    <div class="col-md-12" id="divResults">
    </div>
</div>        

function ShowResults(data) {
    $div.fadeOut('fast', function () {
        $div.html(data);
        // I used to call DataTable() here (there may be multiple tables in data)
        // each header's width was 0 and missaligned with the columns
        // the width woulld resize when I sorted a column or resized the window 
        // $div.find('table').DataTable(options);
        $div.fadeIn('fast', function () {
            Loading(false);
            $div.find('table').DataTable(options); // moved the call here and everything is now dandy!!!
        });
    });
}     
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.