用途
本技能用于指导在网页中正确使用粘性(sticky)与固定(fixed)定位元素,帮助开发者决定在用户滚动页面时哪些界面元素应当保持在屏幕上,以及应当采用哪种定位方式。
主要能力
position: fixed 与 position: sticky 的对比
- position: fixed:脱离文档流,无论滚动或父元素如何变化,始终停留在视口的同一位置。适用于全局导航头部、底部工具栏、浮动操作按钮。
- position: sticky:保持在文档流中,直到到达滚动阈值后锁定位置,父元素滚过之后回到文档流。适用于表格列头、长列表中的分节标题、滚动容器内的页内工具栏。
当元素属于某个特定区块或滚动上下文时,优先使用 sticky 而非 fixed。fixed 元素位于所有内容之上并影响整个视口,只应用于真正全局的 UI。
顶部导航头部
全局导航头部是最常见的固定元素,应当:
- 始终可见,让用户随时可以导航离开
- 尽可能薄以最大化内容区域,48–64px 是常见范围
- 具有背景和阴影,避免下方滚动内容透出
- 滚动时用细微阴影(--shadow-sm)提示其后方有内容
示例代码:
.site-header {
position: fixed;
top: 0;
left: 0;
right: 0;
height: var(--header-height);
background: var(--color-surface);
box-shadow: var(--shadow-sm);
z-index: var(--z-header);
}
用与固定头部高度匹配的页面 body 顶部内边距进行补偿:
body { padding-top: var(--header-height); }
移动端底部工具栏
在移动端,屏幕底部是单手握持时最容易触及的区域。常驻底部工具栏适合放置:
- 主导航(底部标签栏,iOS 与 Android 惯例)
- 当前视图的上下文操作(编辑、分享、删除)
- 针对最重要单一操作的浮动操作按钮(FAB)
底部工具栏应当:
- 在带 home 指示条的设备上尊重安全区域:
padding-bottom: env(safe-area-inset-bottom) - 与内容有视觉分隔(背景填充、顶部边框或阴影)
- 最多包含 3–5 个项目,超过 5 个应移入菜单或改用其他模式
- 导航标签使用图标加文字,上下文工具栏可仅用图标(配合提示)
在桌面端,底部工具栏并不常见。状态栏、编辑器工具栏和命令面板是桌面端的对应形式,通常使用底部 position: fixed 或在其滚动容器内使用 position: sticky。
粘性表格表头
对于滚动容器内的数据表格,粘性列头可防止用户忘记各列含义。
thead th {
position: sticky;
top: 0;
background: var(--color-surface);
z-index: 1;
}
如果表格同时有粘性首列(用于行标识),左上角单元格需要同时设置 top: 0 和 left: 0,并使用更高的 z-index 以位于表头行和粘性列之上。
堆叠与 z-index
粘性与固定元素会创建堆叠上下文。应将 z-index 定义为命名令牌,而非任意数字:
--z-base: 0;
--z-dropdown: 100;
--z-sticky: 200;
--z-header: 300;
--z-modal: 400;
--z-toast: 500;
每个固定或粘性元素都必须使用令牌显式声明其 z-index。避免使用 z-index: 9999 这类临时值,它们意味着堆叠上下文未被管理,最终会产生冲突。
固定层数量控制
每个固定层都会占用内容区域空间并增加视觉复杂度。一个页面很少需要超过:
- 1 个固定头部(顶部)
- 1 个固定工具栏或底部导航(底部,移动端)
- 1 个浮动操作按钮或上下文浮层
固定头部 + 固定底部工具栏 + 浮动按钮 + 粘性侧边栏 + 粘性表头同时出现,层数就过多了。应尽可能合并。
审查清单
- 是否对区块范围的元素使用 sticky,仅对真正全局的 UI 使用 fixed?
- 固定头部是否用 body 内边距补偿了自身高度?
- 底部工具栏在移动端是否尊重 env(safe-area-inset-bottom)?
- 所有 z-index 值是否定义为命名令牌,而非任意数字?
- 同时存在的固定层总数是否最小化——多数情况下最多为头部加一个底部元素?
- 固定元素后方滚动的内容是否不会视觉穿透(固定元素有背景和阴影)?
适用场景
适用于需要设计或实现滚动时保持可见的界面元素的场景,包括全局导航、移动端底部导航与工具栏、浮动操作按钮、数据表格粘性表头、长列表分节标题等。
限制
资料未提供该技能的具体安装方式、依赖环境、支持的框架或平台版本等信息,暂未提供。