【发布时间】:2025-12-23 07:30:17
【问题描述】:
您可能知道,position: sticky; 已登陆 Webkit (demo)。
到目前为止,我可以看到这只适用于父元素。但我想知道我是否可以在带有表格的滚动 div 中使用它。
所以它需要“监听”div 的滚动事件,而不是 table。
我知道我可以使用 javascript 和绝对定位来做到这一点,但我想知道 sticky-positioning 是否支持这一点。
【问题讨论】:
您可能知道,position: sticky; 已登陆 Webkit (demo)。
到目前为止,我可以看到这只适用于父元素。但我想知道我是否可以在带有表格的滚动 div 中使用它。
所以它需要“监听”div 的滚动事件,而不是 table。
我知道我可以使用 javascript 和绝对定位来做到这一点,但我想知道 sticky-positioning 是否支持这一点。
【问题讨论】:
2018 年在 头顶 工作!
在您的样式表中添加这一行:
thead th { position: sticky; top: 0; }
您的表格需要包含 thead 和 th 才能设置样式。
<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 在表格的父元素上。
top:0 和后续行top:20px、top:40px 等... 糟糕的DX
如果您只需要 chrome 的粘性标题,那么您可以在 thead 元素中为 td 元素设置 position: sticky; top: some_value(top 属性是必需的)。
见:
<table border=1>
<thead>
<tr>
<td style='position: sticky; top: -1px;background: red'>Sticky Column</td>
<td>Simple column</td>
</tr>
</thead>
【讨论】:
thead th {position: sticky; top: 0;}
position: sticky 对我不起作用。添加top 规则效果很好!
position: sticky 不适用于表格元素(只要它们的display 属性以table- 开头),因为表格不是specification 的一部分:
其他类型的布局,例如表格、“浮动”框、ruby 注释、网格布局、列和正常“流”内容的基本处理,在其他模块中进行了描述。
编辑:截至 2019 年 7 月,根据 https://caniuse.com/#feat=css-sticky Firefox 支持此功能,Chrome 至少支持 <th> 标签。
【讨论】:
thead 元素上的 position: sticky。根据我的测试,Windows 上的 Firefox 69 彻底搞砸了,忽略背景颜色,但不忽略文本颜色(产生完全难以辨认的标题),并使元素在滚动时随机出现和消失。 Webkit 目前不支持 thead,将其视为 position: static(或相对的 - 不确定差异对于 thead 元素是否真的有意义)。
事实证明,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
【讨论】:
position:sticky 的支持可能已从 Blink 中删除)。目前支持caniuse.com/#feat=css-sticky
-webkit- 前缀从位置上删除,并将位置设置在 th 上,而不是thead:jsfiddle.net/xNsaM/128 工作正常。
注意:
posotion:sticiky 在 2019 年的谷歌浏览器上不再工作,尝试使用 fixed 或 display:inline-block
【讨论】: