用CSS开启硬件加速来提高网站性能

摘要:
我们可以在浏览器中用css开启硬件加速,使GPU发挥功能,从而提升性能现在大多数电脑的显卡都支持硬件加速。事实上一般是在以下几种情况下:3D或者CSStransform和标签CSSfilters元素覆盖时,比如使用了z-index属性4并不是所有的CSS属性都能触发GPU的硬件加速,实际上只有少数属性可以,比如下面的这些:transformopacityfilter5.如何在桌面端和移动端用CSS开启硬件加速CSSanimations,transforms以及transitions不会自动开启GPU加速,而是由浏览器的缓慢的软件渲染引擎来执行。

1. 何为硬件加速

就是将浏览器的渲染过程交给GPU处理,而不是使用自带的比较慢的渲染器。这样就可以使得animation与transition更加顺畅。

我们可以在浏览器中用css开启硬件加速,使GPU (Graphics Processing Unit) 发挥功能,从而提升性能

现在大多数电脑的显卡都支持硬件加速。鉴于此,我们可以发挥GPU的力量,从而使我们的网站或应用表现的更为流畅。

2硬件加速原理

浏览器接收到页面文档后,会将文档中的标记语言解析为DOM树。DOM树和CSS结合后形成浏览器构建页面的渲染树。渲染树中包含了大量的渲染元素,每一个渲染元素会被分到一个图层中,每个图层又会被加载到GPU形成渲染纹理,而图层在GPU中transform是不会触发 repaint 的,最终这些使用transform的图层都会由独立的合成器进程进行处理。

CSStransform会创建了一个新的复合图层,可以被GPU直接用来执行transform操作。

浏览器什么时候会创建一个独立的复合图层呢?事实上一般是在以下几种情况下:

  • 3D 或者 CSS transform
  • <video>和<canvas>标签
  • CSS filters
  • 元素覆盖时,比如使用了z-index属性

3 为什么硬件加速会使页面流畅

因为 transform 属性不会触发浏览器的 repaint(重绘),而绝对定位absolute中的 left 和 top 则会一直触发 repaint(重绘)。

为什么 transform 没有触发 repaint 呢?简而言之,transform 动画由GPU控制,支持硬件加速,并不需要软件方面的渲染。

浏览器什么时候会创建一个独立的复合图层呢?事实上一般是在以下几种情况下:

3D 或者 CSS transform

<video> 和 <canvas> 标签

CSS filters

元素覆盖时,比如使用了 z-index 属性

4并不是所有的CSS属性都能触发GPU的硬件加速,实际上只有少数属性可以,比如下面的这些:

transform

opacity

filter

5.如何在桌面端和移动端用CSS开启硬件加速

CSS animations, transforms 以及 transitions 不会自动开启GPU加速,而是由浏览器的缓慢的软件渲染引擎来执行。那我们怎样才可以切换到GPU模式呢,很多浏览器提供了某些触发的CSS规则。

现在,像Chrome, FireFox, Safari, IE9+和最新版本的Opera都支持硬件加速,当它们检测到页面中某个DOM元素应用了某些CSS规则时就会开启,最显著的特征的元素的3D变换。

例如:

.cube {

-webkit-transform: translate3d(250px,250px,250px)

rotate3d(250px,250px,250px,-120deg)

scale3d(0.5, 0.5, 0.5);

}

可是在一些情况下,我们并不需要对元素应用3D变换的效果,那怎么办呢?这时候我们可以使用个小技巧“欺骗”浏览器来开启硬件加速。

虽然我们可能不想对元素应用3D变换,可我们一样可以开启3D引擎。例如我们可以用transform: translateZ(0); 来开启硬件加速 。

.cube {

-webkit-transform: translateZ(0);

-moz-transform: translateZ(0);

-ms-transform: translateZ(0);

-o-transform: translateZ(0);

transform: translateZ(0);

/* Other transform properties here */

}

在 Chrome and Safari中,当我们使用CSS transforms 或者 animations时可能会有页面闪烁的效果,下面的代码可以修复此情况:

.cube {

-webkit-backface-visibility: hidden;

-moz-backface-visibility: hidden;

-ms-backface-visibility: hidden;

backface-visibility: hidden;

-webkit-perspective: 1000;

-moz-perspective: 1000;

-ms-perspective: 1000;

perspective: 1000;

/* Other transform properties here */

}

在webkit内核的浏览器中,另一个行之有效的方法是

.cube {

-webkit-transform: translate3d(0, 0, 0);

-moz-transform: translate3d(0, 0, 0);

-ms-transform: translate3d(0, 0, 0);

transform: translate3d(0, 0, 0);

/* Other transform properties here */

}

原生的移动端应用(Native mobile applications)总是可以很好的运用GPU,这是为什么它比网页应用(Web apps)表现更好的原因。硬件加速在移动端尤其有用,因为它可以有效的减少资源的利用(移动端本身资源有限)。

6.使用硬件加速的问题

使用硬件加速并不是十全十美的事情,比如:

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

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

总结

只对我们需要实现动画效果的元素应用以上方法,如果仅仅为了开启硬件加速而随便乱用,那是不明智的。

小心使用这些方法,如果通过你的测试,结果确是提高了性能,你才可以使用这些方法。使用GPU可能会导致严重的性能问题,因为它增加了内存的使用,而且它会减少移动端设备的电池寿命。

免责声明:文章转载自《用CSS开启硬件加速来提高网站性能》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇关于Unity中的新手编码技巧VSCode编辑器使用技巧:快捷输入HTML代码(转)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

在ASP.NET 2.0中使用样式、主题和皮肤

ASP.NET 2.0的主题和皮肤特性使你能够把样式和布局信息存放到一组独立的文件中,总称为主题(Theme)。接下来我们可以把这个主题应用到任何站点,用于改变该站点内的页面和控件的外观和感觉。通过改变主题的内容,而不用改变站点的单个页面,就可以轻易地改变站点的样式。主题也可以在开发者之间共享。 ASP.NET包含了大量的用于定制应用程序的页面和控件的外观...

软件产品案例分析(团队)

任务分配流程图 第一部分 调研,评测 【评测】 下载并使用,描述最简单直观的个人第一次上手体验。 移动端 软件登录界面,色彩清新,操作流畅,这种风格看着还是蛮舒服的。不过登录、注册等按钮距离间隔太近容易误操作。 注册界面直接以web网页形式加载,响应速度较慢,体验并不是很好。 用户的主界面非常简洁清新,“我的”界面除了用户名、区域看不到用户的其他信息。...

学习 | css3实现进度条加载

进度条加载是页面加载时的一种交互效果,这样做的目的是提高用户体验。 进度条的的实现分为3大部分:1、页面布局,2、进度条动效,3、何时进度条增加。 文件目录 加载文件顺序 <link rel="stylesheet/less" href="http://t.zoukankan.com/index.less"> <script src="...

CSS3的新增选择器

一、兄弟选择器:选择E元素所有兄弟元素F。 <style> p~p{ color:#f00;} </style> </head> <body> <div><!--该div是父元素--> <p>中国十大杰出人物</p>...

CSS技巧:文本换行及溢出隐藏

文字溢出隐藏 单行文本 200px; // 需要设置这个固定宽度 overflow: hidden; text-overflow: ellipsis; white-space: nowrap; 多行文本 display: -webkit-box; // 将对象作为弹性伸缩盒子模型显示 word-break: break-all; -webkit-box-...

vue项目中生产环境禁用debugger,关闭console

vue-cli2.0中的方法 1.安装uglifyjs-webpack-plugin插件 npm install uglifyjs-webpack-plugin --save-dev 2.修改wenbpack.prod.config.js配置文件 const UglifyJsPlugin = require('uglifyjs-webpack-plugi...