小皆学前端—浏览器的渲染原理(转)
在之前一直看到【渲染】这个词,但是始终没搞懂是怎么回事,这两天在网上找了一些大神的资料,稍微明白了一些些。在这边只说浅层的意思,不做深入的研究,我也怕把自己绕进去搞得晕乎乎的,这篇也只适合刚入门的小小白看,大神请绕道勿喷谢谢啦~~
下面和大家分享一个讲得比较好理解的例子。
我们知道浏览器内部有一个渲染引擎(也叫浏览器内核),不同的浏览器引擎是不同的,一般情况下,渲染引擎可以显示HTML文档和图片,也可以借助插件显示其他类型的数据,几大主流的浏览器的渲染引擎分别为:Chrome&Safari——webkit,Firefox——Gecko,IE——Trident。
为什么要说到渲染引擎呢,因为渲染引擎决定了浏览器如何显示网页的内容以及页面的格式信息,不同的浏览器内核对网页编写语法的解释也有不同,因此显示的效果也会不同,这也就是为什么我们在写代码的时候需要兼容各种浏览器的原因。好啦扯太多这不是今天的重点。
简单地说,页面渲染就是浏览器将html代码根据CSS定义的规则显示在浏览器窗口中的这个过程。
下面是大神对浏览器加载内容模拟的一个情景,我就是看了下面的这个描述才明白了HTML、CSS和JS是怎么一个加载过程。
这边附上原文地址:http://www.cnblogs.com/ada-zheng/p/4308581.html
1.用户输入网址(假设是个html页面,并且是第一次访问),浏览器向服务器发出请求,服务器返回html文件;
2. 浏览器开始载入html代码,发现标签内有一个标签<link>引用外部CSS文件;
3. 浏览器又发出CSS文件的请求,服务器返回这个CSS文件;
4. 浏览器继续载入html中<body>部分的代码,并且CSS文件已经拿到手了,可以开始渲染页面了;
5.浏览器在代码中发现一个<img>标签引用了一张图片,向服务器发出请求。此时浏览器不会等到图片下载完,而是继续渲染后面的代码;
6.服务器返回图片文件,由于图片占用了一定面积,影响了后面段落的排布,因此浏览器需要回过头来重新渲染这部分代码;
7. 浏览器发现了一个包含一行Javascript代码的<script>标签,赶快运行它;
8. Javascript脚本执行了这条语句,它命令浏览器隐藏掉代码中的某个(style.display=”none”)。杯具啊,突然就少了这么一个元素,浏览器不得不重新渲染这部分代码;
9. 终于等到了</html>的到来,浏览器泪流满面……
10. 等等,还没完,用户点了一下界面中的“换肤”按钮,Javascript让浏览器换了一下<link>标签的CSS路径;
11. 浏览器召集了在座各位<span><ul><li>们,“大伙儿收拾收拾行李,咱得重新来过…”,浏览器向服务器请求了新的CSS文件,重新渲染页面。
模拟情景结束啦~~~~
浏览器每天就这么来来回回跑着,要知道不同的人写出来的html和css代码质量参差不齐,说不定哪天跑着跑着就挂掉了。
reflow(回退)
我们说页面打开为什么会慢?那是因为浏览器要花时间、花精力去渲染,尤其是当它发现某个部分发生了点变化影响了布局,需要倒回去重新渲染,而这个回退的过程就称为reflow。
reflow几乎是无法避免的。现在界面上流行的一些效果,比如树状目录的折叠、展开(实质上是元素的显示与隐藏)等,都将引起浏览器的 reflow。鼠标滑过、点击……只要这些行为引起了页面上某些元素的占位面积、定位方式、边距等属性的变化,都会引起它内部、周围甚至整个页面的重新渲染。通常我们都无法预估浏览器到底会reflow哪一部分的代码,它们都彼此相互影响着。
reflow问题的优化。我们可以尽量减少不必要的reflow。比如开头例子中的<img>图片载入问题,我们只要给定图片的宽和高就可以了。这样浏览器就知道了图片的占位面积,在载入图片前就预留好了位置。
repaint(重绘)
如果只改变了某个元素的背景色、文字颜色、边框颜色等不影响它周围或内部布局的属性,就只会引起repaint,而不会reflow。
repaint的速度快于 reflow(注意:在IE下,reflow要比repaint 慢)
IE原来你是如此难伺候的银。。。hhh