1. Linux

原生H5 table 固定列

需求:使用原生H5 table 标签,完成固定两列且支持横向滚动的表格。

其中红色框出的区域是需要固定的列,绿色框出的区域是动态可横向滚动的多个列。

<style scoped>
table {
  border-collapse: separate;
  border-spacing: 0;
  width: 100%;
  table-layout: fixed
}
th, td {
  border: 1px solid #999;
  padding: 8px;
  text-align: center;
}
th {
  background-color: #f2f2f2;
}
.scrollable {
  overflow-x: auto;
}
.sticky-th-1 {
  position: sticky;
  background-color: #f2f2f2;
  z-index: 10;
  left: 0;
}
.sticky-th-2 {
  position: sticky;
  background-color: #f2f2f2;
  z-index: 9;
  left: 50px;
}

.sticky-td-1 {
  position: sticky;
  background-color: white;
  z-index: 8;
  left: 0;
}
.sticky-td-2 {
  position: sticky;
  background-color: white;
  z-index: 7;
  left: 50px;
}
.sticky-td-3 {
  position: sticky;
  background-color: white;
  z-index: 6;
  left: 200px;
}

</style>

将table包裹于div中,且该div class为scrollable,由于需要固定两列,且第二列除第一行外又分为两个子列,所以这里我们根据表头里指定的固定宽度(width)设置了多个sticky-tdsticky-th

border-collapse: separate;

separate 模式下,每个 <td><th> 的边框是“自己独立拥有”的;相邻单元格之间不再“共用一条边框”,而是靠 border-spacing 控制间距;border-spacing: 0 保证视觉上仍然是无间隙紧贴,但边框仍是独立渲染的;sticky 的单元格此时拥有完整的四个边框,不受“边框合并”的影响;所以,sticky 列的右侧边框能够正常渲染出来,不会因为 sticky 或滚动而“消失”。