具有固定列和标题的可滚动表格,具有现代CSS

如何使用现代CSS尽可能少使用JavaScript?

我想要的功能是:

  • 固定柱(定位和宽度)
  • 可在X和Y轴上滚动
  • 在X轴响应(对于非固定宽度的列)。
  • 在这里输入图像描述

    注意:我确实看到并分析了一些最流行/见过的问题和答案,就像这里和这里一样。

    我知道这可以通过用于滚动的JavaScript事件处理程序完成,以便固定列可以向下/向上移动以跟随主列。 我试图构建的功能(但大量脚本化)的例子可能是这样的。 我们还可以将父元素中的MutationObserver添加到表中以检测大小更改并再次计算表的大小。 但是这在性能上是昂贵的,而且由于CSS也在不断发展和现代化,我想知道是否有新的方法......

    有没有2017/2018这个只有CSS或尽可能少的JS开销的解决方案?

    我想避免必须实现这样简单的JavaScript解决方案:

    在这里输入图像描述

    我的想法:

    a) :使用position: fixed; 在固定的列中

    问题:

  • <td>元素高度必须由JavaScript定义或计算。
  • 一个滚动事件监听器是需要的,我们需要以编程方式滚动固定列
  • b) :使用div来“伪造”左栏,并在表格中包含可滚动内容

    问题:

  • div高度必须与表格行高度同步
  • 由于固定的“假”列不再是表格语法,HTML语义丢失了
  • c) :使用N个表格只显示每个表格的一部分,因此我可以使用HTML标记但保留固定的标题/列。

    问题:

  • 重复的HTML x N
  • 必须同步大小并使用JavaScript进行滚动

  • 使用滚动事件侦听器和固定的左列,我们可以像这样使用JavaScript:

    const firstColumn = [...document.querySelectorAll('table tr > *:first-of-type')];
    const tableContainer = document.querySelector('.table-container');
    tableContainer.addEventListener('scroll', function() {
        const currentScrollPosition = this.scrollTop * -1;
    	firstColumn.forEach(el => el.style.marginTop = currentScrollPosition + 'px');
    });
    .table-container {
        width: 600px;
        height: 300px;
        overflow-x: scroll;
        overflow-y: scroll;
    }
    
    .table-scroller {
        width: 1000px;
    }
    
    table {
        width: 100%;
        margin-left: -13px;
        table-layout: fixed;
        border-collapse: collapse;
        border: none;
    }
    
    table th,
    table td {
        padding: 0.8em;
        border: 1px solid;
        background-color: #eeeeef;
    }
    
    table th {
        background-color: #6699FF;
        font-weight: bold;
    }
    
    table tr {
        height: 60px;
        vertical-align: middle;
    }
    
    table tr > *:first-of-type {
        position: fixed;
        width: 50px;
        margin-left: 13px;
        margin-top: 0;
        height: inherit;
    }
    <div class="table-container">
        <div class="table-scroller">
            <table>
                <tbody>
                    <tr>
                        <td>Edrward 0</td>
                        <td>32</td>
                        <td>London Park no. 0</td>
                        <td>London Park no. 0</td>
                        <td>London Park no. 0</td>
                        <td>London Park no. 0</td>
                        <td>London Park no. 0</td>
                        <td>London Park no. 0</td>
                        <td>London Park no. 0</td>
                        <td>London Park no. 0</td>
                        <td><a href="#">action</a></td>
                    </tr>
                    <tr>
                        <td>Edrward 1</td>
                        <td>32</td>
                        <td>London Park no. 1</td>
                        <td>London Park no. 1</td>
                        <td>London Park no. 1</td>
                        <td>London Park no. 1</td>
                        <td>London Park no. 1</td>
                        <td>London Park no. 1</td>
                        <td>London Park no. 1</td>
                        <td>London Park no. 1</td>
                        <td><a href="#">action</a></td>
                    </tr>
                    <tr>
                        <td>Edrward 2</td>
                        <td>32</td>
                        <td>London Park no. 2</td>
                        <td>London Park no. 2</td>
                        <td>London Park no. 2</td>
                        <td>London Park no. 2</td>
                        <td>London Park no. 2</td>
                        <td>London Park no. 2</td>
                        <td>London Park no. 2</td>
                        <td>London Park no. 2</td>
                        <td><a href="#">action</a></td>
                    </tr>
                    <tr>
                        <td>Edrward 3</td>
                        <td>32</td>
                        <td>London Park no. 3</td>
                        <td>London Park no. 3</td>
                        <td>London Park no. 3</td>
                        <td>London Park no. 3</td>
                        <td>London Park no. 3</td>
                        <td>London Park no. 3</td>
                        <td>London Park no. 3</td>
                        <td>London Park no. 3</td>
                        <td><a href="#">action</a></td>
                    </tr>
                    <tr>
                        <td>Edrward 4</td>
                        <td>32</td>
                        <td>London Park no. 4</td>
                        <td>London Park no. 4</td>
                        <td>London Park no. 4</td>
                        <td>London Park no. 4</td>
                        <td>London Park no. 4</td>
                        <td>London Park no. 4</td>
                        <td>London Park no. 4</td>
                        <td>London Park no. 4</td>
                        <td><a href="#">action</a></td>
                    </tr>
                    <tr>
                        <td>Edrward 5</td>
                        <td>32</td>
                        <td>London Park no. 5</td>
                        <td>London Park no. 5</td>
                        <td>London Park no. 5</td>
                        <td>London Park no. 5</td>
                        <td>London Park no. 5</td>
                        <td>London Park no. 5</td>
                        <td>London Park no. 5</td>
                        <td>London Park no. 5</td>
                        <td><a href="#">action</a></td>
                    </tr>
                    <tr>
                        <td>Edrward 6</td>
                        <td>32</td>
                        <td>London Park no. 6</td>
                        <td>London Park no. 6</td>
                        <td>London Park no. 6</td>
                        <td>London Park no. 6</td>
                        <td>London Park no. 6</td>
                        <td>London Park no. 6</td>
                        <td>London Park no. 6</td>
                        <td>London Park no. 6</td>
                        <td><a href="#">action</a></td>
                    </tr>
                    <tr>
                        <td>Edrward 7</td>
                        <td>32</td>
                        <td>London Park no. 7</td>
                        <td>London Park no. 7</td>
                        <td>London Park no. 7</td>
                        <td>London Park no. 7</td>
                        <td>London Park no. 7</td>
                        <td>London Park no. 7</td>
                        <td>London Park no. 7</td>
                        <td>London Park no. 7</td>
                        <td><a href="#">action</a></td>
                    </tr>
                    <tr>
                        <td>Edrward 8</td>
                        <td>32</td>
                        <td>London Park no. 8</td>
                        <td>London Park no. 8</td>
                        <td>London Park no. 8</td>
                        <td>London Park no. 8</td>
                        <td>London Park no. 8</td>
                        <td>London Park no. 8</td>
                        <td>London Park no. 8</td>
                        <td>London Park no. 8</td>
                        <td><a href="#">action</a></td>
                    </tr>
                    <tr>
                        <td>Edrward 9</td>
                        <td>32</td>
                        <td>London Park no. 9</td>
                        <td>London Park no. 9</td>
                        <td>London Park no. 9</td>
                        <td>London Park no. 9</td>
                        <td>London Park no. 9</td>
                        <td>London Park no. 9</td>
                        <td>London Park no. 9</td>
                        <td>London Park no. 9</td>
                        <td><a href="#">action</a></td>
                    </tr>
                </tbody>
            </table>
        </div>
    </div>

    也许你可以尝试使用最近的position:sticky来实现它。 或者,至少,用更少的JavaScript开始这个问题。

    div{
      overflow:auto;
      width:100%;
      height:200px;
    }
    td,
    th {
      border: 1px solid #000;
      width: 100px;
    }
    th {background-color:red;}
    
    table {
      table-layout: fixed;
      width:100%;
    }
    td:first-child, th:first-child {
      position:sticky;
      left:0;
      z-index:1;
      background-color:grey;
    }
    td:last-child, th:last-child {
      position:sticky;
      right:0;
      z-index:1;
      background-color:blue;
    }
    thead tr th {
      position:sticky;
      top:0;
    }
    th:first-child, th:last-child {z-index:2;background-color:red;}
    <div>
      <table>
        <thead>
          <tr>
            <th>&nbsp;&nbsp;&nbsp;</th>
            <th>&nbsp;&nbsp;&nbsp;</th>
            <th>&nbsp;&nbsp;&nbsp;</th>
            <th>&nbsp;&nbsp;&nbsp;</th>
            <th>&nbsp;&nbsp;&nbsp;</th>
            <th>&nbsp;&nbsp;&nbsp;</th>
            <th>&nbsp;&nbsp;&nbsp;</th>
            <th>&nbsp;&nbsp;&nbsp;</th>
            <th>&nbsp;&nbsp;&nbsp;</th>
            <th>&nbsp;&nbsp;&nbsp;</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td>&nbsp;&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;&nbsp;</td>
          </tr>
          <tr>
            <td>&nbsp;&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;&nbsp;</td>
          </tr>
          <tr>
            <td>&nbsp;&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;&nbsp;</td>
          </tr>
          <tr>
            <td>&nbsp;&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;&nbsp;</td>
          </tr>
          <tr>
            <td>&nbsp;&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;&nbsp;</td>
          </tr>
          <tr>
            <td>&nbsp;&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;&nbsp;</td>
          </tr>
          <tr>
            <td>&nbsp;&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;&nbsp;</td>
          </tr>
          <tr>
            <td>&nbsp;&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;&nbsp;</td>
          </tr>
          <tr>
            <td>&nbsp;&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;&nbsp;</td>
          </tr>
        </tbody>
      </table>
    </div>
    链接地址: http://www.djcxy.com/p/40603.html

    上一篇: Scrollable table with fixed columns and header, with modern CSS

    下一篇: Sequelize model references vs associations