要使表格表头粘性生效,必须为每个 th 添加 sticky top-0,并确保其父容器具备 min-h-[400px] 和 overflow-y-auto,同时启用 table-fixed 及每列显式等宽,th 还需设置 bg-white 和 z-50。

直接给 thead 加 sticky top-0 一定不生效——浏览器根本不支持对 thead 应用 position: sticky,真正要粘住的是每个 th 单元格。
为什么 th 加了 sticky top-0 还是不动
sticky 的触发依赖「最近的、有滚动行为的祖先容器」。表格本身(table)默认不是块级可滚动容器,也不会创建滚动上下文;如果外层没设 overflow-y-auto 或明确高度,tbody 就会把整个页面撑开,sticky 根本没机会激活。
- 检查包裹表格的
div是否同时具备:max-h-96(或h-[400px]、min-h-[400px])、overflow-y-auto,缺一不可 - Safari 对高度计算敏感,推荐用
min-h-[400px]替代h-[400px],避免首次渲染高度为 0 - 父容器若含
transform、filter或will-change,Safari 会直接禁用 sticky —— 删掉这些类再试 - 确保该祖先容器没有被更上层的
overflow-x-hidden截断滚动链
th 粘住了但列宽错位、背景透出
错位不是 sticky 问题,而是表格列宽渲染机制导致的:thead 和 tbody 默认各自按内容算列宽,一旦滚动,视觉就撕裂。
- 必须加
table-fixed,强制整表使用统一列宽规则 - 每个
th和对应td都要显式设相同宽度,如w-32、min-w-[120px],别依赖colgroup -
th必须带bg-white+z-10(或更高,如z-50),否则滚动时tbody内容会盖住表头边框或背景色 - 长文本用
whitespace-nowrap或truncate,防止换行撑开列宽
移动端 Safari 表头闪动或首次滚动失效
iOS 15.4 及更早版本对 sticky 触发条件极苛刻,常见于地址栏缩放抖动、z-index 未显式声明、或容器高度计算失败。
立即学习“前端免费学习笔记(深入)”;
- 包裹容器改用
min-h-[400px],避免 Safari 渲染时高度取 0 -
th上必须写z-50,z-10在部分 Safari 层叠上下文中不够用 - 不用
top-safe-0和top-0共存;仅在启用@tailwindcss/safe-area-insets插件后才可用top-safe-0 - 禁用
body上的scroll-behavior: smooth,它在某些 iOS 版本中干扰 sticky 初始化
最易被忽略的是:table-fixed 和每列显式宽度必须成对出现,缺一不可;哪怕只漏一个 td 没设宽,整行都会错位。这不是兼容性问题,是表格渲染引擎的固有行为。



















