transform和opacity能触发硬件加速,因二者可独立创建合成层且不引发布局或绘制;其他属性如width、height等会强制重排重绘。
为什么transform和opacity能触发
硬件加速
浏览器对某些 CSS 属性的变更可以绕过重排(reflow)和重绘(repaint),直接交由 GPU 处理。其中
和
是仅有的两个能
独立触发合成层(compositing layer)
且不引发布局或绘制的属性。其他如
、
、
、
、
都会强制触发重排或重绘,动画一卡就是一卡。
关键不是“用了GPU”,而是“只动合成层”。一旦元素进入自己的合成层,后续
平移/缩放/旋转、
透明度变化,就只是 GPU 上的图层操作,不牵扯主线程样式计算和绘制流水线。
哪些写法看似用了transform,实际没触发硬件加速
常见错误是让浏览器“不敢”提升图层,结果白写了
:
父元素设置了
或
,可能抑制子元素的层提升
元素本身有
(默认值)或未声明
,而动画又没提前“预告”
用
动画,但起始状态是
—— 浏览器可能延迟提升,首帧掉帧
同时修改
和
或
,后者会拉整个元素回主线程重绘
实操建议:动画前主动创建合成层,比如加
(仅对即将动画的元素),或用
/
强制提升(慎用,别滥用)。
立即学习
“
前端免费学习笔记(深入)
”;
使用HTML,CSS,JavaScript开发Android应用程序 英文文字pdf版附源文件
如果你了解HTML,CSS和JavaScript,您已经拥有所需的工具开发Android应用程序。本动手本书展示了如何使用这些开源web标准设计和建造,可适应任何Android设备的应用程序 - 无需使用Java。您将学习如何创建一个在您选择的平台的Android友好的网络应用程序,然后转换与自由PhoneGap框架到一个原生的Android应用程序。了解为什么设备无关的移动应用是未来的潮流,并开始构建应用程序,提供更
下载
opacity动画卡顿?检查是否被其他属性拖下水
本身极轻量,但常因配套操作失效:
和
混用:设
会卸载图层,再设
就没意义了
父容器有
(如
、
),会导致子元素无法单独合成,整个滤镜区域被当作一个大图层处理,
变更也要重绘该区域
动画中动态插入/删除 DOM 节点,触发 layout,打断合成流
使用
,哪怕只改
,浏览器也可能为其他潜在属性预留重绘通道
正确写法是精准过渡:
,并确保父级没意外施加
或
。
Chrome DevTools里怎么验证是否真走GPU加速
别靠感觉,看真实层树:
打开 Chrome DevTools →
Layers
面板(需在
中启用)
播放动画时观察:有独立图层的元素会显示为一块彩色矩形,标着 “Composited layer”
如果只有主文档层(Document Layer),说明没分层;如果看到“Paints on scroll”或“Scrolls with page”,说明还在主线程滚动/绘制
右键元素 →
Inspect Element
→ 在 Styles 面板里看 computed 的
是否显示为
(GPU路径),而非
(CPU路径)
容易被忽略的是:动画结束后图层可能被回收。所以要抓“动画进行中”的瞬间,而不是停帧后看。
transformopacitywidthheighttopleftbackground-colortransformopacitytransformoverflow: hiddenclip-pathwill-change: autowill-changetransform: translateX(10px)transform: nonetransformcolorborderwill-change: transformtransform: translateZ(0)transform: scale(1.0001)opacityvisibilityvisibility: hiddenopacity: 0filterblur()drop-shadow()opacitytransition: all 0.3sopacitytransition: opacity 0.3s easefiltermaskMore Tools → Layerstransformmatrix3d(...)matrix(...)