sticky失效主因是父容器height:100vh限制了粘性范围,应改用min-height:100vh;同时需检查祖先元素的overflow、transform等属性是否创建了新的滚动上下文或层叠上下文。
写了 position: sticky,滚动到一半就“掉下去”,不是 CSS 写错了,大概率是父容器被 height: 100vh 锁死了高度。浏览器会把 sticky 的作用域严格限制在这个固定高度内——哪怕页面内容撑到了 300vh,.header 也只能在前 100vh 内粘住,之后就退回文档流。
min-height: 100vh:既保底视口高度,又允许随内容自然伸展height: 100vh 或 max-height: 100vh:它们会物理性截断粘性范围height(哪怕不是 100vh),且内容实际超出它,就可能成为“隐形边界”浏览器不会默认拿 body 或 html 当滚动容器——它只认**最近的、有溢出且可滚动的祖先**。如果中间某层加了 overflow: auto,哪怕内容没溢出,它也会被当作“滚动上下文”,结果 sticky 只在那一小块里起作用。
position 值:滚动时要是变回 relative,说明上下文丢了overflow:尤其警惕 overflow: hidden —— 它直接禁用 stickybody 作为 sticky 上下文,必须手动建一个 .scroll-container
哪怕只是给 sticky 元素或其任意祖先加了一行 transform: translateZ(0),sticky 就会立刻失效。这不是兼容性问题,而是规范行为:这些属性会创建新的层叠上下文和格式化上下文,把 sticky “关进小黑屋”。
transform、filter、will-change、perspective
transform 移到更外层容器,或改用 margin-top 替代z-index 在这种场景下也靠不住:一旦创建新层叠上下文,z-index 就只在那个小范围里生效很多人测 sticky 时只放了三两行文字,页面根本滚不起来。sticky 不是“悬浮”,而是“滚动吸附”——没有滚动,就没有粘性。
立即学习“前端免费学习笔记(深入)”;
.item 堆高 .main)border 或 outline 看父容器是否真有滚动条出现height: 100%:它常和 1fr 冲突,导致父容器高度计算异常,间接让 sticky 失效