绝大多数情况应选 position: fixed——它脱离文档流、贴住视口边缘且滚动稳定;sticky 依赖父容器高度和滚动上下文,易因 height 缺失或 overflow: hidden 失效。
position: fixed 还是 position: sticky?绝大多数情况该选 position: fixed——它能真正脱离文档流、始终贴住视口边缘,滚动时稳如磐石;position: sticky 看似简单,但依赖父容器高度和滚动上下文,稍不注意就失效(比如父元素没设 height 或被 overflow: hidden 截断)。
实操建议:
fixed 侧边栏必须手动设置 top 和 left(或 right),并考虑顶部导航栏高度(例如 top: 64px)margin-left(左栏)或 margin-right(右栏)fixed 改为 static 或用按钮控制显隐,否则会挤占窄屏空间纯 CSS 无法监听点击并持久标记“当前页”,必须靠 JS 绑定事件 + 操作 class。常见错误是只改 onclick 内联样式,导致刷新即丢失,或没清除上一项的 active 类。
正确做法:
立即学习“前端免费学习笔记(深入)”;
<a> 加唯一 data-href 或直接用 href 值做标识window.location.pathname 匹配当前路径,给对应链接加 class="active"
document.querySelectorAll('.sidebar a').forEach(...) 清掉所有 active,再给目标加.sidebar a.active { background-color: #007bff; color: white; } 即可生效直接在侧边栏容器上设 overflow-y: auto 很危险:如果父元素没设固定高度,滚动条可能出不来;更糟的是,某些浏览器(尤其 Safari)在 fixed 元素内滚动时会触发整个页面抖动。
稳妥方案:
height: calc(100vh - 64px)(减去 header 高度),再加 overflow-y: auto
-webkit-overflow-scrolling: touch(iOS 平滑滚动)iframe 或视频等重资源——它们会放大滚动卡顿最常见原因是 z-index 层级被遮挡:比如轮播图、弹窗、广告位用了超大 z-index: 9999,而侧边栏只写了 z-index: 10,结果点击穿透到下层。
排查步骤:
z-index 和 position)<aside>)有 position: fixed 且 z-index ≥ 100fixed 元素的触摸事件支持差,可临时加 touch-action: manipulation 提升响应侧边栏的“浮动”本质是视觉锚定,但它的交互稳定性极度依赖层级、尺寸和移动端适配细节——少一个 z-index 或漏掉一行 calc() 高度,就可能让整个菜单在真机上彻底失灵。