谈谈CSS3 硬件加速(GPU 加速)

15,899次阅读
没有评论

共计 2051 个字符,预计需要花费 6 分钟才能阅读完成。

前言

CSS3 硬件加速又叫做 GPU 加速,是利用 GPU 进行渲染,减少 CPU 操作的一种优化方案。页面 css 做图片滑动,滚动,特别是手机端,可能出现卡顿,闪白等情况,解决这些动画卡顿的情况,我们通常可以采用 GPU 加速的方式。由于 GPU 中的 transform 等 CSS 属性不会触发 repaint,所以能大大提高网页的性能。

如何开启 GPU 加速

CSS 中的以下几个属性能触发硬件加速:

transform

opacity

filter

will-change

如果有一些元素不需要用到上述属性,但是需要触发硬件加速效果,可以使用一些小技巧来诱导浏览器开启硬件加速

.haorooms_element {-webkit-transform: translateZ(0);
    -moz-transform: translateZ(0);
    -ms-transform: translateZ(0);
    -o-transform: translateZ(0);
    transform: translateZ(0); 
    /** 或者 **/
    transform: rotateZ(360deg);
    transform: translate3d(0, 0, 0);
}

通过 -webkit-transform:transition3d/translateZ 开启 GPU 硬件加速之后,有些时候可能会导致浏览器频繁闪烁或抖动,可以尝试以下办法解决之:

-webkit-backface-visibility:hidden;
-webkit-perspective:1000;

通过 -webkit-transform:transition3d/translateZ 开启 GPU 硬件加速的适用范围:

1、使用很多大尺寸图片 (尤其是 PNG24 图) 进行动画的页面。

2、页面有很多大尺寸图片并且进行了 css 缩放处理,页面可以滚动时。

3、使用 background-size:cover 设置大尺寸背景图,并且页面可以滚动时。

4、编写大量 DOM 元素进行 CSS3 动画时(transition/transform/keyframes/absTop&Left)。

5、使用很多 PNG 图片拼接成 CSS Sprite 时。

will-change

这个属性作用很单纯,就是“增强页面渲染性能”。那它是如何增强的呢?

我们可能听听说过,3D transform 会启用 GPU 加速,例如 translate3D, scaleZ 之类,但是呢,这些属性业界往往称之为 hack 加速法。我们实际上不需要 z 轴的变化,但是还是假模假样地声明了,欺骗浏览器,这其实是一种不人道的做法。
而 will-change 则天生为此设计,顾名思意“我要变形了”,礼貌而友好。

语法

/* 关键字值 */
will-change: auto;
will-change: scroll-position;
will-change: contents;
will-change: transform;        /* 示例 */
will-change: opacity;          /* 示例 */
will-change: left, top;        /* 两个  示例 */

/* 全局值 */
will-change: inherit;
will-change: initial;
will-change: unset;

will-change 虽然可以加速,但是,一定一定要适度使用。遵循最小化影响原则。

可以让父元素 hover 的时候,声明 will-change,这样,移出的时候就会自动 remove,触发的范围基本上是有效元素范围。

.will-change-parent:hover .will-change {will-change: transform;}
.will-change {transition: transform 0.3s;}
.will-change:hover {transform: scale(1.5);
}

如果使用 JS 添加 will-change, 事件或动画完毕,一定要及时 remove. 比方说点击某个按钮,其他某个元素进行动画。点击按钮 (click),要先按下(mousedown) 再抬起才出发。因此,可以 mousedown 时候提示浏览器准备 GPU 加速, 动画结束自带回调,移除 GPU 加速:

dom.onmousedown = function() {target.style.willChange = 'transform';};
dom.onclick = function() {// target 动画哔哩哔哩...};
target.onanimationend = function() {
    // 动画结束回调,移除 will-change
    this.style.willChange = 'auto';
};

使用硬件加速的注意事项

内存。如果 GPU 加载了大量的纹理,那么很容易就会发生内容问题,这一点在移动端浏览器上尤为明显,所以,一定要牢记不要让页面的每个元素都使用硬件加速。

使用 GPU 渲染会影响字体的抗锯齿效果。这是因为 GPU 和 CPU 具有不同的渲染机制。即使最终硬件加速停止了,文本还是会在动画期间显示得很模糊。

    正文完
     0
    Yojack
    版权声明:本篇文章由 Yojack 于1970-01-01发表,共计2051字。
    转载说明:
    1 本网站名称:优杰开发笔记
    2 本站永久网址:https://yojack.cn
    3 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行删除处理。
    4 本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
    5 本站所有内容均可转载及分享, 但请注明出处
    6 我们始终尊重原创作者的版权,所有文章在发布时,均尽可能注明出处与作者。
    7 站长邮箱:laylwenl@gmail.com
    评论(没有评论)