必须用transform:translatex()而非left或margin-left,因其走gpu合成层、不触发重排,避免低端android和ios safari掉帧、白屏;需配合fixed/absolute定位、明确width、-100vw位移、transition写在默认状态及正确遮罩层样式。

用 transform: translateX() 实现侧边抽屉,而不是 left 或 margin-left —— 这不是风格选择,是性能底线。低端 Android 和 iOS Safari 上,后者会掉帧、白屏、甚至卡死。
为什么必须用 transform: translateX() 而非 left
浏览器对 transform 的处理走合成层(compositing layer),GPU 加速,不触发重排(reflow);left 改变的是盒模型位置,每次动画都要重新计算整个布局树,滚动中叠加动画极易掉帧。
-
translateX(-100%)不可靠:父容器宽度不确定时,100% 没意义;推荐translateX(-100vw)或固定像素值(如translateX(-300px)),前提是侧边栏有明确width - 必须设
position: fixed或position: absolute,否则translateX会影响文档流,主内容会跳动 - 过渡属性要写在默认状态上:
.sidebar { transition: transform 0.3s ease-in-out; },不能只写在.sidebar.open里,否则首次展开无动画
遮罩层(.overlay)点不关闭?检查这三点
点击遮罩没反应,90% 是 DOM 结构或样式没占满视口。
-
.overlay必须是position: fixed; top: 0; left: 0; width: 100vw; height: 100vh;—— 用100%是错的,它相对父容器,不是视口 -
z-index要比抽屉低(如抽屉z-index: 1000,遮罩z-index: 999),但高于主内容;同时确保没被其他position: relative父容器截断层级 - 加
cursor: pointer和background-color: rgba(0,0,0,0.5),透明度低于0.3容易点击穿透
移动端滚动穿透和 body 锁死失效怎么办
iOS Safari 对 body { overflow: hidden } 常常忽略,光靠这个锁不住背景滚动。
- 抽屉打开时,给
body加 class(如drawer-open),CSS 写成:.drawer-open { position: fixed; width: 100%; height: 100%; overflow: hidden; } - 侧边栏容器自身必须设
overflow-y: auto和明确高度(如height: 100vh或min-height: 100vh),否则内容一多就撑出屏幕 - 如果侧边栏用了
flex布局,内部滚动区域要加min-height: 0防止 flex 项撑高容器
纯 CSS 方案(input[type="checkbox"])失效的常见原因
不用 JS 看似简单,但 DOM 结构错一丁点就全盘失效。
-
input和抽屉容器必须是同级兄弟节点,且用~(通用兄弟选择器)连接:#menu:checked ~ .sidebar;+(相邻兄弟)要求中间不能有任何标签、空格或注释 -
input必须有id,且对应label[for]显式关联;iOS 上没label包裹,点击区域几乎为零 - 抽屉初始状态别用
display: none或visibility: hidden—— 它们无法过渡;应保持visible,仅靠transform: translateX(-100vw)隐藏
最易被忽略的一点:所有 transition 必须显式声明属性,别写 transition: all —— 它会让按钮、卡片等其他元素也继承动效,干扰交互节奏。侧边栏只动 transform,遮罩只动 opacity 和 visibility,分开控制才稳。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











