【问题标题】:How do I create an HTML table with a fixed/frozen left column and a scrollable body?如何创建具有固定/冻结左列和可滚动正文的 HTML 表格?
【发布时间】:2010-11-21 16:26:51
【问题描述】:

我需要一个简单的解决方案。我知道这与其他一些问题类似,例如:

但我只需要冻结一个左列,我更喜欢简单且无脚本的解决方案。

【问题讨论】:

    标签: html css html-table


    【解决方案1】:

    如果您想要一个只有列水平滚动的表格,您可以position: absolute 第一列(并明确指定其宽度),然后将整个表格包装在一个overflow-x: scroll 块中。但是,不要费心在 IE7 中尝试这个...

    相关的 HTML 和 CSS:

    table {
      border-collapse: separate;
      border-spacing: 0;
      border-top: 1px solid grey;
    }
    
    td, th {
      margin: 0;
      border: 1px solid grey;
      white-space: nowrap;
      border-top-width: 0px;
    }
    
    div {
      width: 500px;
      overflow-x: scroll;
      margin-left: 5em;
      overflow-y: visible;
      padding: 0;
    }
    
    .headcol {
      position: absolute;
      width: 5em;
      left: 0;
      top: auto;
      border-top-width: 1px;
      /*only relevant for first row*/
      margin-top: -1px;
      /*compensate for top border*/
    }
    
    .headcol:before {
      content: 'Row ';
    }
    
    .long {
      background: yellow;
      letter-spacing: 1em;
    }
    <div>
    <table>
            <tr><th class="headcol">1</th><td class="long">QWERTYUIOPASDFGHJKLZXCVBNM</td><td class="long">QWERTYUIOPASDFGHJKLZXCVBNM</td></tr>
            <tr><th class="headcol">2</th><td class="long">QWERTYUIOPASDFGHJKLZXCVBNM</td><td class="long">QWERTYUIOPASDFGHJKLZXCVBNM</td></tr>
            <tr><th class="headcol">3</th><td class="long">QWERTYUIOPASDFGHJKLZXCVBNM</td><td class="long">QWERTYUIOPASDFGHJKLZXCVBNM</td></tr>
            <tr><th class="headcol">4</th><td class="long">QWERTYUIOPASDFGHJKLZXCVBNM</td><td class="long">QWERTYUIOPASDFGHJKLZXCVBNM</td></tr>
            <tr><th class="headcol">5</th><td class="long">QWERTYUIOPASDFGHJKLZXCVBNM</td><td class="long">QWERTYUIOPASDFGHJKLZXCVBNM</td></tr>
            <tr><th class="headcol">6</th><td class="long">QWERTYUIOPASDFGHJKLZXCVBNM</td><td class="long">QWERTYUIOPASDFGHJKLZXCVBNM</td></tr>
    </table>
    </div>

    Fiddle

    【讨论】:

    • 这不处理任意标签。除非你有非常可预测的短标签,否则你会得到这个:jsfiddle.net/YMvk9/3724
    • @AaronLS:是的,您需要指定第一列的宽度。如果您需要处理任意长度的标签,您可以使用text-overflow: ellipsis 来清晰地显示这些标签。
    • @EamonNerbonne ellipsis 是我考虑过的一个不错的选择。另一种选择是做这样的事情。重复隐藏和固定的第一列。第二个隐藏列确保行的高度同步。仅当您有固定宽度的列时才有效:jsfiddle.net/abkNM/2224
    • 对于任何有兴趣的人。本质上,该解决方案将标题从表格中移开,并将每个标题设置为 5em 宽度。桌子本身被推到右侧,宽度相同为 5em。这使得标题仍然是表格中正常流程的一部分的视觉外观。
    • 这里是一个没有不必要代码的小例子jsfiddle.net/kashesandr/rLv5b1ft/1
    【解决方案2】:

    您可以使用sticky 位置。 这是一个示例代码。这是 HTML/CSS 解决方案。不需要js。

    .view {
      margin: auto;
      width: 600px;
    }
    
    .wrapper {
      position: relative;
      overflow: auto;
      border: 1px solid black;
      white-space: nowrap;
    }
    
    .sticky-col {
      position: -webkit-sticky;
      position: sticky;
      background-color: white;
    }
    
    .first-col {
      width: 100px;
      min-width: 100px;
      max-width: 100px;
      left: 0px;
    }
    
    .second-col {
      width: 150px;
      min-width: 150px;
      max-width: 150px;
      left: 100px;
    }
    <div class="view">
      <div class="wrapper">
        <table class="table">
          <thead>
            <tr>
              <th class="sticky-col first-col">Number</th>
              <th class="sticky-col second-col">First Name</th>
              <th>Last Name</th>
              <th>Employer</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td class="sticky-col first-col">1</td>
              <td class="sticky-col second-col">Mark</td>
              <td>Ham</td>
              <td>Micro</td>
            </tr>
            <tr>
              <td class="sticky-col first-col">2</td>
              <td class="sticky-col second-col">Jacob</td>
              <td>Smith</td>
              <td>Adob Adob Adob AdobAdob Adob Adob Adob Adob</td>
            </tr>
            <tr>
              <td class="sticky-col first-col">3</td>
              <td class="sticky-col second-col">Larry</td>
              <td>Wen</td>
              <td>Goog Goog Goog GoogGoog Goog Goog Goog Goog Goog</td>
            </tr>
          </tbody>
        </table>
      </div>
    </div>

    codeply 代码:https://www.codeply.com/p/oZ4NjpvwbO

    【讨论】:

    • 当然,这是最简单和最合乎逻辑的方法,我只做了: $("table th:first").css("position", "sticky").css( "left", "0px").css("背景颜色", $("body").css("背景颜色"));每一行都在循环中,就是这样!
    • 这应该是公认的答案。没有位置:绝对黑客和表格单元格大小不固定。
    • 是否可以只使 1 列具有粘性?我正在尝试您的链接,但我无法成功?就像我想让雇主专栏变得粘性一样
    • 这是迄今为止最好的答案。没有什么比粘贴列更好的了。在 Chrome、Safari 和 Firefox 上运行良好。没有在其他浏览器上测试过。
    • 很好的解决方案。这是基于此答案的 Plunker,具有固定列、固定标题和非偶数行高plnkr.co/plunk/l0m9pF3His2BrKjS
    【解决方案3】:

    对于 2017 年之后发布的大多数浏览器:

    您可以使用position: sticky。见https://caniuse.com/#feat=css-sticky

    不需要固定宽度的列。

    运行下面的代码 sn-p 看看它是如何工作的。

    .tscroll {
      width: 400px;
      overflow-x: scroll;
      margin-bottom: 10px;
      border: solid black 1px;
    }
    
    .tscroll table td:first-child {
      position: sticky;
      left: 0;
      background-color: #ddd;
    }
    
    .tscroll td, .tscroll th {
      border-bottom: dashed #888 1px;
    }
    <html>
    <div class="tscroll">
      <table>
        <thead>
          <tr>
            <th></th>
            <th colspan="5">Heading 1</th>
            <th colspan="8">Heading 2</th>
            <th colspan="4">Heading 3</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td>9:00</td>
            <td>AAA</td>
            <td>BBB</td>
            <td>CCC</td>
            <td>DDD</td>
            <td>EEE</td>
            <td>FFF</td>
            <td>GGG</td>
            <td>HHH</td>
            <td>III</td>
            <td>JJJ</td>
            <td>KKK</td>
            <td>LLL</td>
            <td>MMM</td>
            <td>NNN</td>
            <td>OOO</td>
            <td>PPP</td>
            <td>QQQ</td>
          </tr>
          <tr>
            <td>10:00</td>
            <td>AAA</td>
            <td>BBB</td>
            <td>CCC</td>
            <td>DDD</td>
            <td>EEE</td>
            <td>FFF</td>
            <td>GGG</td>
            <td>HHH</td>
            <td>III</td>
            <td>JJJ</td>
            <td>KKK</td>
            <td>LLL</td>
            <td>MMM</td>
            <td>NNN</td>
            <td>OOO</td>
            <td>PPP</td>
            <td>QQQ</td>
          </tr>
          <tr>
            <td>11:00</td>
            <td>AAA</td>
            <td>BBB</td>
            <td>CCC</td>
            <td>DDD</td>
            <td>EEE</td>
            <td>FFF</td>
            <td>GGG</td>
            <td>HHH</td>
            <td>III</td>
            <td>JJJ</td>
            <td>KKK</td>
            <td>LLL</td>
            <td>MMM</td>
            <td>NNN</td>
            <td>OOO</td>
            <td>PPP</td>
            <td>QQQ</td>
          </tr>
          <tr>
            <td>12:00</td>
            <td>AAA</td>
            <td>BBB</td>
            <td>CCC</td>
            <td>DDD</td>
            <td>EEE</td>
            <td>FFF</td>
            <td>GGG</td>
            <td>HHH</td>
            <td>III</td>
            <td>JJJ</td>
            <td>KKK</td>
            <td>LLL</td>
            <td>MMM</td>
            <td>NNN</td>
            <td>OOO</td>
            <td>PPP</td>
            <td>QQQ</td>
          </tr>
          <tr>
            <td>13:00</td>
            <td>AAA</td>
            <td>BBB</td>
            <td>CCC</td>
            <td>DDD</td>
            <td>EEE</td>
            <td>FFF</td>
            <td>GGG</td>
            <td>HHH</td>
            <td>III</td>
            <td>JJJ</td>
            <td>KKK</td>
            <td>LLL</td>
            <td>MMM</td>
            <td>NNN</td>
            <td>OOO</td>
            <td>PPP</td>
            <td>QQQ</td>
          </tr>
          <tr>
            <td>14:00</td>
            <td>AAA</td>
            <td>BBB</td>
            <td>CCC</td>
            <td>DDD</td>
            <td>EEE</td>
            <td>FFF</td>
            <td>GGG</td>
            <td>HHH</td>
            <td>III</td>
            <td>JJJ</td>
            <td>KKK</td>
            <td>LLL</td>
            <td>MMM</td>
            <td>NNN</td>
            <td>OOO</td>
            <td>PPP</td>
            <td>QQQ</td>
          </tr>
          <tr>
            <td>15:00</td>
            <td>AAA</td>
            <td>BBB</td>
            <td>CCC</td>
            <td>DDD</td>
            <td>EEE</td>
            <td>FFF</td>
            <td>GGG</td>
            <td>HHH</td>
            <td>III</td>
            <td>JJJ</td>
            <td>KKK</td>
            <td>LLL</td>
            <td>MMM</td>
            <td>NNN</td>
            <td>OOO</td>
            <td>PPP</td>
            <td>QQQ</td>
          </tr>
          <tr>
            <td>16:00</td>
            <td>AAA</td>
            <td>BBB</td>
            <td>CCC</td>
            <td>DDD</td>
            <td>EEE</td>
            <td>FFF</td>
            <td>GGG</td>
            <td>HHH</td>
            <td>III</td>
            <td>JJJ</td>
            <td>KKK</td>
            <td>LLL</td>
            <td>MMM</td>
            <td>NNN</td>
            <td>OOO</td>
            <td>PPP</td>
            <td>QQQ</td>
          </tr>
          <tr>
            <td>17:00</td>
            <td>AAA</td>
            <td>BBB</td>
            <td>CCC</td>
            <td>DDD</td>
            <td>EEE</td>
            <td>FFF</td>
            <td>GGG</td>
            <td>HHH</td>
            <td>III</td>
            <td>JJJ</td>
            <td>KKK</td>
            <td>LLL</td>
            <td>MMM</td>
            <td>NNN</td>
            <td>OOO</td>
            <td>PPP</td>
            <td>QQQ</td>
          </tr>
        </tbody>
        </table>
    </div>

    【讨论】:

    • 已经有一个答案建议sticky,所以不需要更多
    • @LGSon 我不同意,只有两个其他答案使用粘性。一种是使用引导 CSS 来实现粘性。另一个答案提供了与问题不直接相关的代码,不正确,并为粘性列使用固定宽度。
    • 无论是使用 Bootstrap 还是使用固定宽度,都不会使 position: sticky 改变其行为,因此已经显示了使用它。
    • 我对取消固定使用很感兴趣。但是,我看不出这个解决方案如何扩展到 2+ 个没有固定宽度的粘性列,因为似乎我们需要在所有粘性列上都有一个准确的 left 属性。
    • @Ben 根据您的情况,有几种方法可以解决此问题。如果第一列的宽度已知,则将第二列的left 属性设置为第一列的宽度。如果这对您不起作用,那么嵌套表应该可以工作。如果您不喜欢嵌套表格的想法,您也可以使用带有类似表格属性的嵌套 div。
    【解决方案4】:

    This 是一个有趣的 jQuery 插件,它可以创建固定的 headers 和/或 columns 。 在演示页面上将固定列切换为 true 以查看它的实际效果。

    【讨论】:

    • 这是行,不是列
    • @Fortega:如果您设置属性 fixedColumn: true,则列也是。您可以查看一个演示。
    • 啊好吧,那还不清楚。该演示上周无法正常工作。但现在是。
    • @Thomas1703 如果插件不适用于 1.9.x,您应该使用 jQuery 的 Migrate 插件 -> jquery.com/download
    • 这个插件对于大表真的很慢。
    【解决方案5】:

    在固定宽度左列的情况下,Eamon Nerbonne 提供了最佳解决方案。

    如果左列宽度可变,我发现的最佳解决方案是制作两个相同的表并将一个推到另一个之上。演示:http://jsfiddle.net/xG5QH/6/.

    <!DOCTYPE html>
    <html>
    <head>
    <style type="text/css">
    /* important styles */
    
    .container {
       /* Attach fixed-th-table to this container,
          in order to layout fixed-th-table
          in the same way as scolled-td-table" */
       position: relative;
    
       /* Truncate fixed-th-table */
       overflow: hidden;
    }
    
    .fixed-th-table-wrapper td,
    .fixed-th-table-wrapper th,
    .scrolled-td-table-wrapper td,
    .scrolled-td-table-wrapper th {
       /* Set background to non-transparent color
          because two tables are one above another.
        */
       background: white;
    }
    .fixed-th-table-wrapper {
       /* Make table out of flow */
       position: absolute;
    }
    .fixed-th-table-wrapper th {
        /* Place fixed-th-table th-cells above 
           scrolled-td-table td-cells.
         */
        position: relative;
        z-index: 1;
    }
    .scrolled-td-table-wrapper td {
        /* Place scrolled-td-table td-cells
           above fixed-th-table.
         */
        position: relative;
    }
    .scrolled-td-table-wrapper {
       /* Make horizonal scrollbar if needed */
       overflow-x: auto;
    }
    
    
    /* Simulating border-collapse: collapse,
       because fixed-th-table borders
       are below ".scrolling-td-wrapper table" borders
    */
    
    table {
        border-spacing: 0;
    }
    td, th {
       border-style: solid;
       border-color: black;
       border-width: 1px 1px 0 0;
    }
    th:first-child {
       border-left-width: 1px;
    }
    tr:last-child td,
    tr:last-child th {
       border-bottom-width: 1px;
    }
    
    /* Unimportant styles */
    
    .container {
        width: 250px;
    }
    td, th {
       padding: 5px;
    }
    </style>
    </head>
    
    <body>
    <div class="container">
    
    <div class="fixed-th-table-wrapper">
    <!-- fixed-th-table -->
    <table>
        <tr>
             <th>aaaaaaa</th>
             <td>ccccccccccc asdsad asd as</td>
             <td>ccccccccccc asdsad asd as</td>
        </tr>
        <tr>
             <th>cccccccc</th>
             <td>xxxxxxxxxxxxxxxxxxxx yyyyyyyyyyyyyy zzzzzzzzzzzzz</td>
             <td>xxxxxxxxxxxxxxxxxxxx yyyyyyyyyyyyyy zzzzzzzzzzzzz</td>
        </tr>
    </table>
    </div>
    
    <div class="scrolled-td-table-wrapper">
    <!-- scrolled-td-table
         - same as fixed-th-table -->
    <table>
        <tr>
             <th>aaaaaaa</th>
             <td>ccccccccccc asdsad asd as</td>
             <td>ccccccccccc asdsad asd as</td>
        </tr>
        <tr>
             <th>cccccccc</th>
             <td>xxxxxxxxxxxxxxxxxxxx yyyyyyyyyyyyyy zzzzzzzzzzzzz</td>
             <td>xxxxxxxxxxxxxxxxxxxx yyyyyyyyyyyyyy zzzzzzzzzzzzz</td>
        </tr>
    </table>
    </div>
    
    </div>
    </body>
    </html>
    

    【讨论】:

    • +10 非常聪明。必须在引导程序下将border-collapse 设置为seperate,否则边框不会随单元格浮动。之后需要进行一点边界清洁。
    • 非常好!谢谢!我没有使用 出于我自己的原因,我使用了一个类来指示要修复哪一列,并且,为了更好地衡量,在列中添加了一个 visibility: collapse; 以隐藏在固定表中(必须喜欢:not() css 选择器!)。我还使用 jQuery 来.clone() 表,一旦它由 php+MySQL+ajax 生成,然后将其插入到已清理的 div 中...
    【解决方案6】:

    有点晚了,但我在为自己尝试解决方案时确实遇到了这个线程。假设您现在使用的是现代浏览器,我想出了一个使用 CSS calc() 来帮助保证满足宽度的解决方案。

    .table-fixed-left table,
    .table-fixed-right table {
      border-collapse: collapse;
    }
    .table-fixed-right td,
    .table-fixed-right th,
    .table-fixed-left td,
    .table-fixed-left th {
      border: 1px solid #ddd;
      padding: 5px 5px;
    }
    .table-fixed-left {
      width: 120px;
      float: left;
      position: fixed;
      overflow-x: scroll;
      white-space: nowrap;
      text-align: left;
      border: 1px solid #ddd;
      z-index: 2;
    }
    .table-fixed-right {
      width: calc(100% - 145px);
      right: 15px;
      position: fixed;
      overflow-x: scroll;
      border: 1px solid #ddd;
      white-space: nowrap;
    }
    .table-fixed-right td,
    .table-fixed-right th {
      padding: 5px 10px;
    }
    <div class="table-fixed-left">
      <table>
        <tr>
          <th>Normal Header</th>
        </tr>
        <tr>
          <th>Header with extra line
            <br/>&nbsp;</th>
        </tr>
        <tr>
          <th>Normal Header</th>
        </tr>
        <tr>
          <th>Normal with extra line
            <br/>&nbsp;</th>
        </tr>
        <tr>
          <th>Normal Header</th>
        </tr>
        <tr>
          <th>Normal Header</th>
        </tr>
      </table>
    </div>
    <div class="table-fixed-right">
      <table>
        <tr>
          <th>Header</th>
          <th>Another header</th>
          <th>Header</th>
          <th>Header really really really really long</th>
        </tr>
        <tr>
          <td>Info Long</td>
          <td>Info
            <br/>with second line</td>
          <td>Info
            <br/>with second line</td>
          <td>Info Long</td>
        </tr>
        <tr>
          <td>Info Long</td>
          <td>Info Long</td>
          <td>Info Long</td>
          <td>Info Long</td>
        </tr>
        <tr>
          <td>Info
            <br/>with second line</td>
          <td>Info
            <br/>with second line</td>
          <td>Info
            <br/>with second line</td>
          <td>Info</td>
        </tr>
        <tr>
          <td>Info</td>
          <td>Info</td>
          <td>Info</td>
          <td>Info</td>
        </tr>
        <tr>
          <td>Info</td>
          <td>Info</td>
          <td>Info</td>
          <td>Info</td>
        </tr>
      </table>
    </div>

    希望这对某人有所帮助!

    【讨论】:

      【解决方案7】:

      使用position: fixed 设置左列的样式。 (您可能想要使用 topleft 样式来控制它发生的确切位置。)

      【讨论】:

      • 是的;您应该跳过整个“表格”部分,只使用两个 div,一个用于左列,一个用于其余内容。左列 div 获取 position: fixed 并保持不变,其余内容正常运行(可能设置了左边距,因此它不会与左列重叠)。
      • 如果您正在为一个或多个可以出现在页面任意位置的表格寻找通用样式,即如果您的设计是响应式的,这将不起作用。
      【解决方案8】:

      您可以只创建第一列position: sticky; z-index: 9。 它将使列/行保持在其当前位置。 在这里查看我的示例代码笔 https://codepen.io/swastikmishra/pen/zYYdKBQ

      HTML 示例

      table {
        text-align: center;
      }
      
      .table-container {
        width: 500px;
        height: 300px;
        overflow: scroll;
      }
      
      table th,
      table td {
        white-space: nowrap;
        padding: 10px 20px;
        font-family: Arial;
      }
      
      table tr th:first-child,
      table td:first-child {
        position: sticky;
        width: 100px;
        left: 0;
        z-index: 10;
        background: #fff;
      }
      
      table tr th:first-child {
        z-index: 11;
      }
      
      table tr th {
        position: sticky;
        top: 0;
        z-index: 9;
        background: #fff;
      }
      <div class="table-container">
        <table>
          <tr>
            <th>Hello World</th>
            <th>Hello World</th>
            <th>Hello World</th>
            <th>Hello World</th>
            <th>Hello World</th>
            <th>Hello World</th>
            <th>Hello World</th>
          </tr>
          <tr>
            <td>H11</td>
            <td>H12</td>
            <td>H13</td>
            <td>H14</td>
            <td>H15</td>
            <td>H16</td>
            <td>H17</td>
          </tr>
          <tr>
            <td>H21</td>
            <td>H22</td>
            <td>H23</td>
            <td>H24</td>
            <td>H25</td>
            <td>H26</td>
            <td>H27</td>
          </tr>
          <tr>
            <td>H31</td>
            <td>H32</td>
            <td>H33</td>
            <td>H34</td>
            <td>H35</td>
            <td>H36</td>
            <td>H37</td>
          </tr>
          <tr>
            <td>H41</td>
            <td>H42</td>
            <td>H44</td>
            <td>H44</td>
            <td>H45</td>
            <td>H46</td>
            <td>H47</td>
          </tr>
          <tr>
            <td>H51</td>
            <td>H52</td>
            <td>H54</td>
            <td>H54</td>
            <td>H55</td>
            <td>H56</td>
            <td>H57</td>
          </tr>
          <tr>
            <td>H61</td>
            <td>H62</td>
            <td>H64</td>
            <td>H64</td>
            <td>H65</td>
            <td>H66</td>
            <td>H67</td>
          </tr>
          <tr>
            <td>H71</td>
            <td>H72</td>
            <td>H74</td>
            <td>H74</td>
            <td>H75</td>
            <td>H76</td>
            <td>H77</td>
          </tr>
          <tr>
            <td>H81</td>
            <td>H82</td>
            <td>H84</td>
            <td>H84</td>
            <td>H85</td>
            <td>H86</td>
            <td>H87</td>
          </tr>
        </table>
      </div>

      【讨论】:

        【解决方案9】:

        我接受了 Earmon Nerbonne 的回答并对其进行了编辑,以使用填满整个宽度的表格。

        http://jsfiddle.net/DYgD6/6/

        <!DOCTYPE html>
        <html><head><title>testdoc</title>
        <style type="text/css">
                    body {
                font:16px Calibri;
            }
            table {
                border-collapse:separate;
                border-top: 3px solid grey;
            }
            td {
                margin:0;
                border:3px solid grey;
                border-top-width:0px;
                white-space:nowrap;
            }
            #outerdiv {
                position: absolute;
                top: 0;
                left: 0;
                right: 5em;
            }
            #innerdiv {
                width: 100%;
                overflow-x:scroll;
                margin-left: 5em;
                overflow-y:visible;
                padding-bottom:1px;
            }
            .headcol {
                position:absolute;
                width:5em;
                left:0;
                top:auto;
                border-right: 0px none black;
                border-top-width:3px;
                /*only relevant for first row*/
                margin-top:-3px;
                /*compensate for top border*/
            }
            .headcol:before {
                content:'Row ';
            }
            .long {
                background:yellow;
                letter-spacing:1em;
            }
        </style></head><body>
          <div id="outerdiv">
           <div id="innerdiv">
            <table>
                <tr>
                    <td class="headcol">1</td>
                    <td class="long">QWERTYUIOPASDFGHJKLZXCVBNM</td>
                    <td class="long">QWERTYUIOPASDFGHJKLZXCVBNM</td>
                </tr>
                <tr>
                    <td class="headcol">2</td>
                    <td class="long">QWERTYUIOPASDFGHJKLZXCVBNM</td>
                    <td class="long">QWERTYUIOPASDFGHJKLZXCVBNM</td>
                </tr>
                <tr>
                    <td class="headcol">3</td>
                    <td class="long">QWERTYUIOPASDFGHJKLZXCVBNM</td>
                    <td class="long">QWERTYUIOPASDFGHJKLZXCVBNM</td>
                </tr>
                <tr>
                    <td class="headcol">4</td>
                    <td class="long">QWERTYUIOPASDFGHJKLZXCVBNM</td>
                    <td class="long">QWERTYUIOPASDFGHJKLZXCVBNM</td>
                </tr>
                <tr>
                    <td class="headcol">5</td>
                    <td class="long">QWERTYUIOPASDFGHJKLZXCVBNM</td>
                    <td class="long">QWERTYUIOPASDFGHJKLZXCVBNM</td>
                </tr>
                <tr>
                    <td class="headcol">6</td>
                    <td class="long">QWERTYUIOPASDFGHJKLZXCVBNM</td>
                    <td class="long">QWERTYUIOPASDFGHJKLZXCVBNM</td>
                </tr>
                <tr>
                    <td class="headcol">7</td>
                    <td class="long">QWERTYUIOPASDFGHJKLZXCVBNM</td>
                    <td class="long">QWERTYUIOPASDFGHJKLZXCVBNM</td>
                </tr>
                <tr>
                    <td class="headcol">8</td>
                    <td class="long">QWERTYUIOPASDFGHJKLZXCVBNM</td>
                    <td class="long">QWERTYUIOPASDFGHJKLZXCVBNM</td>
                </tr>
                <tr>
                    <td class="headcol">9</td>
                    <td class="long">QWERTYUIOPASDFGHJKLZXCVBNM</td>
                    <td class="long">QWERTYUIOPASDFGHJKLZXCVBNM</td>
                </tr>
            </table>
        </div></div>
        </body></html>
        

        虽然固定列的宽度仍然需要设定值。

        【讨论】:

          【解决方案10】:

          如果您正在开发更复杂的东西并希望将多个列固定/固定在左侧,您可能需要这样的东西。

          .wrapper {
              overflow-x: scroll;
          }
          
          td {
              min-width: 50px;
          }
          
          .fixed {
              position: absolute;
              background: #aaa;
          }
          <div class="content" style="width: 400px">
          
            <div class="wrapper" style="margin-left: 100px">
          
                <table>
                  <thead>
                    <tr>
                      <th class="fixed" style="left: 0px">aaa</th>
                      <th class="fixed" style="left: 50px">aaa2</th>
                      <th>a</th>
                      <th>b</th>
                      <th>c</th>
                      <th>d</th>
                      <th>e</th>
                      <th>f</th>
                      <th>a</th>
                      <th>b</th>
                      <th>c</th>
                      <th>d</th>
                      <th>e</th>
                      <th>f</th>
                      <th>a</th>
                      <th>b</th>
                      <th>c</th>
                      <th>d</th>
                      <th>e</th>
                      <th>f</th>
                      <th>a</th>
                      <th>b</th>
                      <th>c</th>
                      <th>d</th>
                      <th>e</th>
                      <th>f</th>        
                    </tr>
                  </thead>
                  <tbody>
                    <tr>
                      <td class="fixed" style="left: 0px">aaa</td>
                      <td class="fixed" style="left: 50px">aaa2</td>
                      <td>a</td>
                      <td>b</td>
                      <td>c</td>
                      <td>d</td>
                      <td>e</td>
                      <td>f</td>
                      <td>a</td>
                      <td>b</td>
                      <td>c</td>
                      <td>d</td>
                      <td>e</td>
                      <td>f</td>
                      <td>a</td>
                      <td>b</td>
                      <td>c</td>
                      <td>d</td>
                      <td>e</td>
                      <td>f</td>
                      <td>a</td>
                      <td>b</td>
                      <td>c</td>
                      <td>d</td>
                      <td>e</td>
                      <td>f</td>
                    </tr>
                    <tr>
                      <td class="fixed" style="left: 0">bbb</td>
                      <td class="fixed" style="left: 50px">bbb2</td>
                      <td>a</td>
                      <td>b</td>
                      <td>c</td>
                      <td>d</td>
                      <td>e</td>
                      <td>f</td>
                      <td>a</td>
                      <td>b</td>
                      <td>c</td>
                      <td>d</td>
                      <td>e</td>
                      <td>f</td>
                      <td>a</td>
                      <td>b</td>
                      <td>c</td>
                      <td>d</td>
                      <td>e</td>
                      <td>f</td>
                      <td>a</td>
                      <td>b</td>
                      <td>c</td>
                      <td>d</td>
                      <td>e</td>
                      <td>f</td>
                    </tr>
                  </tbody>
                </table>
          
            </div>
          
          </div>

          【讨论】:

          • 这很好用,但我怎样才能为桌子设置一个固定的高度?
          【解决方案11】:

          如果您在 Webdevelopper 地狱中并且需要使这项工作适用于 IE6,这是我使用的示例代码:

          <html>
          <head>
          <style type="text/css">
          .fixme {
              position: relative;
              left: expression( ( 20 + ( ignoreMe2 = document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft ) ) + 'px' );
              background-color: #FFFFFF;
          }
          </style>
          </head>
          <body>
          <table width="1500px" border="2">
              <tr>
                  <td class="fixme" style="width: 200px;">loremp ispum dolor sit amet loremp ispum dolor sit amet loremp ispum dolor sit amet loremp ispum dolor sit amet loremp ispum dolor sit amet loremp ispum dolor sit amet loremp ispum dolor sit amet loremp ispum dolor sit amet loremp ispum dolor sit amet loremp ispum dolor sit amet</td>
                  <td>loremp ispum dolor sit amet loremp ispum dolor sit amet loremp ispum dolor sit amet loremp ispum dolor sit amet </td>
                  <td>loremp ispum dolor sit amet loremp ispum dolor sit amet loremp ispum dolor sit amet loremp ispum dolor sit amet loremp ispum dolor sit amet loremp ispum dolor sit amet </td>
                  <td>loremp ispum dolor sit amet loremp ispum dolor sit amet loremp ispum dolor sit amet loremp ispum dolor sit amet </td>
              </tr>
              <tr>
                  <td class="fixme" style="width: 200px;">loremp ispum dolor sit amet loremp ispum dolor sit amet loremp ispum dolor sit amet loremp ispum dolor sit amet loremp ispum dolor sit amet loremp ispum dolor sit amet loremp ispum dolor sit amet loremp ispum dolor sit amet loremp ispum dolor sit amet loremp ispum dolor sit amet </td>
                  <td>loremp ispum dolor sit amet loremp ispum dolor sit amet loremp ispum dolor sit amet loremp ispum dolor sit amet </td>
                  <td>loremp ispum dolor sit amet loremp ispum dolor sit amet loremp ispum dolor sit amet loremp ispum dolor sit amet loremp ispum dolor sit amet loremp ispum dolor sit amet </td>
                  <td>loremp ispum dolor sit amet loremp ispum dolor sit amet loremp ispum dolor sit amet loremp ispum dolor sit amet </td>
              </tr>
              <tr>
                  <td class="fixme" style="width: 200px;">loremp ispum dolor sit amet loremp ispum dolor sit amet loremp ispum dolor sit amet loremp ispum dolor sit amet loremp ispum dolor sit amet loremp ispum dolor sit amet loremp ispum dolor sit amet loremp ispum dolor sit amet loremp ispum dolor sit amet loremp ispum dolor sit amet </td>
                  <td>loremp ispum dolor sit amet loremp ispum dolor sit amet loremp ispum dolor sit amet loremp ispum dolor sit amet </td>
                  <td>loremp ispum dolor sit amet loremp ispum dolor sit amet loremp ispum dolor sit amet loremp ispum dolor sit amet loremp ispum dolor sit amet loremp ispum dolor sit amet </td>
                  <td>loremp ispum dolor sit amet loremp ispum dolor sit amet loremp ispum dolor sit amet loremp ispum dolor sit amet </td>
              </tr>
              <tr>
                  <td class="fixme" style="width: 200px;">loremp ispum dolor sit amet loremp ispum dolor sit amet loremp ispum dolor sit amet loremp ispum dolor sit amet loremp ispum dolor sit amet loremp ispum dolor sit amet loremp ispum dolor sit amet loremp ispum dolor sit amet loremp ispum dolor sit amet loremp ispum dolor sit amet </td>
                  <td>loremp ispum dolor sit amet loremp ispum dolor sit amet loremp ispum dolor sit amet loremp ispum dolor sit amet </td>
                  <td>loremp ispum dolor sit amet loremp ispum dolor sit amet loremp ispum dolor sit amet loremp ispum dolor sit amet loremp ispum dolor sit amet loremp ispum dolor sit amet </td>
                  <td>loremp ispum dolor sit amet loremp ispum dolor sit amet loremp ispum dolor sit amet loremp ispum dolor sit amet </td>
              </tr>
          </table>
          </body>
          </html>
          

          这可能仅适用于 IE6,因此对 CSS 使用条件 cmets。

          【讨论】:

            【解决方案12】:

            无需添加任何插件,CSS就可以完成这项工作!!!

            这个想法是让每列中所有第一个单元格的位置都是绝对的,并且使宽度固定。例如:

            max-width: 125px;
            min-width: 125px;
            position: absolute;
            

            这会将某些列的某些部分隐藏在第一列下方,因此添加一个空的第二列(添加第二个空 td),其宽度与第一列相同。

            我测试过,这适用于 Chrome 和 Firefox。

            【讨论】:

            • 我试过这个,它也适用于 IE8。但是有了这个,我怎样才能使第一行也固定。我试过了,但是因为我将左列设置为绝对冻结,所以在冻结第一行时会产生影响。请帮助.....正如我所注意到的,我们要么冻结第一行,要么冻结第一列,但冻结两者都不起作用.....
            • 您能举个例子吗?
            • 这个解决方案就像一个魅力,但如果在垂直滚动时表格中有分页,则会弄乱列数据
            【解决方案13】:

            Eamon Nerbonne,我在你的代码中更改了一些 css,现在更好(滚动条从第一行开始)

            http://jsfiddle.net/At8L8/

            我只添加了两行:

            .div : padding-left:5em;
            .headcol : background-color : #fff;
            

            【讨论】:

            • 你能告诉我你是如何让滚动条从冻结列开始的吗?将 更改为 也有影响吗?
            【解决方案14】:

            这是最流行答案的另一个修改,但在第一列标签中处理可变长度的文本: http://jsfiddle.net/ozx56n41/

            基本上,我使用第二列来创建行高,就像之前提到的那样。但我的小提琴实际上与上面提到的大多数不同。

            HTML:

            <div id="outerdiv">
                <div id="innerdiv">
                    <table>
                        <tr>
                            <td class="headcol"><div>This is a long label</div></td>
                            <td class="hiddenheadcol"><div>This is a long label</div></td>
                            <td class="long">QWERTYUIOPASDFGHJKLZXCVBNM</td>
                            <td class="long">QWERTYUIOPASDFGHJKLZXCVBNM</td>
                        </tr>
                        <tr>
                            <td class="headcol"><div>Short label</div></td>
                            <td class="hiddenheadcol"><div>Short label</div></td>
                            <td class="long">QWERTYUIOPASDFGHJKLZXCVBNM</td>
                            <td class="long">QWERTYUIOPASDFGHJKLZXCVBNM</td>
                        </tr>
                    </table>
                </div>
            </div>
            

            CSS:

            body {
                font: 16px Calibri;
            }
            #outerdiv {
                position: absolute;
                top: 0;
                left: 0;
                right: 0;
                width: 100%;
                border-top: 1px solid grey;
            }
            #innerdiv {
                overflow-x: scroll;
                margin-left: 100px;
                overflow-y: visible;
                padding-bottom: 1px;
            }
            table {
                border-collapse:separate;
            }
            td {
                margin: 0;
                border: 1px solid grey;
                border-top-width: 0;
                border-left-width: 0px;
                padding: 10px;
            }
            td.headcol {
                /* Frozen 1st column */
                position: absolute;
                left: 0;
                top: auto;
                border-bottom-width: 1px;
                padding: 0;
                border-left-width: 1px;
            }
            td.hiddenheadcol {
                /* Hidden 2nd column to create height */
                max-width: 0;
                visibility: hidden;
                padding: 0;
            }
            td.headcol div {
                /* Text container in the 1st column */
                width: 100px;
                max-width: 100px;
                background: lightblue;
                padding: 10px;
                box-sizing: border-box;
            }
            td.hiddenheadcol div {
                /* Text container in the 2nd column */
                width: 100px;
                max-width: 100px;
                background: red;
                padding: 10px;
            }
            td.long {
                background:yellow;
                letter-spacing:1em;
            }
            

            【讨论】:

              【解决方案15】:

              对我来说,这是唯一一个完美运行的(感谢 Paul O'Brien!): https://codepen.io/paulobrien/pen/gWoVzN

              这是sn-p:

              // requires jquery library
              jQuery(document).ready(function() {
                jQuery(".main-table").clone(true).appendTo('#table-scroll').addClass('clone');   
               });
                .table-scroll {
                  position:relative;
                  max-width:600px;
                  margin:auto;
                  overflow:hidden;
                  border:1px solid #000;
                }
              .table-wrap {
              	width:100%;
              	overflow:auto;
              }
              .table-scroll table {
              	width:100%;
              	margin:auto;
              	border-collapse:separate;
              	border-spacing:0;
              }
              .table-scroll th, .table-scroll td {
              	padding:5px 10px;
              	border:1px solid #000;
              	background:#fff;
              	white-space:nowrap;
              	vertical-align:top;
              }
              .table-scroll thead, .table-scroll tfoot {
              	background:#f9f9f9;
              }
              .clone {
              	position:absolute;
              	top:0;
              	left:0;
              	pointer-events:none;
              }
              .clone th, .clone td {
              	visibility:hidden
              }
              .clone td, .clone th {
              	border-color:transparent
              }
              .clone tbody th {
              	visibility:visible;
              	color:red;
              }
              .clone .fixed-side {
              	border:1px solid #000;
              	background:#eee;
              	visibility:visible;
              }
              .clone thead, .clone tfoot{background:transparent;}
              <div id="table-scroll" class="table-scroll">
                <div class="table-wrap">
                  <table class="main-table">
                    <thead>
                      <tr>
                        <th class="fixed-side" scope="col">&nbsp;</th>
                        <th scope="col">Header 2</th>
                        <th scope="col">Header 3</th>
                        <th scope="col">Header 4</th>
                        <th scope="col">Header 5</th>
                        <th scope="col">Header 6</th>
                        <th scope="col">Header 7</th>
                        <th scope="col">Header 8</th>
                      </tr>
                    </thead>
                    <tbody>
                      <tr>
                        <th class="fixed-side">Left Column</th>
                        <td>Cell content<br>
                          test</td>
                        <td><a href="#">Cell content longer</a></td>
                        <td>Cell content</td>
                        <td>Cell content</td>
                        <td>Cell content</td>
                        <td>Cell content</td>
                        <td>Cell content</td>
                      </tr>
                      <tr>
                        <th class="fixed-side">Left Column</th>
                        <td>Cell content</td>
                        <td>Cell content longer</td>
                        <td>Cell content</td>
                        <td>Cell content</td>
                        <td>Cell content</td>
                        <td>Cell content</td>
                        <td>Cell content</td>
                      </tr>
                      <tr>
                        <th class="fixed-side">Left Column</th>
                        <td>Cell content</td>
                        <td>Cell content longer</td>
                        <td>Cell content</td>
                        <td>Cell content</td>
                        <td>Cell content</td>
                        <td>Cell content</td>
                        <td>Cell content</td>
                      </tr>
                      <tr>
                        <th class="fixed-side">Left Column</th>
                        <td>Cell content</td>
                        <td>Cell content longer</td>
                        <td>Cell content</td>
                        <td>Cell content</td>
                        <td>Cell content</td>
                        <td>Cell content</td>
                        <td>Cell content</td>
                      </tr>
                      <tr>
                        <th class="fixed-side">Left Column</th>
                        <td>Cell content</td>
                        <td>Cell content longer</td>
                        <td>Cell content</td>
                        <td>Cell content</td>
                        <td>Cell content</td>
                        <td>Cell content</td>
                        <td>Cell content</td>
                      </tr>
                      <tr>
                        <th class="fixed-side">Left Column</th>
                        <td>Cell content</td>
                        <td>Cell content longer</td>
                        <td>Cell content</td>
                        <td>Cell content</td>
                        <td>Cell content</td>
                        <td>Cell content</td>
                        <td>Cell content</td>
                      </tr>
                    </tbody>
                    <tfoot>
                      <tr>
                        <th class="fixed-side">&nbsp;</th>
                        <td>Footer 2</td>
                        <td>Footer 3</td>
                        <td>Footer 4</td>
                        <td>Footer 5</td>
                        <td>Footer 6</td>
                        <td>Footer 7</td>
                        <td>Footer 8</td>
                      </tr>
                    </tfoot>
                  </table>
                </div>
              </div>
              
              <p>See <a href="https://codepen.io/paulobrien/pen/LBrMxa" target="blank">position Sticky version </a>with no JS</p>
              <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js" type="text/javascript"></script>

              【讨论】:

                【解决方案16】:

                当我在我的 Mac 上测试之前的所有答案时,Opera 都存在问题。 如果您滚动表格,则固定列会在您传递第一个未固定列后消失。我继续写了下面的代码。它适用于我本地安装的所有浏览器。不过我不知道ie是怎么处理的。

                请记住,如果您打算跳过一个表中的行而不是另一个表中的行,或者更改行的高度,您可能需要调整此代码。

                <table class = "fixedColumns">
                    <tr><td> row 1 </td></tr>
                    <tr><td> row 2 </td></tr>
                </table>
                <table class = "scrollableTable">
                    <tr><td> col 1 </td> <td> col 2 </td><td> col 3 </td><td> col 4 </td></tr>
                    <tr><td> col 1 </td> <td> col 2 </td><td> col 3 </td><td> col 4 </td></tr>
                </table>
                
                <style type = "text/css" >
                    .fixedColumns
                    {
                        vertical-align:top;
                        display: inline-block;
                    }
                    .scrollableTable
                    {
                        display: inline-block;
                        width:50px;
                        white-space: nowrap;
                        overflow-x: scroll;
                    }
                </style>
                

                【讨论】:

                  【解决方案17】:

                  或者,使用预定大小设置 tbody 样式(例如,通过height:20em)并使用overflow-y:scroll;

                  然后,您可以拥有一个巨大的 tbody,它将独立于页面的其余部分滚动。

                  【讨论】:

                  • 为了让表格主体可以滚动,它应该显示为一个块
                  【解决方案18】:
                  //If the table has tbody and thead, make them the relative container in which we can fix td and th as absolute
                  
                  table tbody {
                      position: relative;
                  }
                  
                  table thead {
                      position: relative;
                  }
                  
                  //Make both the first header and first data cells (First column) absolute so that it sticks to the left
                  
                  table td:first-of-type {
                      position: absolute;
                  }
                  
                  table th:first-of-type {
                      position: absolute;
                  }
                  
                  //Move Second column according to the width of column 1 
                  
                  table td:nth-of-type(2) {
                      padding-left: <Width of column 1>;
                  }
                  
                  table th:nth-of-type(2) {
                      padding-left: <Width of column 1>;
                  }
                  

                  【讨论】:

                    【解决方案19】:

                    $(document).ready(function() {
                        var table = $('#example').DataTable( {
                            scrollY:        "400px",
                            scrollX:        true,
                            scrollCollapse: true,
                            paging:         true,
                            fixedColumns:   {
                                leftColumns: 3
                            }
                        } );
                    } );
                    <head>
                    	<title>table</title>
                    	
                    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
                    <link rel="stylesheet" href="https://cdn.datatables.net/1.10.16/css/jquery.dataTables.min.css">
                    <link rel="stylesheet" href="https://cdn.datatables.net/fixedcolumns/3.2.4/css/fixedColumns.dataTables.min.css">
                    <script type="text/javascript" src="http://cdn.datatables.net/1.10.2/js/jquery.dataTables.min.js"></script>
                    <script type="text/javascript" src="https://code.jquery.com/jquery-1.12.4.js"></script>
                    <script type="text/javascript" src="https://cdn.datatables.net/1.10.16/js/jquery.dataTables.min.js"></script>
                    <script type="text/javascript" src="https://cdn.datatables.net/fixedcolumns/3.2.4/js/dataTables.fixedColumns.min.js"></script>
                    
                    
                    <style>
                           th, td { white-space: nowrap; }
                        div.dataTables_wrapper {
                            width: 900px;
                            margin: 0 auto;
                        }
                    </style>
                    
                    </head>
                    <table id="example" class="stripe row-border order-column" style="width:100%">
                            <thead>
                                <tr>
                                    <th>First name</th>
                                    <th>Last name</th>
                                    <th>Position</th>
                                    <th>Office</th>
                                    <th>Age</th>
                                    <th>Start date</th>
                                    <th>Salary</th>
                                    <th>Extn.</th>
                                    <th>E-mail</th>
                                </tr>
                            </thead>
                            <tbody>
                                <tr>
                                    <td>Tiger</td>
                                    <td>Nixon</td>
                                    <td>System Architect</td>
                                    <td>Edinburgh</td>
                                    <td>61</td>
                                    <td>2011/04/25</td>
                                    <td>$320,800</td>
                                    <td>5421</td>
                                    <td>t.nixon@datatables.net</td>
                                </tr>
                                <tr>
                                    <td>Garrett</td>
                                    <td>Winters</td>
                                    <td>Accountant</td>
                                    <td>Tokyo</td>
                                    <td>63</td>
                                    <td>2011/07/25</td>
                                    <td>$170,750</td>
                                    <td>8422</td>
                                    <td>g.winters@datatables.net</td>
                                </tr>
                                <tr>
                                    <td>Ashton</td>
                                    <td>Cox</td>
                                    <td>Junior Technical Author</td>
                                    <td>San Francisco</td>
                                    <td>66</td>
                                    <td>2009/01/12</td>
                                    <td>$86,000</td>
                                    <td>1562</td>
                                    <td>a.cox@datatables.net</td>
                                </tr>
                                <tr>
                                    <td>Cedric</td>
                                    <td>Kelly</td>
                                    <td>Senior Javascript Developer</td>
                                    <td>Edinburgh</td>
                                    <td>22</td>
                                    <td>2012/03/29</td>
                                    <td>$433,060</td>
                                    <td>6224</td>
                                    <td>c.kelly@datatables.net</td>
                                </tr>
                                <tr>
                                    <td>Airi</td>
                                    <td>Satou</td>
                                    <td>Accountant</td>
                                    <td>Tokyo</td>
                                    <td>33</td>
                                    <td>2008/11/28</td>
                                    <td>$162,700</td>
                                    <td>5407</td>
                                    <td>a.satou@datatables.net</td>
                                </tr>
                                <tr>
                                    <td>Brielle</td>
                                    <td>Williamson</td>
                                    <td>Integration Specialist</td>
                                    <td>New York</td>
                                    <td>61</td>
                                    <td>2012/12/02</td>
                                    <td>$372,000</td>
                                    <td>4804</td>
                                    <td>b.williamson@datatables.net</td>
                                </tr>
                                <tr>
                                    <td>Herrod</td>
                                    <td>Chandler</td>
                                    <td>Sales Assistant</td>
                                    <td>San Francisco</td>
                                    <td>59</td>
                                    <td>2012/08/06</td>
                                    <td>$137,500</td>
                                    <td>9608</td>
                                    <td>h.chandler@datatables.net</td>
                                </tr>
                                <tr>
                                    <td>Rhona</td>
                                    <td>Davidson</td>
                                    <td>Integration Specialist</td>
                                    <td>Tokyo</td>
                                    <td>55</td>
                                    <td>2010/10/14</td>
                                    <td>$327,900</td>
                                    <td>6200</td>
                                    <td>r.davidson@datatables.net</td>
                                </tr>
                                <tr>
                                    <td>Colleen</td>
                                    <td>Hurst</td>
                                    <td>Javascript Developer</td>
                                    <td>San Francisco</td>
                                    <td>39</td>
                                    <td>2009/09/15</td>
                                    <td>$205,500</td>
                                    <td>2360</td>
                                    <td>c.hurst@datatables.net</td>
                                </tr>
                                <tr>
                                    <td>Sonya</td>
                                    <td>Frost</td>
                                    <td>Software Engineer</td>
                                    <td>Edinburgh</td>
                                    <td>23</td>
                                    <td>2008/12/13</td>
                                    <td>$103,600</td>
                                    <td>1667</td>
                                    <td>s.frost@datatables.net</td>
                                </tr>
                                <tr>
                                    <td>Jena</td>
                                    <td>Gaines</td>
                                    <td>Office Manager</td>
                                    <td>London</td>
                                    <td>30</td>
                                    <td>2008/12/19</td>
                                    <td>$90,560</td>
                                    <td>3814</td>
                                    <td>j.gaines@datatables.net</td>
                                </tr>
                                 <tr>
                                    <td>Sakura</td>
                                    <td>Yamamoto</td>
                                    <td>Support Engineer</td>
                                    <td>Tokyo</td>
                                    <td>37</td>
                                    <td>2009/08/19</td>
                                    <td>$139,575</td>
                                    <td>9383</td>
                                    <td>s.yamamoto@datatables.net</td>
                                </tr>
                                <tr>
                                    <td>Thor</td>
                                    <td>Walton</td>
                                    <td>Developer</td>
                                    <td>New York</td>
                                    <td>61</td>
                                    <td>2013/08/11</td>
                                    <td>$98,540</td>
                                    <td>8327</td>
                                    <td>t.walton@datatables.net</td>
                                </tr>
                                <tr>
                                    <td>Finn</td>
                                    <td>Camacho</td>
                                    <td>Support Engineer</td>
                                    <td>San Francisco</td>
                                    <td>47</td>
                                    <td>2009/07/07</td>
                                    <td>$87,500</td>
                                    <td>2927</td>
                                    <td>f.camacho@datatables.net</td>
                                </tr>
                                <tr>
                                    <td>Serge</td>
                                    <td>Baldwin</td>
                                    <td>Data Coordinator</td>
                                    <td>Singapore</td>
                                    <td>64</td>
                                    <td>2012/04/09</td>
                                    <td>$138,575</td>
                                    <td>8352</td>
                                    <td>s.baldwin@datatables.net</td>
                                </tr>
                                <tr>
                                    <td>Zenaida</td>
                                    <td>Frank</td>
                                    <td>Software Engineer</td>
                                    <td>New York</td>
                                    <td>63</td>
                                    <td>2010/01/04</td>
                                    <td>$125,250</td>
                                    <td>7439</td>
                                    <td>z.frank@datatables.net</td>
                                </tr>
                                <tr>
                                    <td>Zorita</td>
                                    <td>Serrano</td>
                                    <td>Software Engineer</td>
                                    <td>San Francisco</td>
                                    <td>56</td>
                                    <td>2012/06/01</td>
                                    <td>$115,000</td>
                                    <td>4389</td>
                                    <td>z.serrano@datatables.net</td>
                                </tr>
                                <tr>
                                    <td>Jennifer</td>
                                    <td>Acosta</td>
                                    <td>Junior Javascript Developer</td>
                                    <td>Edinburgh</td>
                                    <td>43</td>
                                    <td>2013/02/01</td>
                                    <td>$75,650</td>
                                    <td>3431</td>
                                    <td>j.acosta@datatables.net</td>
                                </tr>
                                <tr>
                                    <td>Cara</td>
                                    <td>Stevens</td>
                                    <td>Sales Assistant</td>
                                    <td>New York</td>
                                    <td>46</td>
                                    <td>2011/12/06</td>
                                    <td>$145,600</td>
                                    <td>3990</td>
                                    <td>c.stevens@datatables.net</td>
                                </tr>
                                <tr>
                                    <td>Hermione</td>
                                    <td>Butler</td>
                                    <td>Regional Director</td>
                                    <td>London</td>
                                    <td>47</td>
                                    <td>2011/03/21</td>
                                    <td>$356,250</td>
                                    <td>1016</td>
                                    <td>h.butler@datatables.net</td>
                                </tr>
                                <tr>
                                    <td>Lael</td>
                                    <td>Greer</td>
                                    <td>Systems Administrator</td>
                                    <td>London</td>
                                    <td>21</td>
                                    <td>2009/02/27</td>
                                    <td>$103,500</td>
                                    <td>6733</td>
                                    <td>l.greer@datatables.net</td>
                                </tr>
                                <tr>
                                    <td>Jonas</td>
                                    <td>Alexander</td>
                                    <td>Developer</td>
                                    <td>San Francisco</td>
                                    <td>30</td>
                                    <td>2010/07/14</td>
                                    <td>$86,500</td>
                                    <td>8196</td>
                                    <td>j.alexander@datatables.net</td>
                                </tr>
                                <tr>
                                    <td>Shad</td>
                                    <td>Decker</td>
                                    <td>Regional Director</td>
                                    <td>Edinburgh</td>
                                    <td>51</td>
                                    <td>2008/11/13</td>
                                    <td>$183,000</td>
                                    <td>6373</td>
                                    <td>s.decker@datatables.net</td>
                                </tr>
                                <tr>
                                    <td>Michael</td>
                                    <td>Bruce</td>
                                    <td>Javascript Developer</td>
                                    <td>Singapore</td>
                                    <td>29</td>
                                    <td>2011/06/27</td>
                                    <td>$183,000</td>
                                    <td>5384</td>
                                    <td>m.bruce@datatables.net</td>
                                </tr>
                                <tr>
                                    <td>Donna</td>
                                    <td>Snider</td>
                                    <td>Customer Support</td>
                                    <td>New York</td>
                                    <td>27</td>
                                    <td>2011/01/25</td>
                                    <td>$112,000</td>
                                    <td>4226</td>
                                    <td>d.snider@datatables.net</td>
                                </tr>
                            </tbody>
                        </table>

                    这可以在数据表的帮助下轻松完成。数据表新手,请参考https://datatables.net/。它是一个插件,提供了很多功能。在给出的代码中,表头是固定的,前3列是固定的,还有其他几个功能。

                    【讨论】:

                    • 如果您同时需要固定列和固定标题,则不起作用
                    【解决方案20】:

                    我没有检查这个问题的每一个答案,但在分析了大多数答案后,我发现如果单元格或头部中的多行数据,设计会失败。我使用 Javascript 来解决这个问题。我希望有人觉得这很有帮助。

                    https://codepen.io/kushagrarora/pen/zeYaoY

                    var freezeTables = document.getElementsByClassName("freeze-pane");
                    
                    [].forEach.call(freezeTables, ftable => {
                      var wrapper = document.createElement("div");
                      wrapper.className = "freeze-pane-wrapper";
                      var scroll = document.createElement("div");
                      scroll.className = "freeze-pane-scroll";
                    
                      wrapper.appendChild(scroll);
                    
                      ftable.parentNode.replaceChild(wrapper, ftable);
                    
                      scroll.appendChild(ftable);
                    
                      var heads = ftable.querySelectorAll("th:first-child");
                    
                      let maxWidth = 0;
                    
                      [].forEach.call(heads, head => {
                        var w = window
                          .getComputedStyle(head)
                          .getPropertyValue("width")
                          .split("px")[0];
                        if (Number(w) > Number(maxWidth)) maxWidth = w;
                      });
                    
                      ftable.parentElement.style.marginLeft = maxWidth + "px";
                      ftable.parentElement.style.width = "calc(100% - " + maxWidth + "px)";
                      [].forEach.call(heads, head => {
                        head.style.width = maxWidth + "px";
                        var restRowHeight = window
                          .getComputedStyle(head.nextElementSibling)
                          .getPropertyValue("height");
                        var headHeight = window.getComputedStyle(head).getPropertyValue("height");
                        if (headHeight > restRowHeight)
                          head.nextElementSibling.style.height = headHeight;
                        else head.style.height = restRowHeight;
                      });
                    });
                    @import url("https://fonts.googleapis.com/css?family=Open+Sans");
                    * {
                      font-family: "Open Sans", sans-serif;
                    }
                    
                    .container {
                      width: 400px;
                      height: 90vh;
                      border: 1px solid black;
                      overflow: hidden;
                    }
                    
                    table,
                    th,
                    td {
                      border: 1px solid #eee;
                    }
                    
                    .table {
                      width: 100%;
                      margin-bottom: 1rem;
                      table-layout: fixed;
                      border-collapse: collapse;
                    }
                    
                    .freeze-pane-wrapper {
                      position: relative;
                    }
                    
                    .freeze-pane-scroll {
                      overflow-x: scroll;
                      overflow-y: visible;
                    }
                    
                    .freeze-pane th:first-child {
                      position: absolute;
                      background-color: pink;
                      left: 0;
                      top: auto;
                      max-width: 40%;
                    }
                    <div class="container">
                      <table class="freeze-pane">
                        <tbody>
                          <tr>
                            <th>
                              <p>Model</p>
                            </th>
                            <th>
                              <p>Mercedes Benz AMG C43 4dr</p>
                            </th>
                            <th>
                              <p>Audi S4 Premium 4dr</p>
                            </th>
                            <th>
                              <p>BMW 440i 4dr sedan</p>
                            </th>
                          </tr>
                          <tr>
                            <th>
                              <p>Passenger capacity</p>
                            </th>
                            <td>
                              <p>5</p>
                            </td>
                            <td>
                              <p>5</p>
                            </td>
                            <td>
                              <p>5</p>
                            </td>
                          </tr>
                          <tr>
                            <th>
                              <p>Front (Head/Shoulder/Leg) (In.)</p>
                            </th>
                            <td>
                              <p>37.1/55.3/41.7</p>
                            </td>
                            <td>
                              <p>38.9/55.9/41.3</p>
                            </td>
                            <td>
                              <p>39.9/54.8/42.2</p>
                            </td>
                          </tr>
                          <tr>
                            <th>
                              <p>Second (Head/Shoulder/Leg) (In.)</p>
                            </th>
                            <td>
                              <p>37.1/55.5/35.2</p>
                            </td>
                            <td>
                              <p>37.4/54.5/35.7</p>
                            </td>
                            <td>
                              <p>36.9/54.3/33.7</p>
                            </td>
                          </tr>
                        </tbody>
                      </table>
                    </div>

                    注意:“container” div 只是为了证明代码与 mobile-view 兼容。

                    【讨论】:

                      【解决方案21】:

                      我刚刚将表格最右侧的粘性列设置为粘性。

                      th:last-of-type {
                       position: sticky;
                       right: 0;
                       width: 120px;
                       background: #f7f7f7;
                      }
                      
                      
                      td:last-of-type {
                       position: sticky;
                       right: 0;
                       background: #f7f7f7;
                       width: 120px;
                      }
                      

                      我相信如果你这样做{position: sticky; left: 0;},你会得到想要的结果。

                      【讨论】:

                      • 很遗憾sticky 不受 IE 支持。
                      【解决方案22】:
                      .div1 {
                          width: 600px;
                          height: 400px;
                          overflow: scroll;
                          border: 1px solid #777777;
                      }
                      
                      .div1 table {
                          border-spacing: 0;
                      }
                      
                      .div1 th {
                          border-left: none;
                          border-right: 1px solid #bbbbbb;
                          padding: 5px;
                          width: 80px;
                          min-width: 80px;
                          position: sticky;
                          top: 0;
                          background: #727272;
                          color: #e0e0e0;
                          font-weight: normal;
                      }
                      
                      .div1 td {
                          border-left: none;
                          border-right: 1px solid #bbbbbb;
                          border-bottom: 1px solid #bbbbbb;
                          padding: 5px;
                          width: 80px;
                          min-width: 80px;
                      }
                      
                      .div1 th:nth-child(1),
                      .div1 td:nth-child(1) {
                          position: sticky;
                          left: 0;
                          width: 150px;
                          min-width: 150px;
                      }
                      
                      .div1 th:nth-child(2),
                      .div1 td:nth-child(2) {
                          position: sticky;
                          /* 1st cell left/right padding + 1st cell width + 1st cell left/right border width */
                          /* 0 + 5 + 150 + 5 + 1 */
                          left: 161px;
                          width: 50px;
                          min-width: 50px;
                      }
                      
                      .div1 td:nth-child(1),
                      .div1 td:nth-child(2) {
                          background: #ffebb5;
                      }
                      
                      .div1 th:nth-child(1),
                      .div1 th:nth-child(2) {
                          z-index: 2;
                      }
                      

                      HTML,

                      <div class="div1">
                          <table>
                              <tr>
                                  <th>Column 1</th>
                                  <th>Column 2</th>
                                  <th>Column 3</th>
                                  <th>Column 4</th>
                                  <th>Column 5</th>
                                  <th>Column 6</th>
                              </tr>
                              <tr>
                                  <td>Row Data 1</td>
                                  <td>Row Data 2</td>
                                  <td>Row Data 3</td>
                                  <td>Row Data 4</td>
                                  <td>Row Data 5</td>
                                  <td>Row Data 6</td>
                              </tr>
                              <tr>
                                  <td>Row Data 1</td>
                                  <td>Row Data 2</td>
                                  <td>Row Data 3</td>
                                  <td>Row Data 4</td>
                                  <td>Row Data 5</td>
                                  <td>Row Data 6</td>
                              </tr>
                          </table>
                      </div>
                      

                      Youtube 视频演练:https://www.youtube.com/watch?v=_dpSEjaKqSE

                      示例 1:固定宽度和高度

                      https://adriancs.com/demo/freeze_table_column_row.html

                      示例 2:响应式宽度和高度(使用视口调整)

                      https://adriancs.com/html-css-js/298/html-table-freeze-row-and-column-with-css/

                      完整教程说明:

                      https://adriancs.com/demo/freeze_table_column_row_responsive_viewport.html

                      【讨论】:

                        【解决方案23】:

                        在 HTML5 中,您可以使用 CSS style.transform
                        但是,如果您在 Mac 上实现,我建议您关闭“在页面之间滑动”。

                        look at sample codePen

                        let l  = 0;
                        let t  = 0;
                        
                        const MouseWheelHandler = (e) => {
                          // vertical scroll
                          if (e.deltaX == -0) {
                            // t = t - e.deltaY
                        
                          // horizonal scroll
                          } else if (e.deltaY == -0) {
                            l = l - e.deltaX
                            if (l >= 0) {
                              l = 0;
                              document.getElementById("gantt_task").style.transform = "translateX(1px)"
                              document.getElementById("gantt_task_header").style.transform = "translateX(1px)"
                              return false
                            } 
                            document.getElementById("gantt_task").style.transform = "translateX(" + l.toString() + "px)"
                            document.getElementById("gantt_task_header").style.transform = "translateX(" + l.toString() + "px)"
                          }
                          return false;
                        }
                        
                        window.addEventListener("wheel", MouseWheelHandler, false);
                        .row {
                          border-bottom: 1px solid #979A9A
                        }
                        #gantt_grid_header {
                          height:   30px;
                          width:    100px;
                          position: fixed;
                          z-index:  3;
                          top:      0px;
                          left:     0px;
                          border:   1px solid #cecece;
                          background-color: #F08080;
                        }     
                        
                        #gantt_task_header {
                          height:   30px;
                          width:    400px;
                          position: fixed;
                          z-index:  2;
                          top:      0px;
                          left:     100px;
                          border:   1px solid #cecece;
                          background-color: #FFC300;
                        }
                        
                        #gantt_grid {
                          width:    100px; 
                          height:   400px;
                          position: absolute;
                          left:     0px;
                          top:      0px;
                          z-index:  1;
                          border:   1px solid #cecece;
                          background-color: #DAF7A6;
                        }
                        
                        #gantt_task {
                          width:    400px; 
                          height:   400px;
                          position: absolute;
                          left:     100px;
                          top:      0px;
                          border:   1px solid #cecece;
                          background-color: #FF5733;
                        }
                        <html>
                            <div id="gantt_grid_header">
                              HEADER
                            </div>
                            <div id="gantt_grid">
                              <div class="row">V Scroll OK</div>
                              <div class="row">V Scroll OK</div>
                              <div class="row">V Scroll OK</div>
                              <div class="row">V Scroll OK</div>
                              <div class="row">V Scroll OK</div>
                              <div class="row">V Scroll OK</div>
                              <div class="row">V Scroll OK</div>
                              <div class="row">V Scroll OK</div>
                              <div class="row">V Scroll OK</div>
                            </div>
                            <div id="gantt_task_header">
                              DATA HEADER
                            </div>
                            <div id="gantt_task">
                              <div class="row">Vertical,Horizenal Scroll OK</div>
                              <div class="row">Vertical,Horizenal Scroll OK</div>
                              <div class="row">Vertical,Horizenal Scroll OK</div>
                              <div class="row">Vertical,Horizenal Scroll OK</div>
                              <div class="row">Vertical,Horizenal Scroll OK</div>
                              <div class="row">Vertical,Horizenal Scroll OK</div>
                              <div class="row">Vertical,Horizenal Scroll OK</div>
                              <div class="row">Vertical,Horizenal Scroll OK</div>
                              <div class="row">Vertical,Horizenal Scroll OK</div>
                            </div>
                        </html>

                        【讨论】:

                        • 在极少数情况下,您可以期望您的用户关闭操作系统功能才能使用您的网站。
                        【解决方案24】:

                        如果您不想过多地触摸当前表格,可以在表格前面制作一个假固定列。

                        这个例子展示了一种不使用 JS 的方法

                        table {
                          border-collapse: collapse;
                          border-spacing: 0;
                          border: 1px solid #ddd;
                          min-width: 600px;
                        }
                        
                        .labels {
                          display:flex;
                          flex-direction: column
                        }
                        
                        .overflow {
                          overflow-x: scroll;
                          min width: 400px;
                          flex: 1;
                        }
                        
                        .label {
                          display: flex;
                          align-items: center;
                          white-space:nowrap;
                          padding: 10px;
                          flex: 1;
                          border-bottom: 1px solid #ddd;
                          border-right: 2px solid #ddd;
                        }
                        
                        .label:last-of-type {
                          overflow-x: scroll;
                          border-bottom: 0;
                        }
                        
                        td {
                          border: 1px solid #ddd;
                          padding: 10px;
                        }
                        
                        .flex {
                          display:flex;
                          max-width: 600px;
                          padding: 0;
                          border: 5px solid #ddd;
                        }
                        <div class="flex">
                          <div class="labels">
                            <span class="label">Label 1</span>
                            <span class="label">Lorem ipsum dolor sit amet.</span>
                            <span class="label">Lorem ipsum dolor.</span>
                          </div>
                          <div class="overflow">
                            <table>
                              <tr>
                                <td class="long">Lorem ipsum dolor sit amet consectetur adipisicing</td>
                                <td class="long">Lorem ipsum dolor sit amet consectetur adipisicing</td>
                              </tr>
                              <tr>
                                <td class="long">Lorem ipsum dolor sit amet consectetur adipisicing</td>
                                <td class="long">Lorem ipsum dolor sit amet consectetur adipisicing</td>
                              </tr>
                              <tr>
                                <td class="long">Lorem ipsum dolor sit amet consectetur adipisicing</td>
                                <td class="long">Lorem ipsum dolor sit amet consectetur adipisicing</td>
                              </tr>
                          </table>
                          </div>
                        </div>

                        【讨论】:

                          猜你喜欢
                          • 2010-11-09
                          • 1970-01-01
                          • 2014-07-20
                          • 1970-01-01
                          • 2017-06-19
                          • 2012-01-27
                          • 2023-03-16
                          • 2017-11-16
                          • 1970-01-01
                          相关资源
                          最近更新 更多