【问题标题】:Position sticky on thead贴在头上的位置
【发布时间】:2025-12-23 07:30:17
【问题描述】:

您可能知道,position: sticky; 已登陆 Webkit (demo)。 到目前为止,我可以看到这只适用于父元素。但我想知道我是否可以在带有表格的滚动 div 中使用它。

所以它需要“监听”div 的滚动事件,而不是 table

我知道我可以使用 javascript 和绝对定位来做到这一点,但我想知道 sticky-positioning 是否支持这一点。

【问题讨论】:

    标签: html css


    【解决方案1】:

    2018 年在 头顶 工作!

    在您的样式表中添加这一行:

    thead th { position: sticky; top: 0; }
    

    您的表格需要包含 theadth 才能设置样式。

    <table>
        <thead>
            <tr>
                <th>column 1</th>
                <th>column 2</th>
                <th>column 3</th>
                <th>column 4</th>            
            </tr>    
        </thead>
        <tbody>
          // your body code
        </tbody>
    </table>
    

    另外,如果您在 thead 中有多行,您可以选择第一行以保持粘性:

    thead tr:first-child th { position: sticky; top: 0; }
    

    截至 2018 年 3 月,现代浏览器几乎都提供支持 参考:https://caniuse.com/#feat=css-sticky

    这个归功于 @ctf0 (ref comment made 3 Dec 2017)

    【讨论】:

    • 由于这个错误,它不能按预期工作 (thead { position: sticky }):bugs.chromium.org/p/chromium/issues/detail?id=702927
    • 只适用于我,只需 thead 作为选择器,overflow: auto 在表格的父元素上。
    • 如果我的头中有多行,它可以工作吗?
    • 很好的答案。诀窍是位置必须在第 th 元素上,并且父元素不能有溢出:隐藏。
    • 在此添加重要提示:firefox 能够粘贴整个 THEAD,即使它有多个 TR。铬不能。您必须单独粘贴所有单元格,并给出第一行单元格top:0 和后续行top:20pxtop:40px 等... 糟糕的DX
    【解决方案2】:

    如果您只需要 chrome 的粘性标题,那么您可以在 thead 元素中为 td 元素设置 position: sticky; top: some_valuetop 属性是必需的)。

    见:

    <table border=1>
      <thead>
        <tr>
          <td style='position: sticky; top: -1px;background: red'>Sticky Column</td>
          <td>Simple column</td>
        </tr>
      </thead>
    

    table with a stiky header

    【讨论】:

    • 对我来说解决方案是thead th {position: sticky; top: 0;}
    • 这是 imo 更好的答案。仅使用 position: sticky 对我不起作用。添加top 规则效果很好!
    • 太棒了....一直在寻找很长时间....这对 chrome 浏览器很有帮助.....您还需要正确设置背景颜色和颜色以匹配.... .可能对某人有帮助。
    • @FilipeEsperandio 这是 Chrome/FF 中的一个错误,奇怪地在 Chrome 的跟踪器中被标记为已解决。令人沮丧的是,这是 Edge 做对的少数几件事之一。
    【解决方案3】:

    position: sticky 不适用于表格元素(只要它们的display 属性以table- 开头),因为表格不是specification 的一部分:

    其他类型的布局,例如表格、“浮动”框、ruby 注释、网格布局、列和正常“流”内容的基本处理,在其他模块中进行了描述。


    编辑:截至 2019 年 7 月,根据 https://caniuse.com/#feat=css-sticky Firefox 支持此功能,Chrome 至少支持 &lt;th&gt; 标签。

    【讨论】:

    • 不确定。 Mozilla 显然正在努力发布这个:bugzilla.mozilla.org/show_bug.cgi?id=975644
    • @retrovertigo 现在已经修复了。
    • @Qwertie 感谢您的更新 :) “在 Firefox 59 中已验证已修复”
    • Position Sticky for thead 于 2018 年工作,请参阅下面的更新答案:*.com/a/49270067/172651
    • 对 2019 年 7 月编辑的更正:Firefox 在 MacOS 上支持 thead 元素上的 position: sticky。根据我的测试,Windows 上的 Firefox 69 彻底搞砸了,忽略背景颜色,但不忽略文本颜色(产生完全难以辨认的标题),并使元素在滚动时随机出现和消失。 Webkit 目前不支持 thead,将其视为 position: static(或相对的 - 不确定差异对于 thead 元素是否真的有意义)。
    【解决方案4】:

    事实证明,position: sticky 仅在窗口中有效,在滚动 div 中无效。

    我创建了一个test-case,其中包含一个带有表头的很长的表:

    h1 {
      font-size: 18px;
      font-weight: bold;
      margin: 10px 0;
    }
    
    div.testTable {
      height: 200px;
      overflow: auto;
    }
    
    table.stickyHead thead {
      position: -webkit-sticky;
      top: 0px;
      background: grey;
    }
    
    table.stickyHead td,
    table.stickyHead th {
      padding: 2px 3px;
    }
    <h1>Position sticky</h1>
    <div class="testTable">
      <table class="stickyHead">
        <thead>
          <tr>
            <th>column 1</th>
            <th>column 2</th>
            <th>column 3</th>
            <th>column 4</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td>1</td>
            <td>2</td>
            <td>3</td>
            <td>4</td>
          </tr>
          <tr>
            <td>1</td>
            <td>2</td>
            <td>3</td>
            <td>4</td>
          </tr>
          <tr>
            <td>1</td>
            <td>2</td>
            <td>3</td>
            <td>4</td>
          </tr>
          <tr>
            <td>1</td>
            <td>2</td>
            <td>3</td>
            <td>4</td>
          </tr>
          <tr>
            <td>1</td>
            <td>2</td>
            <td>3</td>
            <td>4</td>
          </tr>
          <tr>
            <td>1</td>
            <td>2</td>
            <td>3</td>
            <td>4</td>
          </tr>
          <tr>
            <td>1</td>
            <td>2</td>
            <td>3</td>
            <td>4</td>
          </tr>
          <tr>
            <td>1</td>
            <td>2</td>
            <td>3</td>
            <td>4</td>
          </tr>
          <tr>
            <td>1</td>
            <td>2</td>
            <td>3</td>
            <td>4</td>
          </tr>
          <tr>
            <td>1</td>
            <td>2</td>
            <td>3</td>
            <td>4</td>
          </tr>
          <tr>
            <td>1</td>
            <td>2</td>
            <td>3</td>
            <td>4</td>
          </tr>
          <tr>
            <td>1</td>
            <td>2</td>
            <td>3</td>
            <td>4</td>
          </tr>
          <tr>
            <td>1</td>
            <td>2</td>
            <td>3</td>
            <td>4</td>
          </tr>
          <tr>
            <td>1</td>
            <td>2</td>
            <td>3</td>
            <td>4</td>
          </tr>
          <tr>
            <td>1</td>
            <td>2</td>
            <td>3</td>
            <td>4</td>
          </tr>
          <tr>
            <td>1</td>
            <td>2</td>
            <td>3</td>
            <td>4</td>
          </tr>
          <tr>
            <td>1</td>
            <td>2</td>
            <td>3</td>
            <td>4</td>
          </tr>
        </tbody>
      </table>
    </div>

    如您所见,如果您从包装中移除溢出物并使窗口不那么高,则表头会粘在窗口顶部。我不适用于包装div,即使您给出div position: relative

    【讨论】:

    • 测试用例在 Firefox 和 Chrome 中都不起作用(对 position:sticky 的支持可能已从 Blink 中删除)。目前支持caniuse.com/#feat=css-sticky
    • bugzilla 中有一个错误:bugzilla.mozilla.org/show_bug.cgi?id=975644
    • 这不正确(或不再正确)。我通过了你的测试,只做了两个更改就让粘性标题工作正常:我将 -webkit- 前缀从位置上删除,并将位置设置在 th 上,而不是thead:jsfiddle.net/xNsaM/128 工作正常。
    • 现在看来只能在 firefox 上运行,但是如果将 overflow-x 设置为 auto 则无法运行
    【解决方案5】:

    注意:

    posotion:sticiky 在 2019 年的谷歌浏览器上不再工作,尝试使用 fixed 或 display:inline-block

    【讨论】:

    • 取自之前的答案,请谨慎使用sticky:这在 Chrome v35 到 v51 上不起作用,Chrome 52 使用实验性网络平台功能标志重新启用此功能。从 Chrome 56 开始:sticky 开箱即用。