具有固定列和标题的可滚动表格,具有现代CSS
如何使用现代CSS尽可能少使用JavaScript?
我想要的功能是:

注意:我确实看到并分析了一些最流行/见过的问题和答案,就像这里和这里一样。
  我知道这可以通过用于滚动的JavaScript事件处理程序完成,以便固定列可以向下/向上移动以跟随主列。  我试图构建的功能(但大量脚本化)的例子可能是这样的。  我们还可以将父元素中的MutationObserver添加到表中以检测大小更改并再次计算表的大小。  但是这在性能上是昂贵的,而且由于CSS也在不断发展和现代化,我想知道是否有新的方法...... 
有没有2017/2018这个只有CSS或尽可能少的JS开销的解决方案?
我想避免必须实现这样简单的JavaScript解决方案:

我的想法:
  a) :使用position: fixed;  在固定的列中 
问题:
<td>元素高度必须由JavaScript定义或计算。   b) :使用div来“伪造”左栏,并在表格中包含可滚动内容 
问题:
  c) :使用N个表格只显示每个表格的一部分,因此我可以使用HTML标记但保留固定的标题/列。 
问题:
使用滚动事件侦听器和固定的左列,我们可以像这样使用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>   </th>
        <th>   </th>
        <th>   </th>
        <th>   </th>
        <th>   </th>
        <th>   </th>
        <th>   </th>
        <th>   </th>
        <th>   </th>
        <th>   </th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td>   </td>
        <td>   </td>
        <td>   </td>
        <td>   </td>
        <td>   </td>
        <td>   </td>
        <td>   </td>
        <td>   </td>
        <td>   </td>
        <td>   </td>
      </tr>
      <tr>
        <td>   </td>
        <td>   </td>
        <td>   </td>
        <td>   </td>
        <td>   </td>
        <td>   </td>
        <td>   </td>
        <td>   </td>
        <td>   </td>
        <td>   </td>
      </tr>
      <tr>
        <td>   </td>
        <td>   </td>
        <td>   </td>
        <td>   </td>
        <td>   </td>
        <td>   </td>
        <td>   </td>
        <td>   </td>
        <td>   </td>
        <td>   </td>
      </tr>
      <tr>
        <td>   </td>
        <td>   </td>
        <td>   </td>
        <td>   </td>
        <td>   </td>
        <td>   </td>
        <td>   </td>
        <td>   </td>
        <td>   </td>
        <td>   </td>
      </tr>
      <tr>
        <td>   </td>
        <td>   </td>
        <td>   </td>
        <td>   </td>
        <td>   </td>
        <td>   </td>
        <td>   </td>
        <td>   </td>
        <td>   </td>
        <td>   </td>
      </tr>
      <tr>
        <td>   </td>
        <td>   </td>
        <td>   </td>
        <td>   </td>
        <td>   </td>
        <td>   </td>
        <td>   </td>
        <td>   </td>
        <td>   </td>
        <td>   </td>
      </tr>
      <tr>
        <td>   </td>
        <td>   </td>
        <td>   </td>
        <td>   </td>
        <td>   </td>
        <td>   </td>
        <td>   </td>
        <td>   </td>
        <td>   </td>
        <td>   </td>
      </tr>
      <tr>
        <td>   </td>
        <td>   </td>
        <td>   </td>
        <td>   </td>
        <td>   </td>
        <td>   </td>
        <td>   </td>
        <td>   </td>
        <td>   </td>
        <td>   </td>
      </tr>
      <tr>
        <td>   </td>
        <td>   </td>
        <td>   </td>
        <td>   </td>
        <td>   </td>
        <td>   </td>
        <td>   </td>
        <td>   </td>
        <td>   </td>
        <td>   </td>
      </tr>
    </tbody>
  </table>
</div>上一篇: Scrollable table with fixed columns and header, with modern CSS
