Skip to main content

Command Palette

Search for a command to run...

冻结HTML Table,固定表格特定行列,固定行首列首

Published
1 min read
冻结HTML Table,固定表格特定行列,固定行首列首
C

a full stack developer with .NET/Python/Web

当表格行列数较多时,为了用户在屏幕内容滚动时更加方便的查看数据,我们期望可以像Excel一样冻结表格的固定行和列(一般为表头和列头),遗憾的是HTML中并没有这种效果,那让我们来动手开发吧,Let’s do it!

实现表格行列冻结效果,网上较多采用以下两种方式:

  • 通过多个表格拼接层叠,Js控制多个表格间的联动。这种方式逻辑简单,容易实现,但代码冗余,难以维护,灵活性不好,适合简单场景下使用。
  • 通过创建多个div,div之间通过css实现层叠,每个div放置当前表格的克隆。例如:需要行冻结时,创建存放冻结行表格的div,通过设置z-index属性和position属性,让冻结行表格在数据表格的上层。同理,需要列冻结时,创建存放冻结列表格的div,并放置在数据表格的上层。如果需要行列都冻结时,则除了创建冻结行、冻结列表格的div,还需要创建左上角的固定行列表格的div,并放置在所有div的最上层。 这种方式与第一种思路类似,只是实现冻结部分是动态创建,这种方式可维护性比第一种略好。

1. 表格层叠

1.1 冻结某一行(列)

(1) 把看起来是一个整体的表格拆分成两部分,table1负责固定部分如thead,而table2负责可以拖动的部分如tbody

冻结行/列

<div class="table-out">
    <div class="table-top">
        <table>
            <thead>
                <tr><th>姓名</th><th>学号</th><th>年龄</th></tr>
            </thead>
        </table>
    </div>
    <div class="table-main">
        <table>
            <tbody>
                <tr><td>张三</td><td>001</td><td>17</td></tr> 
                <tr><td>李四</td><td>002</td><td>18</td></tr> 
            </tbody>     
        </table>                
    </div>
</div>

(2) 把两个table固定好了之后,监听table2的滚动,用table2的滚动带动table1的滚动(通过设置css里的left 或者 scroll,如果是绝对定位那么只能用设定css中left的方法)

$('.table-main').scroll(function() {
    var scrollLeft = $(this).scrollLeft();
    $('.table-top').scrollLeft(scrollLeft);
});

1.2 同时冻结行和列

(1) 把看起来是一个整体的表格拆分成四个部分

冻结行列

<div class="table-out">
    <!--固定行-->
    <div class="table-top">
        <table>
            <thead>
                <tr>
                    <th>零件名称</th>
                    <th>换件日期</th>
                    <th>寿命比例</th>
                </tr>
            </thead>
        </table>
    </div>
    <!--内容-->
    <div class="table-main">
        <table>
            <tbody>
                <tr>
                    <td>电机</td>
                    <td>2015-08-25</td>
                    <td>
                        <progress value="0.6"></progress>
                    </td>
                </tr>
                <tr>
                    <td>蝶型弹簧</td>
                    <td>2015-08-25</td>
                    <td>
                        <progress value="0.4"></progress>
                    </td>
                </tr>
            </tbody>
        </table>
    </div>
    <!--固定列-->
    <div class="table-left">
        <table>
            <tbody>
                <tr><td>电机</td></tr>
                <tr><td>蝶型弹簧</td></tr>
            </tbody>
        </table>
    </div>
    <!--左上角交叉区-->
    <div class="table-left-top">
        <table>
            <thead>
                <tr>
                    <th>备件名称</th>
                </tr>
            </thead>
        </table>
    </div>
</div>

(2) 把四个table固定好了之后,监听table-main的滚动,用table-main的滚动带动table-top的左右移动和table-left的上下移动。在这个示例里,我对table-left用到了绝对定位,所以给table-left设定scroll无效,但是可以使用改变table-left的css中top的属性值来使得table-left上下移动

var tb=$('.table-out');
var tbLeft=tb.children('.table-left');
var tbTop=tb.children('.table-top');
var tbMain=tb.children('.table-main');

var leftTop = parseInt(tbLeft.css('top'));
tbMain.scroll(function() {        
    tbLeft.css('top',leftTop - tbMain.scrollTop()+'px');
    tbTop.scrollLeft(tbMain.scrollLeft());
});

2. SuperTable(动态创建表格)

手动拼接表格的方式会在Html中存在较多冗余代码,表格结构维护起来比较繁琐,我们可以通过js读取html中表格结构然后动态创建div或table来完成层叠拼接工作,这样一来我们可以简单的在html中维护一份table的干净代码即可。

原理与前面相同,代码比较简单,这里我们不再赘述。

动态创建表格.gif

More from this blog

硬核Clash 配置教程,终极分流规则防配置覆盖

最近发现使用香港代理访问new bing貌似被封禁了,于是就要修改一下家里软路由的代理分流规则,因为手上的主力机是MacBook,好用的代理软件最常用的也是Clash X,那索性就一起搞了,正好有小伙伴问我想自定义Clash的分流规则,网上查了资料改是改了,结果一更新订阅链接,自己的辛辛苦亏写的配置就被无情的覆盖了,问我怎么避免这个问题。那就借此机会简单整理一个硬核一点的教程吧。 https://youtu.be/E86j-EwWKuM 很多同学看到一大坨的配置文件就头疼,其实大可不必,Cl...

Apr 29, 20234 min read71K
硬核Clash 配置教程,终极分流规则防配置覆盖

2023最新iPhone刷运动步数教程(非小米运动)

在现代社会,我们的生活方式越来越习惯于久坐不动,这对于我们的健康非常不利。而步数是衡量我们运动量的一种重要指标,为了更好地掌握自己的运动状态,很多人都在寻找一些方法来刷步数。 https://youtu.be/wR333Zn91rw 本文将介绍如何使用iPhone刷运动步数的方法。关于这个话题网络上的提供的方法大多都是使用小米运动(zeep life)APP,通过相关网站或者一些爱好者开发的应用程序(本质上都是通过发送API请求)修改其运动步数,然后再同步到iOS系统中进而修改iPhone中...

Apr 20, 20231 min read5.0K
2023最新iPhone刷运动步数教程(非小米运动)

Google Voice简单保号教程

Google Voice 是由 Google 提供的一项语音通信服务,它允许用户使用一个电话号码来接收和发送电话、短信和语音邮件等信息。Google Voice 提供了许多方便实用的功能,例如语音信箱转录、呼叫转移、呼叫筛选、呼叫记录等,同时还提供了许多免费或低成本的通信服务选项,例如国际长途、语音会议和互联网电话等。此外,Google Voice 还可以通过桌面和移动应用程序进行访问和管理,使其非常易于使用和管理。 Google Voice 有以下主要的优点: 一号多用:用户可以将自己的 G...

Apr 16, 20231 min read1.2K
Google Voice简单保号教程

加速阿里云服务器文件上传下载

在系统规模不大的情况下我们经常会将所有系统服务部署在一台服务器上,此时就经常需要在本地与服务器之间互传文件,如,下载服务器端程序运行日志,本地上传Docker镜像文件到服务器端等。 如果是较小的文件传输我们可以使用scp命令或搭建FTP服务使用各种FTP命令或工具进行文件传输,但如果传输文件较大时,将占用大量服务器带宽,且传输速度往往也被约束。下面笔者通过FTP下载阿里云VPS上一个1.78G的示例文件,下载速度仅有1.4M/s,耗时约25分钟。 类似于阿里云等知名服务器提供商除了提供基础的V...

Feb 3, 20231 min read174
加速阿里云服务器文件上传下载
A

A Nomad

29 posts

just a soul nomad