首选 transform: translateX() 因其触发 GPU 加速、避免重排与文档流干扰;需写全轴向如 translateX(-100%),transition 必须加在侧边栏自身且仅限 transform,通过 class 切换控制显隐,并注意 iOS 渲染、焦点管理与可访问性。
transform: translateX() 而不是 left
因为 transform 触发 GPU 加速,动画更流畅;而用 left 改变布局属性会触发重排(reflow),尤其在低端设备或复杂 DOM 下容易卡顿。同时 transform 不影响文档流,侧边栏隐藏时不会导致主内容区域“晃动”。
常见错误是把 translateX() 写成 translate(-200px) —— 缺少轴向标识,浏览器可能解析为 translateX(-200px) translateY(-200px),造成意外偏移。
translateX(-100%) 或 translateX(-300px),别省略 X
translateX(-100%)(相对自身宽度),比固定像素值更适配不同尺寸侧边栏width: 280px 或 flex-basis: 280px),否则 100% 会按父容器算,可能滑不全transition 放错位置就失效transition 必须写在**被变换的元素本身**(即侧边栏容器),且需指定具体属性:transition: transform 0.3s ease。写在父容器、触发按钮或 :hover 伪类上都不起作用。
另一个典型错误是只写了 transition: all 0.3s —— 过度宽泛,既影响性能,又可能让其他无意变更的属性(比如 opacity、color)也带过渡,干扰预期行为。
立即学习“前端免费学习笔记(深入)”;
transform:避免意外动效和性能损耗ease 或 cubic-bezier(0.34, 1.56, 0.64, 1)(稍带“回弹感”更自然),别用 linear
style.transform
直接在 JS 里写 el.style.transform = 'translateX(0)' 会覆盖 CSS 中定义的 transition,导致首次滑出无动画。正确做法是通过添加/移除 class 控制状态,让 CSS 承担动画逻辑。
HTML 结构中,侧边栏初始应有隐藏态 class(如 sidebar--closed),主内容区可加 main--shifted 配合遮罩层,避免点击穿透。
/* CSS */.sidebar { transition: transform 0.3s ease;}.sidebar--closed { transform: translateX(-100%);}.sidebar--open { transform: translateX(0);}
element.classList.toggle('sidebar--open'),不碰 stylekeydown 里监听并移除 classbody 滚动(body { overflow: hidden }),否则页面仍可拖拽iOS Safari 对 transform + fixed 元素组合有渲染 bug:侧边栏设 position: fixed 时,滑入后内部滚动可能卡顿或失灵。解法是改用 position: absolute 并确保父容器 position: relative 且高度撑满视口。
另一个隐形问题是可访问性:滑出后焦点未自动移到侧边栏首个可聚焦元素(如第一个 <button> 或 <a>),键盘用户无法操作。这不属于视觉效果范畴,但实际项目上线常被跳过。
firstFocusableElement.focus(),配合 requestAnimationFrame 确保 DOM 已更新inert 属性或 aria-hidden="true" 配合 tabindex="-1" 锁定主内容区焦点流will-change: transform 有副作用,慎加真正难的不是写出滑出动画,而是让每一次滑入都保持焦点合理、滚动可控、缩放不闪、返回键能退、屏幕阅读器能感知——这些细节不在 CSS 里,但在交付清单上。