导读:本期聚焦于剑客创作的《使用jQuery DataTable FixedColumns冻结表格左侧列并支持横向滚动,具体怎么做?》,敬请观看详情。表格数据列过多时,横向滚动会丢失列标题对应关系,影响数据阅读效率。jQuery DataTables 的 FixedColumns 扩展能在滚动过程中持续固定左侧列,让关键字段始终可见。不过很多开发者发现,插件和 scrollX 配合时总出现列宽错位或固定列失效的问题。这篇文章会从插件工作原理讲起,说明初始化配置中的关键参数,演示一段完整的可运行代码,分析常见报错原因,最后给出移动端适配建议,帮你彻底解决表格横向滚动的体验问题。

数据表格列数超过容器宽度时,横向滚动是最直接的展示方案,但滚动后首列脱离视口,用户根本无法判断当前行对应的是哪条数据。DataTables 生态里的 FixedColumns 扩展专门解决这类问题,它把左侧列从滚动区域中独立出来,在水平方向保持固定。实现思路并不复杂,但其中若干细节配置直接影响最终效果,值得展开讲讲。

使用jQuery DataTable FixedColumns冻结表格左侧列并支持横向滚动,具体怎么做?

FixedColumns 的工作原理与核心配置

FixedColumns 本质上是对 DataTables 主表格的视觉增强。它并不会改变原始表格的 DOM 结构,而是在主表格旁边生成一个或多个独立的表格副本,这些副本只包含需要固定的列,并通过对齐算法让固定列与主体表格的行高、列宽保持一致。当用户横向滚动主体表格时,固定列副本保持不动,视觉上就形成了列被冻结的效果。

这种方案的优点是原表格功能不受影响——排序、搜索、分页依然作用于主表格,FixedColumns 只负责外观层级的同步。代价是需要额外的 DOM 节点和样式计算,在数据量极大或列数极多时,同步开销会略有上升。理解这一点有助于我们判断什么时候需要调整配置,什么时候需要优化表格结构。

初始化时,FixedColumns 通过 fixedColumns 选项集成在 DataTables 配置中,核心参数是 leftColumns,用于指定左侧需要固定的列数。此外还有 rightColumns 控制右侧固定列数,以及 heightMatch 控制行高匹配策略。以下是一个基础配置示例:

$('#myTable').DataTable({
    scrollX: true,
    scrollY: 400,
    scrollCollapse: true,
    paging: false,
    fixedColumns: {
        leftColumns: 2,
        rightColumns: 0
    }
});

scrollX: true 是启用横向滚动的前提条件,没有这个配置,表格会尝试压缩列宽而不是产生滚动条。scrollCollapse: true 的作用是在表格实际宽度小于容器宽度时自动收缩滚动区域,避免出现无意义的空白滚动条。这两个配置通常需要搭配使用。

完整实现:固定左侧两列并横向滚动

为了演示完整效果,我们构建一个包含六列数据的表格,并将左侧两列固定。页面中需要依次引入 jQuery、DataTables 主库以及 FixedColumns 扩展。注意 DataTables 主库和 FixedColumns 的版本必须对应,否则可能出现方法不匹配的错误。

HTML 部分使用标准表格结构,thead 定义列头,tbody 填充数据。FixedColumns 对表格的 id 没有特殊要求,但表格必须已经是一个合法的 HTML 表格节点。以下为完整示例代码:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>FixedColumns 冻结列示例</title>
    <link rel="stylesheet" href="https://cdn.datatables.net/2.0.8/css/dataTables.dataTables.css">
    <link rel="stylesheet" href="https://cdn.datatables.net/fixedcolumns/5.0.0/css/fixedColumns.dataTables.css">
    <script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
    <script src="https://cdn.datatables.net/2.0.8/js/dataTables.js"></script>
    <script src="https://cdn.datatables.net/fixedcolumns/5.0.0/js/dataTables.fixedColumns.js"></script>
</head>
<body>
    <table id="demoTable" class="display" style="width:100%">
        <thead>
            <tr>
                <th>ID</th>
                <th>姓名</th>
                <th>部门</th>
                <th>岗位</th>
                <th>入职日期</th>
                <th>状态</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>1</td>
                <td>张伟</td>
                <td>技术部</td>
                <td>前端工程师</td>
                <td>2021-06-01</td>
                <td>在职</td>
            </tr>
            <tr>
                <td>2</td>
                <td>李娜</td>
                <td>产品部</td>
                <td>产品经理</td>
                <td>2020-03-15</td>
                <td>在职</td>
            </tr>
            <tr>
                <td>3</td>
                <td>王强</td>
                <td>设计部</td>
                <td>UI设计师</td>
                <td>2022-11-20</td>
                <td>试用期</td>
            </tr>
        </tbody>
    </table>

    <script>
        $(document).ready(function () {
            $('#demoTable').DataTable({
                scrollX: true,
                scrollY: 300,
                scrollCollapse: true,
                paging: false,
                fixedColumns: {
                    leftColumns: 2
                }
            });
        });
    </script>
</body>
</html>

这段代码运行时,表格宽度超过页面容器宽度时会出现横向滚动条,左侧的 ID 和姓名两列在滚动过程中始终保持可见。即便表格数据量增加、滚动范围变大,这两个列也会一直固定。滚动条出现在 DataTables 生成的滚动容器内,而不是浏览器窗口,这是 scrollX 的标准行为。

渲染完成后可以打开浏览器开发者工具检查 DOM 结构。会发现 DataTables 在原始表格之外生成了若干包裹节点,FixedColumns 插入了额外的表格用于渲染固定列。这些额外节点不需要手动干预,插件自身会同步列宽和行高。如果想确认固定列是否真的与主表格对齐,可以在不同屏幕宽度下缩放窗口观察。

常见坑点:列宽错位与固定列失效

列宽错位是 FixedColumns 使用中反馈最多的问题。表现为主表格列宽与固定列宽度不一致,固定列下方出现空白或挤压。最常见的原因是初始化时表格处于隐藏状态,例如放置在切换页签中,DataTables 无法在隐藏状态下正确计算列宽。解决办法是在表格显示后再调用 columns.adjust() 方法重新计算尺寸。

另一个容易忽略的问题是固定列必须设定明确的宽度。如果表格使用 autoWidth 自动计算列宽,在部分浏览器中固定列副本获取到的宽度可能与主表格不一致。更稳妥的做法是给需要固定的列直接设置 width 属性,或者在 DataTables 的 columnDefs 中指定宽度。例如:

$('#demoTable').DataTable({
    scrollX: true,
    fixedColumns: {
        leftColumns: 2
    },
    columnDefs: [
        { targets: 0, width: '80px' },
        { targets: 1, width: '120px' }
    ],
    autoWidth: false
});

设置了 autoWidth: false 之后,浏览器不再强制均分列宽,固定列副本能更准确地复制主表格的列宽设定。对于动态渲染数据的场景,如果修改了表格数据或列配置,需要调用 fixedColumns().relayout() 方法让插件重新计算布局。这个方法在 DataTables 1.10 以上的版本中均可使用。

还有一类问题表现为固定列不生效,即横向滚动时所有列都跟着滚动。排查时先确认脚本引入顺序是否正确。FixedColumns 是独立扩展,必须先加载 DataTables 主库,再加载 FixedColumns 脚本。同时检查初始化配置中是否误将 fixedColumns 写成了 fixedcolumn,这类大小写错误浏览器不会报错,但插件不会被激活。

如果把表格放在 CSS 的 overflow: hidden 容器中,滚动事件可能无法正确触发,FixedColumns 的同步机制也会受到干扰。确保表格的滚动容器是 DataTables 自己生成的那个 div,不要让外层父元素同时设置 overflow 属性。如果必须嵌套在特定布局中,可以用 CSS 将外层 overflow 设置为 visible 来规避。

动态数据与响应式布局的适配策略

Ajax 数据源加载完成后再初始化 FixedColumns 会遇到一个时序问题:数据到达时表格列宽尚未稳定,固定列可能无法对齐。解决思路是在数据加载完成后的回调函数中主动触发一次布局刷新。DataTables 提供了 initComplete 回调,这里是最稳妥的时机。

$('#demoTable').DataTable({
    processing: true,
    serverSide: true,
    ajax: {
        url: '/api/data',
        type: 'POST'
    },
    scrollX: true,
    fixedColumns: {
        leftColumns: 1
    },
    initComplete: function () {
        this.api().columns.adjust();
    }
});

使用 serverSide 模式时,每次翻页或搜索都会重新加载数据,固定列可能出现短暂的样式跳动。这种情况建议在 drawCallback 中调用 fixedColumns().relayout(),确保每次数据重绘后固定列位置正确。如果数据量很大,可以适当增加 scrollY 高度并开启 deferRender 选项,减少初始渲染开销。

移动端适配时,固定列数不宜过多。手机屏幕宽度通常在 375 到 430 像素之间,固定两列后留给滚动区域的空间非常有限,用户每次滑动只能看到一列半的数据。根据实际业务场景,移动端固定一列就足够了。还可以结合 responsive 扩展来控制不同断点下哪些列显示哪些列隐藏,避免横向滚动距离过长。

对于列数特别多的情况,比如超过 15 列的宽表,建议为每个固定列设置合理的 min-width,防止内容过于拥挤。同时要检查 FixedColumns 生成的克隆表格是否会遮挡主体表格的排序图标,必要时通过 CSS 调整克隆表格的 z-index 层级。

与 DataTables 其他扩展的兼容性处理

FixedColumns 经常和 Buttons、Select、RowGroup 等扩展同时使用。与 Buttons 配合时,按钮工具栏默认插入在表格上方,不会影响固定列的布局。但如果启用了 fixedHeader,情况会复杂一些——固定表头和固定列同时工作时,需要保证两者的 z-index 值正确。FixedColumns 的克隆表格 z-index 默认较低,可能导致表头盖住固定列内容。

比较常见的解决方案是调整 CSS 优先级。DataTables 官方给出的参考值为:固定表头 z-index 为 3,FixedColumns 左侧固定列 z-index 为 2,主体表格 z-index 为 1。如果默认样式被覆盖,可以在自定义样式中明确指定这些层级关系。需要留意的是,z-index 修改要精确到 FixedColumns 生成的特定类名,随意提升层级可能引发其他元素遮挡问题。

Select 扩展允许用户点击行选中数据,启用后固定列区域同样可以触发选中事件。这是因为 FixedColumns 在生成克隆表格时复制了行结构,但事件监听仍然委托给 DataTables 主表格。如果发现固定列点击选中行为异常,优先检查是否在初始化后被其他脚本移除了事件委托。

RowGroup 扩展将行按指定字段分组,分组行会插入到表格数据中。此时固定列和分组行的对齐要求更高,建议先初始化 RowGroup 再初始化 FixedColumns,并调用一次 columns.adjust() 确保分组行渲染后列宽依然正确。如果分组数据动态更新,更新完成后同样需要重新调整布局。

性能优化与备选方案对比

FixedColumns 在表格行数非常多时可能产生渲染压力,因为每个固定列都对应一份完整的 DOM 克隆。一张 5000 行的表格,固定两列意味着额外渲染 10000 个单元格,这个开销不可忽视。页面出现明显卡顿或滚动不流畅时,建议开启 DataTables 的 deferRender 选项,它让 DataTables 只渲染视口内的行,滚动时再动态生成剩余行,能显著减少初始渲染耗时。

$('#demoTable').DataTable({
    deferRender: true,
    scrollX: true,
    scrollY: 400,
    scroller: true,
    fixedColumns: {
        leftColumns: 1
    }
});

scroller 扩展配合 deferRender 使用,滚动时按需渲染行数据,内存占用和 DOM 节点数量都维持在较低水平。但注意 scrollerscrollY 必须同时设置,否则无法启用虚拟滚动机制。如果数据量超过 5 万行,虚拟滚动是不可或缺的优化手段。

除了 DataTables 生态内部的优化,也可以评估一下是否必须使用 FixedColumns。如果项目已经引入了其他 UI 框架如 Element Plus 或 Ant Design,它们的表格组件原生支持固定列功能。对于新项目而言,选择框架自带的表格方案往往比 DataTables 加插件组合更轻量。但对于存量系统或依赖 DataTables 丰富扩展能力的场景,FixedColumns 依然是最成熟的解决方案。

从实际维护角度看,FixedColumns 版本升级比较频繁,跟随 DataTables 主版本迭代。升级后注意检查样式文件是否同步更新,因为克隆表格的类名和布局算法可能发生变化。建议在升级计划中预留固定列功能回归测试的时间,避免样式错乱影响业务。

回到最初的场景:表格列多导致横向滚动,FixedColumns 让关键列始终可见。掌握初始化配置、列宽调整、动态刷新这几个要点,就能稳定实现预期效果。遇到列宽错位时优先考虑表格初始化时序和宽度设置,遇到性能瓶颈时借助虚拟滚动优化渲染。数据展示的本质是帮助用户快速定位信息,固定列只是手段,让表格在各类设备上都有清晰可读的呈现,才是最终目标。

实际项目中,可以将这套方案封装成一个通用的表格初始化函数,统一处理 scrollX、fixedColumns 和响应式参数,减少重复代码。遇到特殊的布局需求时,再基于这个基础函数扩展个性化配置,同时保证了维护效率与功能的统一性。

jQueryDataTableFixedColumns横向滚动修改时间:2026-08-19 08:00:33

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。