Live2D

表格冻结案例及问题

  1. table tr 中的th 与td 在列数较多时,无法设置宽度,原因display:table-block。
  • 解决方案:内部设置span行内标签,撑开td的宽度;
  1. 冻结列的问题。
  • 超出页面显示可视区域,后层冻结的数据列会覆盖到前面已冻结的数据列的上方。
  • 冻结列的问题出现原因:
    • position:sticky;导致粘在了页面的固定某个位置。
    • 滚动时超出页面的数据列,会依次往前推。
  • 解决思路:
    • 使用z-index冻结的数据列显示在上层。
    • 使用z-index冻结的冻结列中的最后一列,将数据列显示在下方。
  • 解决思路2:
    • 超出可视区与的数据列,本身就不需要显示,直接将滚动按钮给禁止即可。
  1. 运行效果:
  1. 代码:未修改版本:
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<style>
  .box{
      width: 800px; 
      /* 修改盒子的宽度模拟冻结的列,是否超出显示范围 */
      height: 300px;
      overflow: auto; 
  }
  table{ 
      width: 100%; 
      height: 100%;
      /* 必须设置table的宽度 */
      border-collapse: collapse;
      /* 清除额外的空间计算错误问题 */
      border-spacing:0;
      /* box-sizing: border-box; */
  }
  /* 首行固定:选中整行,如果选中行内部的单元格层级问题覆盖错位!!!! */
  thead tr {
      position: sticky;
      top: 0;
      z-index: 99;
      /* 首行的层级确保最高 */
      background-color: #ddd;
      height: 60px;
  }
  /* 首列固定:选中首列所有的单元格 */
  tr th:first-child,tr td:first-child{
      /* position: sticky;
      left: 0; */
      background-color: #d3eff4;
  }       
   /* 基本参数设置  */
  th,td{
      text-align: center;
      border: 1px solid #575656;
  }
  /* 单元格的内部参数模拟 */
  tr td span{
      display: inline-block;
      width: 146px;
      height: 100px;
  }
  /* 冻结第一列 */
  tr th:nth-child(1),tr td:nth-child(1){
      position: sticky;
      left: 0;
      background-color: pink;
      z-index: 98;
  }
  /* 冻结第二列 */
  tr th:nth-child(2),tr td:nth-child(2){
      position: sticky;
      left: 150px;
      /* 第二列的冻结修改left的距离,三四列以此类推!!! */
      background-color: pink;
      z-index: 98;
  }
  /* 冻结第三列 */
  tr th:nth-child(3),tr td:nth-child(3){
      position: sticky;
      left: 300px;
      background-color: pink;
      z-index: 98;
  }
      /* 冻结第四列 */
  tr th:nth-child(4),tr td:nth-child(4){
      position: sticky;
      left: 450px;
      background-color: pink;
      z-index: 97;
      /* 最后冻结的一列修改层级低于前几列冻结,让滚动的显示在下方而不是遮盖在上方 */
  }
  /* 总结: */
  /* 1. 被冻结的层级可设置为相同
     2. 首行的层级为最高;
     3. 首行选中的整行,而非内部的单元格
     4. 表格宽度较小时,横向拖动,最后一列会略微移动*/
</style>
<body>
  <div class="box">
      <table id="input">
          <thead>
              <tr>
                  <th>首列标题</th>
                  <th>我们是标题1</th>
                  <th>我们是标题2</th>
                  <th>我们是标题3</th>
                  <th>我们是标题4</th>
                  <th>我们是标题5</th>
                  <th>我们是标题6</th>
              </tr>
          </thead>
          <tbody>
              <tr>
                  <td><span>首列</span></td>
                  <td><span>单元格内容</span></td>
                  <td><span>单元格内容</span></td>
                  <td><span>单元格内容</span></td>
                  <td><span>单元格内容</span></td>
                  <td><span>单元格内容</span></td>
                  <td><span>单元格内容</span></td>
              </tr>
              <tr>
                  <td><span>首列</span></td>
                  <td><span>单元格内容</span></td>
                  <td><span>单元格内容</span></td>
                  <td><span>单元格内容</span></td>
                  <td><span>单元格内容</span></td>
                  <td><span>单元格内容</span></td>
                  <td><span>单元格内容</span></td>
              </tr>
              <tr>
                  <td><span>首列</span></td>
                  <td><span>单元格内容</span></td>
                  <td><span>单元格内容</span></td>
                  <td><span>单元格内容</span></td>
                  <td><span>单元格内容</span></td>
                  <td><span>单元格内容</span></td>
                  <td><span>单元格内容</span></td>
              </tr>
              <tr>
                  <td><span>首列</span></td>
                  <td><span>单元格内容</span></td>
                  <td><span>单元格内容</span></td>
                  <td><span>单元格内容</span></td>
                  <td><span>单元格内容</span></td>
                  <td><span>单元格内容</span></td>
                  <td><span>单元格内容</span></td>
              </tr>
              <tr>
                  <td><span>首列</span></td>
                  <td><span>单元格内容</span></td>
                  <td><span>单元格内容</span></td>
                  <td><span>单元格内容</span></td>
                  <td><span>单元格内容</span></td>
                  <td><span>单元格内容</span></td>
                  <td><span>单元格内容</span></td>
              </tr>
          </tbody>
      </table>
  </div>
</body>
<script>
  const box=document.getElementById('box');
  box.addEventListener('scroll',()=>{
  let left = document.documentElement.scrollLeft
  console.log(left);

  })
</script>
</html>
posted @ 2024-11-05 17:55  Saturday_to_Monday  阅读(12)  评论(0编辑  收藏  举报