深入学习页面优化之页面渲染原理

拾人牙慧理解并整理之

直奔主题,要考虑到页面性能优化,必须得理解浏览器的渲染机制才行。

1、原理

渲染引擎在这里就不展开了,可自行搜索解决。下面说说渲染流程,大致是这样的:

浏览器在接收到服务器返回的html页面后,

浏览器开始构建DOM TREE,遇到CSS样式会构建CSS RULER TREE,

遇到javascript会通过DOM API和CSSOM API来操作DOM Tree和CSS Rule Tree,解析完成后,

浏览器引擎会通过DOM Tree 和 CSS Rule Tree 来构造 Rendering Tree(渲染树),

最后,渲染树构建完成后就是” 布局“处理,也就是确定每个节点在屏幕上的确切显示位置。 下一个步骤是  绘制 —— 遍历渲染树并用UI后端层将每一个节点绘制出来。

用一张图来表示

另外,在构建相应的树形结构时,会发生阻碍:

  在构建DOM树时,

  • HTML的响应流被阻塞在了网络中
  • 有未加载完的脚本
  • 遇到了script节点,但是此时还有未加载完的样式文件

例子:

1 <html>
2 <body>
3   <link rel="stylesheet" href="example.css">
4   <div>Hi there!</div>
5   <script>
6     document.write(‘<script src="other.js"></scr‘ + ‘ipt>‘);
7   </script>
8   <div>Hi again!</div>
9   <script src="last.js"></script>
10 </body>
11 </html>

  

首先,解析器遇到了example.css,并将它从网络中下载下来。下载样式表的过程是耗时的,但是解析器并没有被阻塞,继续往下解析。接下来,解析器遇到script标签,但是由于样式文件没有加载下来,阻塞了该脚本的执行(上面已指出)。解析器(构建DOM TREE和 CSS RULER TREE)被阻塞住,不能继续往下解析。

同样的,因为渲染树是DOM Tree 和 CSS Rule Tree 来构造,所以此时,渲染树的构建也被阻塞,同时Hi there!也就 不能被绘制(painting->display)到页面中,

绘制的条件是,渲染树构建完成并遇到阻塞就会触发绘制。

接下来,一旦example.css文件加载完成,内联的脚本执行完之后,解析器就会立即被other.js阻塞住。一旦解析器被阻塞,浏览器就会收到绘制请求,"Hi there!"也就显示在了页面上。同理,当other.js加载完成之后,解析器继续向下解析,解析器遇到last.js之后会被阻塞,然后浏览器收到了另一个绘制请求,"Hi again!"就显示在了页面上。最后last.js会被加载,并且会被执行。

  另外,页面的渲染是从上到下,从右到左的机制,

  例如,div#username p span.red{color:red;},浏 览器的查找顺序如下:先查找html中所有class=’red’的span元素,找到后,再查找其父辈元素中是否有p元素,再判断p的父元素中是否有id为 username的div元素,如果都存在则CSS匹配上。

  例如如下代码:

  

 1 <!DOCTYPE html>
 2 <html>
 3 <head>
 4     <title></title>
 5     <meta charset="utf-8">
 6 <style type="text/css">
 7 .red{ color:red; }
 8 .blue{ color:blue; }
 9 </style>
10 </head>
11 <body>
12 <p class="red blue">这是一段文字</p>
13 </body>
14 </html>

  字体还是会显示为蓝色,

    

  浏览器从右到左进行查找的好处是为了尽早过滤掉一些无关的样式规则和元素。firefox称这种查 找方式为keyselector(关键字查询),所谓的关键字就是样式规则中最后(最右边)的规则,上面的key就是span.red。

  所以在我们命名class类名的时候,尽量重用样式。

  以上参考的资料有:浏览器的渲染原理简介

          浏览器加载和渲染html的顺序-css渲染效率的探究

          浏览器是怎样工作的:渲染引擎,HTML解析(连载二)

          了解html页面的渲染过程

2、页面性能优化的方法:

把原理理解的差不多了再来看看常见的优化方法,

1、DOM结构不要复杂,不必要的标签坚决不要,例如:<div class="clearfix"></div>这样一个清除浮动的标签,虽然很好用,但是会增加浏览器的渲染,我们可以用别的方法代替啊,例如增加伪元素after,为了兼容IE67也是可以利用IE67的一些特有的属性来清除浮动的,比如zoom:1;是不是?

2、少引用css,js文件,少增加图片的请求次数,很常见的css sprites。

3、少用滤镜,少用hack,少用position:absolute;。

  在这里我想问,为什么要少用绝对定位?为什么?请点这里详解

4、使用简写样式,如background,margin,padding等。

5、不要在ID选择器和class选择器前 使用标签名 例如:div.box { color: #f00; }; 直接 可以 用类名, .box { color:#f00;}  这样浏览器找到这个class后 就不用再匹配是否存在div标签.从而提高了渲染效率。当然同一级的 有不同的样式可以这样写,但是不建议这样。

6、css的层级关系不要太深 用class直接代替多余的层级元素。例如 .box .box-con .box-list li { line-height: 24px; } 这么长。。。增加代码量减小开发效率。刚也说了,css渲染是从上到下,从右到左的。所以直接这样写就可以了.box-list li { line-height: 24px; };

7、平铺背景图片不要过小,影响渲染速率。

8、float使用要谨慎。

最后,我想用这个来结束这篇文章,我觉得很生动的描述浏览器在接收到html后解析渲染出来的过程,此处引用。。。

1.用户输入网址(假设是个html页面,并且是第一次访问),浏览器向服务器发出请求,服务器返回html文件;
2.浏览器开始载入html代码,发现<head>标签内有一个<link>标签引用外部CSS文件;
3.浏览器又发出CSS文件的请求,服务器返回这个CSS文件;
4.浏览器继续载入html中<body>部分的代码,并且CSS文件已经拿到手了,可以开始渲染页面了;
5.浏览器在代码中发现一个<img>标签引用了一张图片,向服务器发出请求。此时浏览器不会等到图片下载完,而是继续渲染后面的代码;
6.服务器返回图片文件,由于图片占用了一定面积,影响了后面段落的排布,因此浏览器需要回过头来重新渲染这部分代码;
7.浏览器发现了一个包含一行Javascript代码的<script>标签,赶快运行它;
8.Javascript脚本执行了这条语句,它命令浏览器隐藏掉代码中的某个<div> (style.display=”none”)。突然少了这么一个元素,浏览器不得不重新渲染这部分代码;
9.终于等到了</html>的到来,浏览器泪流满面……
10.等等,还没完,用户点了一下界面中的“换肤”按钮,Javascript让浏览器换了一下<link>标签的CSS路径;
11.浏览器召集了在座的各位<div><span><ul><li>们,“大伙儿收拾收拾行李,咱得重新来过……”,浏览器向服务器请求了新的CSS文件,重新渲染页面。

  

此处参考:

    浏览器渲染页面、CSS原理及优化

    浏览器加载和渲染html的顺序-css渲染效率的探究

时间: 2024-10-13 07:53:49

深入学习页面优化之页面渲染原理的相关文章

前台页面优化全攻略(二)

在上一篇文章中,我们讨论了一些基本的页面优化和减肥方案,现在我们的页面已经被缩减了30%-50%,如果你还没有阅读上一篇文章,我建议你完成那些基础热身之后再继续进阶的训练. 如果你已经尝试了基础的热身,那我们就继续采取一些更极客的解决方案. 1. 移除网站中社交网络的组件 看到这个标题请不要惊讶,我并不是让你放弃第三方社交平台,而是希望你能放弃那些肥胖的官方组件.你的网站中有社交平台的分享按钮么?这些按钮会为你的网站增重大概0.5M.我们知道,这些分享功能都是由JavaScript实现的,有些分

[转载]页面优化——网页优化

前端是庞大的,包括HTML.CSS.Javascript.Image.Flash等等各种各样的资源.前端优化是复杂的,针对方方面面的资源都有不同的方式.那么,前端优化的目的是什么 1. 从用户角度而言,优化能够让页面加载得更快.对用户的操作响应得更及时,能够给用户提供更为友好的体验. 2. 从服务商角度而言,优化能够减少页面请求数.或者减小请求所占带宽,能够节省可观的资源. 总之,恰当的优化不仅能够改善站点的用户体验并且能够节省相当的资源利用. 前端优化的途径有很多,按粒度大致可以分为两类,第一

前端开发工程师 - 04.页面架构 - CSS Reset &amp; 布局解决方案 &amp; 响应式 &amp; 页面优化 &amp;规范与模块化

04.页面架构 第1章--CSS Reset 第2章--布局解决方案 居中布局 多列布局 全屏布局 第3章--响应式 浏览网页使用的设备屏幕大小迥异,如何保证页面在不同设备上都正常显示呢? --  解决方法:响应式 优点:无需为不同设备编写对应的页面 --> 降低开发成本.维护成本 缺点:页面中某些部分在某些设备上会被隐藏(资源加载了,但是只是用CSS隐藏了) 为什么在手机端的页面会很小呢? 所有的移动端的页面都引入了viewport视窗 刚开始所有的元素都是加载到一个比较大的viewport视

SEO页面优化以及如何对单页面应用进行SEO优化

一.简介 1.何为SEO? SEO(search engine optimization),翻译为搜索引擎优化,是利用搜索引擎的搜索规则来提高在相关搜索引擎的排名以及访问量的方式. 2.目的 为了获取更多的流量.排名以及点击率从而实现品牌的推广以及营销,提高影响力. 二.如何在HTML进行代码优化 1.为什么要进行HTML优化? 我们做SEO,最直接的目的就是想通过搜索引擎获得好的关键词排名和流量,而搜索引擎工作又是依赖它们的"蜘蛛"程序进行的.所谓搜索引擎蜘蛛只是搜索引擎开发的&qu

页面优化方法大全

1.2.1 编辑器 选择好一个前端编辑器是比较重要的.目前sublime.webstorm和vim是比较常见的,建议不使用Dreamweaver.sublime目前还是不错的选择,可以安装插件,比如BracketHighlighter 高亮显示.JsFormat.Emmet html/CSS快速编辑以及DocBlockr插件,快速输入jsDoc注释等,还可以自定义代码段snippets.无论你使用哪种编辑器,你需要的是熟悉这个编辑器并熟练它的快捷键. 1.2.2 浏览器开发者工具 作为前端人员,

HTML页面优化

第一步:加载优化 减少HTTP请求. 因为手机浏览器同时响应请求为4个请求(Android支持4个,iOS 5后可支持6个),所以要尽量减少页面的请求数,首次加载同时请求数不能超过4个.a) 合并CSS.JavaScript:b) 合并小图片,使用雪碧图(CSS SPRITE):   缓存. 使用缓存可以减少向服务器的请求数,节省加载时间,所以所有静态资源都要在服务器端设置缓存,并且尽量使用长Cache(长Cache资源的更新可使用时间戳). a) 缓存一切可缓存的资源:b) 使用长Cache(

移动端html页面优化

对于访问量大的网站来说,前端的优化是必须的,即使是优化1KB的大小对其影响也很大,下面来看看来自ISUX的米随随讲讲移动手机平台的HTML5前端优化,或许对你有帮助和启发. 概述 1. PC优化手段在Mobile侧同样适用      2. 在Mobile侧我们提出三秒种渲染完成首屏指标      3. 基于第二点,首屏加载3秒完成或使用Loading      4. 基于联通3G网络平均338KB/s(2.71Mb/s),所以首屏资源不应超过1014KB      5. Mobile侧因手机配置

页面优化——js异步加载

同步加载 在介绍js异步加载之前,我们先来看看什么是js同步加载.我们平时最常使用的就是这种同步加载形式: <script src="http://XXX.com/script.js"></script> 同步模式,又称阻塞模式,会阻止浏览器的后续处理,停止了后续的解析,因此停止了后续的文件加载(如图像).渲染.代码执行.一般的script标签(不带async等属性)加载时会阻塞浏览器,也就是说,浏览器在下载或执行该js代码块时,后面的标签不会被解析,例如在he

ASP.NET页面优化性能提升方法记录

今天与大家分享:一种优化页面执行速度的方法.采用这个方法,可以使用页面的执行速度获得[8倍]的提升效果. 为了让您对优化的效果有个直观的了解,我准备了下面的测试结果截图: 测试环境:1. Windows Server 2003 SP22. Viaual Studio 2008,使用自带的WebDev.WebServer.EXE运行网站程序.3. (ThinkPad SL510):Core2 T6670 2.2GHz, 4G内存 二个红框中的数字反映了优化前后的执行时间.数字表明:优化前后,执行时