实现表格第一列固定

19 篇文章 0 订阅

背景

(1) 需求

固定表格的第一列,其余列可以左右滑动。这样的需求往往出现在移动端的表格显示。

(2) 难点

这个功能的难点在于:如果把第一列从表格中抽出,行无法对齐。

(3) 已有解决方案

网上有很多解决方案:

  • 固定表格高度,只能显示一列。将第一列抽出固定在最左。
  • js动态计算各高度

对于这些方案要不过于繁琐复杂,要不单行显示不利于用户体验。

实现

对于这样的问题,我希望用最简单的方式去解决,避免过多的性能消耗,也更利于维护。

(1) 实现思路

渲染两个表格,其中一个绝对定位覆盖在另外一个表格上并隐藏非第一列。

(2) 缺点

表格html内容渲染了两次。

(3) demo

这里写图片描述

table{border-bottom: solid 1px black;  border-left: solid 1px black;}
td { border-right: solid 1px black;  border-top: solid 1px black; padding: 10px;}

.container{  position: relative;}

.table1-container, .table2-container{ width: 220px; }

.table1-container{ position: absolute; left: 0; top: 0; overflow: hidden; color: red;}
.table1-container td:first-child{ background-color: white;}
.table1-container td:not(:first-child){ visibility: hidden;}

.table2-container{overflow: scroll;}
<div class='container'>
  <div  class="table1-container">
    <table  border=0 cellpadding="0" cellspacing="0" >
    <tr>
      <td>1-1</td>
      <td>1-2</td>
      <td>1-3</td>
      <td>1-4</td>
      <td>1-5</td>
      <td>1-6</td>
      <td>1-7</td>
      <td>1-8</td>
    </tr>
     <tr>
      <td>2-1</td>
      <td>2-2</td>
      <td>2-3</td>
      <td>2-4</td>
      <td>2-5</td>
      <td>2-6</td>
      <td>2-7</td>
      <td>2-8</td>
    </tr>
     <tr>
      <td>3-1</td>
      <td>3-2</td>
      <td>3-3</td>
      <td>3-4</td>
      <td>3-5</td>
      <td>3-6</td>
      <td>3-7</td>
      <td>3-8</td>
    </tr>
    <tr>
      <td>4-1</td>
      <td>4-2</td>
      <td>4-3</td>
      <td>4-4</td>
      <td>4-5</td>
      <td>4-6</td>
      <td>4-7</td>
      <td>4-8</td>
    </tr>
  </table>
</div>
<div class="table2-container">
  <table   border=0 cellpadding="0" cellspacing="0" >
    <tr>
      <td>1-1</td>
      <td>1-2</td>
      <td>1-3</td>
      <td>1-4</td>
      <td>1-5</td>
      <td>1-6</td>
      <td>1-7</td>
      <td>1-8</td>
    </tr>
     <tr>
      <td>2-1</td>
      <td>2-2</td>
      <td>2-3</td>
      <td>2-4</td>
      <td>2-5</td>
      <td>2-6</td>
      <td>2-7</td>
      <td>2-8</td>
    </tr>
     <tr>
      <td>3-1</td>
      <td>3-2</td>
      <td>3-3</td>
      <td>3-4</td>
      <td>3-5</td>
      <td>3-6</td>
      <td>3-7</td>
      <td>3-8</td>
    </tr>
    <tr>
      <td>4-1</td>
      <td>4-2</td>
      <td>4-3</td>
      <td>4-4</td>
      <td>4-5</td>
      <td>4-6</td>
      <td>4-7</td>
      <td>4-8</td>
    </tr>
  </table>
  </div>
</div>

完整demo: https://jsfiddle.net/9hdLarfj/

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
您可以通过CSS的`position`属性和`z-index`属性来实现表格第一列固定不动。具体实现步骤如下: 1. 在表格的`<thead>`和`<tbody>`标签中分别为第一列添加一个`<th>`和`<td>`标签,并设置相应的样式。 ``` <table> <thead> <tr> <th>固定</th> <th>1</th> <th>2</th> <th>3</th> </tr> </thead> <tbody> <tr> <td>固定</td> <td>内容1</td> <td>内容2</td> <td>内容3</td> </tr> <tr> <td>固定</td> <td>内容4</td> <td>内容5</td> <td>内容6</td> </tr> ... </tbody> </table> ``` 2. 为表格的`<thead>`标签和`<tbody>`标签设置`display: block`属性,并设置表格的宽度和高度。 ``` thead, tbody { display: block; width: 100%; height: 200px; } ``` 3. 为表格的`<tbody>`标签设置`overflow-y: scroll`属性,使其在纵向滚动时出现滚动条。 ``` tbody { overflow-y: scroll; } ``` 4. 为表格第一列`<th>`和`<td>`标签设置`position: sticky`属性和`left: 0`属性,使其固定在左侧。 ``` th:first-child, td:first-child { position: sticky; left: 0; z-index: 1; background-color: #fff; } ``` 这样就可以实现表格第一列固定不动了。完整的代码如下所示: ``` <style> table { border-collapse: collapse; width: 100%; } th, td { border: 1px solid #ddd; padding: 8px; text-align: left; } th:first-child, td:first-child { position: sticky; left: 0; z-index: 1; background-color: #fff; } thead, tbody { display: block; width: 100%; height: 200px; } tbody { overflow-y: scroll; } </style> <table> <thead> <tr> <th>固定</th> <th>1</th> <th>2</th> <th>3</th> </tr> </thead> <tbody> <tr> <td>固定</td> <td>内容1</td> <td>内容2</td> <td>内容3</td> </tr> <tr> <td>固定</td> <td>内容4</td> <td>内容5</td> <td>内容6</td> </tr> ... </tbody> </table> ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值