导航
css3 实现动画主要有 3 种方式
https://codepen.io/JingW/pen/dyqgqrv
在 CSS 中,只有 3D 转换、opacity 透明、filter 滤镜和添加了 will-change 属性的元素,浏览器才会开启硬件(GPU)加速。
transform: translateZ(0); 或 transform: translate3d(0,0,0);
来诱导浏览器开启硬件加速,但是我们不能滥用。图形处理单元(GPU)
会协助你的浏览器渲染网页,做一些繁重的工作,而不是把这些工作全部丢给中央处理单元(CPU)
来完成。CPU 和 GPU 都是处理单元
硬件加速(又称 GPU 加速)
CSS 的 animation、transform 和 transition 不会自动进行 GPU 加速,一般是由浏览器缓慢的软件渲染引擎执行。然而有些浏览器通过某些属性提供硬件加速,以获得更好的渲染性能。
能触发硬件(GPU)加速的 CSS 属性
opacity
不透明度就是少数可以适当加速的 CSS 属性之一,因为 GPU 可以很容易地操纵它。
CSS 属性 will-change
允许我们提前告知浏览器我们可能会对一个元素做出什么样的改变,从而使浏览器可以提前为元素做一些适当的优化。
注意事项:
不要将 will-change 应用到太多元素上
这种方式是非常有害的,因为更多的操作是无效的,而且有可能占用机器大量的资源,过度使用,会导致页面变慢甚至崩溃。
/* 错误做法 */
* {
will-change: all;
}
/* 或 */
.box {
will-change: all;
}
给浏览器留足时间准备
案例:鼠标滑动到元素上时,元素的透明度发生改变
.box:hover .item {
/*当鼠标进入或悬停到其祖先时,声明该元素接下来要发生的变化,让浏览器做好准备*/
will-change: opacity;
}
.item:hover {
/* will-change: opacity; 直接写在这里是无效的,并不会带来什么作用*/
opacity: 0.5; /*鼠标悬停到元素时发生的变化*/
}
在样式表中谨慎使用
通常,当元素恢复到初始状态时,浏览器会丢弃掉之前做的优化工作。
will-change
属性,则表示目标元素可能会经常变化,浏览器会将优化工作保存得比之前更久。will-change
的值。.sidebar {
will-change: transform;
}
更改完成后要删除 will-change
浏览器为即将发生的变化所做的优化通常会占用机器的很多资源,通常要删除这些优化尽快恢复到正常行为。
will-change
,这样浏览器就可以恢复优化所占用的资源。will-change
,就不可能删除它,这就是为什么建议你用 JavaScript 设置和取消它。will-change
。如何使用 js 脚本来正确的使用 will-change 属性,如下:
var el = document.getElementById("element");
// 当鼠标移动到该元素上时给该元素设置 will-change 属性
el.addEventListener("mouseenter", hintBrowser);
// 当 CSS 动画结束后清除 will-change 属性
el.addEventListener("animationEnd", removeHint);
function hintBrowser() {
// 填写上那些你知道的,会在 CSS 动画中发生改变的 CSS 属性名们
this.style.willChange = "transform, opacity";
}
function removeHint() {
this.style.willChange = "auto";
}
硬件加速操作会创建一个所谓的合成渲染层(compositor layer),并上传到 GPU 进行合成。然而,强行创造一个图层并不能解决某些页面上的性能瓶颈。
经过-webkit-transform: transition3d/translateZ
开启 GPU 硬件加速以后,有些时候可能会致使浏览器频繁闪烁或抖动,能够尝试如下办法解决之:
-webkit-backface-visibility: hidden; /* 各种前缀都要考虑,此处省略 */
-webkit-perspective: 1000; /* 各种前缀都要考虑,此处省略 */