使用“scrollY”时无法让 DataTables 标题行对齐

Posted

技术标签:

【中文标题】使用“scrollY”时无法让 DataTables 标题行对齐【英文标题】:Unable to get DataTables header row to line up when using `scrollY` 【发布时间】:2022-01-02 01:02:01 【问题描述】:

使用scrollY 时,DataTable 标头未对齐。我不确定它为什么这样做。

这是一个最小的工作示例。

var dataSet = [
    
        "id" : "001",
        "name" : "first last",
        "age" : "123"
    ,
];

function doIt()

    // just to create some dummy rows
    for(var i = 0; i < 10; ++i)
    
        dataSet = dataSet.concat(dataSet);
    
    tbl = $('#userStories').DataTable(
        data: dataSet,
        columns: [
            
                title: "ID",
                data: "id"
            ,
            
                title: "Name",
                data: "name"
            ,
            
                title: "Age",
                data: "age"
            
        ],
        scrollY: "300px",
        scrollCollapse: true,
        paging: false,
        info: true,
    );


$(document).ready(doIt);
/* can't change these - start */
body>div 
    margin: 5px;
    padding: 5px 0;
    border-bottom: 1px solid black;

table 
    width: 100%;

table,
th,
td 
    border: 1px solid black;
    border-collapse: collapse;


th+th+th 
    width: 100%


textarea 
    width: 95%;
    height: 100px;
    background-color: #ffdddd;


input[type='button'],
input[type='submit'] 
    background-color: #ddddff;

/* can't change these - end*/
<html>
    <head>
        <link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/1.11.3/css/jquery.dataTables.min.css">
        <script src="https://code.jquery.com/jquery-3.6.0.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"></script>
        <script type="text/javascript" charset="utf8" src="https://cdn.datatables.net/1.11.3/js/jquery.dataTables.min.js"></script>
    </head>
    <body>
        <div>select:<br><br><br>
            <div id="userStoriesWrapper">
                <table id="userStories" class="display" style="width:100%">
            </div>
        </div>
    </body>
</html>

【问题讨论】:

【参考方案1】:
.dataTables_scrollHeadInner 
    padding-left: 0px!important;

这可能是https://cdn.datatables.net/1.11.3/js/jquery.dataTables.min.js 中的一个错误

显然该元素以某种方式结束: padding-left: 17px;

这可能与滚动条有关。

【讨论】:

这很好用。谢谢! 我赞成你的回答——但我不认为这是一个 DataTables 错误。在这种情况下,DataTables 需要调整其表头,因为表头是与包含正文的表分开的表(用于处理滚动)。因此,外部样式可以很容易地干扰这种结构(在这种情况下有很多关于未对齐标题的问题 - 通常是由于其他样式导致问题)。【参考方案2】:

body&gt;div 样式干扰了 DataTable 的 &lt;div&gt; 元素,它创建并使用它来包装其表头。

您可以通过暂时注释掉您样式中的body&gt;div 部分来亲自查看这一点。您还将看到 DataTables 添加了一个17px 填充来调整标题以允许表格主体滚动条的宽度。

在问题中,它提到了can't change these - 在这种情况下,您可以通过添加以下 CSS 覆盖有问题的样式来强制解决问题:

div.dataTables_scrollHeadInner 
    padding-left: 0 !important;

使用!important 是最后的手段 - 它可能会在其他地方引起问题(尽管我知道在您的情况下它是否可以接受)。

理想情况下,最好将类名添加到您需要调整的&lt;div&gt; 元素,而不是使用一揽子body &gt; div 选择器,然后相应地更改样式表(一个不能改变的:-)。

【讨论】:

这行得通。谢谢你的解释!

以上是关于使用“scrollY”时无法让 DataTables 标题行对齐的主要内容,如果未能解决你的问题,请参考以下文章

JQuery DataTable 标头未与 ScrollY 和服务器端处理对齐

使用 Google Chrome 启用 scrollX 或 scrollY 时,数据表中出现重复的空标题

Jquery DataTable列顺序未与固定标题对齐[重复]

无法重新初始化 JQuery DataTable

如何在引导数据表(具有固定列)中使用 select2?

使用 ScrollY 时数据表标题的对齐问题