前端渲染优化,移动HTML 5前端性能优化指南

为什么每个前端开发者都要理解网页渲染

前端渲染优化,移动HTML 5前端性能优化指南

文章插图
今天我要将关注点放到网页渲染以及其重要性上 。虽然已经有很多文章提到过这个主题了,但大部分信息都是零碎的片段 。为了思考这件事情,我需要研究很多信息的来源 。这也就是为什么我觉得我应该写这篇文章的原因 。我相信这篇文章对新手会很有用,并且对想刷新和巩固他们已经了解的东西的高手也同样适用 。
渲染应该从最开始当页面布局被定义时就进行优化,样式和脚本在页面渲染中扮演着非常重要的角色 。专业人员知道一些技巧以避免一些性能问题 。
这篇文章不会深入研究浏览器的技术细节,而是提供一些通用的原则 。不同浏览器引擎工作原理不同,这就使特定浏览器的学习更加复杂 。
浏览器是怎样渲染一个页面的?
我们从浏览器渲染页面的大概过程开始说起:
由从服务器接收到的 HTML 形成 DOM(文档对象模型) 。
样式被加载和解析,形成 CSSOM(CSS 对象模型) 。
紧接着 DOM 和 CSSOM 创建了一个渲染树,这个渲染树是一些被渲染对象的集合( Webkit 分别叫它们”renderer”和”render object”,而在Gecko 引擎中叫”frame”) 。除了不可见的元素(比如 head 标签和一些有 display:none 属性的元素),渲染树映射了 DOM 的结构 。在渲染树中,每一个文本字符串都被当做一个独立的 renderer 。每个渲染对象都包含了与之对应的计算过样式的DOM 对象(或者一个文本块) 。换句话说,渲染树描述了 DOM 的直观的表现形式 。
对每个渲染元素来说,它的坐标是经过计算的,这被叫做“布局(layout)” 。浏览器使用一种只需要一次处理的“流方法”来布局所有元素(tables需要多次处理) 。
最后,将布局显示在浏览器窗口中,这个过程叫做“绘制(painting)” 。
重绘
当在页面上修改了一些不需要改变定位的样式的时候(比如background-color,border-color,visibility),浏览器只会将新的样式重新绘制给元素(这就叫一次“重绘”或者“重新定义样式”) 。
重排
当页面上的改变影响了文档内容、结构或者元素定位时,就会发生重排(或称“重新布局”) 。重排通常由以下改变触发:
· DOM 操作(如元素增、删、改或者改变元素顺序) 。
· 内容的改变,包括 Form 表单中文字的变化 。
· 计算或改变 CSS 属性 。
· 增加或删除一个样式表 。
· 改变”class”属性 。
· 浏览器窗口的操作(改变大小、滚动窗口) 。
· 激活伪类(如:hover状态) 。
浏览器如何优化渲染?
浏览器尽最大努力限制重排的过程仅覆盖已更改的元素的区域 。举个例子,一个 position 为 absolue 或 fixed 的元素的大小变化只影响它自身和子孙元素,而对一个 position 为 static 的元素做同样的操作就会引起所有它后面元素的重排 。
另一个优化就是当运行一段Jjavascript 代码的时候,浏览器会将一些修改缓存起来,然后当代码执行的时候,一次性的将这些修改执行 。
举例来说,这段代码会触发一次重绘和一次重排:
var $body = $('body');
$body.css('padding', '1px'); // 重排, 重绘
$body.css('color', 'red'); // 重绘
$body.css('margin', '2px'); // 重排, 重绘
// 实际上只有一次重排和重绘被执行 。
如上面所说,访问一个元素的属性会进行一次强制重排 。如果我们给上面的代码加上一行读取元素属性的代码,这个情况就会出现:
var $body = $('body');
$body.css('padding', '1px');