返回
UI · №09 · PLATE

导航怎么钉住(怎么选)Sticky vs Fixed

滚动时导航要不要一直在顶上Header 应该 sticky 还是 fixed侧栏跟着内容走还是钉在窗口为什么 sticky 滚到一半就失效了

先看怎么选

你想让导航或工具条在滚动时留在眼前。先问它属于哪块内容、要不要占页面空间,以及它应该在哪个边界停下;选错的代价是内容被盖住、页脚永远碰不到,或 sticky 看起来根本没生效。

朱批跟着某个内容区、到边界就停 → Sticky;无论页面滚到哪里都要贴住视口 → Fixed,并给正文预留空间。

LIVE SPECIMEN真的能玩,点点看
STICKY跟着容器
文章开头
容器边界
FIXED跟着视口
内容继续
scrollTop 0px

粘性定位

position: sticky

元素先按正常文档流排版,滚动到阈值后在指定方向“粘”住,直到它的父容器边界离开视口。

适合
章节导航、表格表头、内容区工具条等,它们只需要在所属内容还可见时保持可达。
不适合
元素必须跨越多个容器、覆盖整个页面,或祖先有会裁剪滚动的 overflow 导致边界不可预期时。
实现细节与 Prompt
web
position: sticky; top: 0; z-index
前提
滚动祖先边界明确;祖先不要随意 overflow: hidden
布局
仍占文档流空间,不需要额外 padding 防遮挡
Make the section navigation sticky within its article container: use position: sticky with a top offset below the site header, keep it in normal document flow, stop it at the container boundary, and verify that no ancestor overflow rule breaks the sticky constraint.

固定定位

position: fixed

元素脱离文档流,直接相对浏览器视口定位;页面滚动、父容器内容变化时,它仍停在同一个视口坐标。

适合
全局 Header、返回顶部、客服入口或必须随时可用的全局工具,不属于某一段内容的生命周期。
不适合
只是想让一段文章的局部导航保持可见,或页面需要自然滚到 footer 时;固定元素会占据视线并可能遮住内容。
实现细节与 Prompt
web
position: fixed; inset-block-start: 0; z-index
布局
正文预留对应 padding / margin,处理刘海屏 safe-area
性能
谨慎叠加 backdrop-filter 与大面积重绘
Pin the global header to the viewport with position: fixed and a deliberate z-index. Add equivalent top padding to the page content so the header never covers the first heading, account for env(safe-area-inset-top), and keep focus order and skip links usable.

详细说明

“钉住”不是一个视觉效果,而是一个边界问题。sticky 仍属于原来的内容区,fixed 则属于视口;先画出边界,再决定 CSS 定位方式。

先看它要跟谁走

问三个问题就够了:

  1. 元素是否属于某个章节、表格或文章?
  2. 它离开这个容器后,是否应该消失?
  3. 它是否必须在整站任何位置都可用?

前两个问题回答“是”,通常选 sticky;最后一个回答“是”,才考虑 fixed。如果只是希望 Header 在阅读时保留,先试 sticky,页面结构会更自然。

Sticky 的边界来自父容器

sticky 的元素先占着自己的位置,滚动到 top 阈值才停止移动。它不会穿过父容器的底部,所以章节导航会在章节结束时一起离开。这个特性让多个章节可以各自拥有导航,也不会把页脚挡住。

它最常见的失效原因不是浏览器不支持,而是滚动边界被改写了:祖先设置了 overflow: hidden、没有可用高度,或 sticky 元素在 flex/grid 中没有足够的可滚动空间。调试时从最近的滚动祖先往上检查,比不断增加 z-index 有效。

Fixed 要为脱离文档流付费

fixed 脱离文档流后,后面的内容不会自动为它让位。页面必须显式预留高度,否则首段标题会被 Header 覆盖;移动端还要把 env(safe-area-inset-top) 算进偏移。全局 fixed 元素也应该有清晰的关闭、跳过或折叠策略,不能让它变成永久遮挡层。

常见翻车

  • 把文章内导航做成 fixed,滚出文章后它仍盖着 footer。
  • Header fixed 但没有 padding-top,刷新后第一行内容藏在 Header 下。
  • 给 sticky 的祖先统一加 overflow: hidden,导致粘性阈值失效。
  • 只调大 z-index,却没有处理键盘焦点、跳过链接和缩放后的遮挡。
  • 同时堆多个 fixed 工具条,却没有计算总高度,移动端可视区域被吃光。

给 agent 时要说清楚

说明定位对象的边界(视口还是某个内容容器)、Header 实际高度、滚动祖先、正文预留空间和移动端 safe-area。只说“做一个固定导航”会让 agent 在 sticky 与 fixed 之间随意猜,最后只能靠截图返工。