最高半折刷qq各种业务和钻(家里人自己开的,尽管放心,大家多捧捧场)

sking7

导航

浏览器解析样式表的异同

 

原文:http://www.ilovejs.net/archives/861

之前的测试都在页面中直接通过link元素外联css文件,但是动态插入的情况呢?(非常感谢Emu的提醒)

因此,又测试了使用DOM Element的方式来动态插入link元素,并外联css文件,可是问题依旧,《测试示例》。IE、Chrome、Safari照常需要等到全部的样式表都加载下来才开始呈现页面样式;FF、Opera是加载完一个样式表就渲染页面,而不需要等到全部的样式表都加载下来。

之后,测试使用一个定时器(setTimeout)的方式来异步执行动态加载css文件,《测试页面》,这下子就有点意思了:IE出现了无样式内容闪烁,仍然需要等全部的样式表都加载下来之后才呈现页面;Chrome、Safari跟FF、Opera一样了,加载完一个样式表就渲染页面,不需要等到全部的样式表都加载下来。

不过定时器的方式虽然解决了Chrome、Safari的问题,但是使得IE可能会出现无样式内容闪烁,所以也并不是很完美的方案,就看网站的用户群偏向哪些浏览器多一些了,并对这些浏览器做这方面的优化。

——————— 完美的分界线 ———————-

一直存在一个疑问:IE同其他主流浏览器的兼容性差异都涉及到布局、HTML、Javascript、CSS规则等方面,但是对于解析样式表来渲染整个页面呢,是否也存在异同?当看到Steve Souders的博文《Frontend SPOF》,迷惑揭开了,文中对各种浏览器解析样式表的机制做了如下描述:

Browsers are split on how they handle stylesheets. Firefox and Opera charge ahead and render the page, and then flash the user if elements have to be redrawn because their styling changed. Chrome, Internet Explorer, and Safari delay rendering the page until the stylesheets have arrived. (Generally they only delay rendering elements below the stylesheet, but in some cases IE will delay rendering everything in the page.) If rendering is blocked and the stylesheet takes a long time to download, or times out, the user is left staring at a blank page. There’s not a lot of advice on loading stylesheets without blocking page rendering, primarily because it would introduce the flash of unstyled content.

上面说的很明白,对于样式表的加载和渲染的原理,不同的浏览器下有不同的行为,主要是分为Firefox、Opera和IE、Chrome、Safari两类。

Firefox、Opere在加载样式表的时候是边加载边渲染。这样既有利也有弊:利在使得页面可以尽快的开始渲染,而无须等待全部的样式表都加载下来之 后再开始渲染,延迟了页面渲染;而弊端在于之前加载并渲染的样式在后面又重新定义或者修改了布局样式,那么将会造成一定程度上的闪烁,闪烁的程度主要看所 影响的元素的范围和数目。

而IE、Chrome、Safari则是在全部的样式表完全加载下来之后才开始渲染页面样式。这样做也同样是有利有弊:利在于可以避免 Firefox、Opera中出现的闪烁的问题(虽然在IE下闪烁是经常的事情),可以确保样式会统一解析并渲染页面;而弊端在于页面全部样式表的加载延 迟了页面渲染的时间,如果样式表加载的时间较长,或者加载错误,将会导致页面一直处于空白状态或者无样式状态,还有可能是“无样式内容的闪烁“的问题的出 现。

为了证实上面的说法,进行了一个测试,这个测试的关键是延迟样式表的加载,但是不能延迟了HTML页面的加载和解析,并在页面中添加几个样式表做比 较。为此,利用PHP的sleep函数在其中一个样式表中延迟3秒,并放到body的底部来加载,而另外一个样式表放到head里加载:《浏览器解析样式表的测试》。测试结果很明显:FF、Opera是首先解析了第一个样式表,等第二个延迟加载的样式表加载下来的时候,改变了第一个样式表的样式,出现了闪烁;IE、Chrome、Safari则是需要等到第二个样式表也加载下来的时候才开始渲染页面样式,导致了3秒的渲染延迟。

通过上面的测试证实,明白了在页面中Minify CSS、Put CSS at the head的实质理由和重要性:最小化页面渲染延迟时间。并总结出下面几点:

  1. 尽量避免将样式表放置到body中来加载,避免IE、Chrome、Safari延迟页面开始渲染的时间,也避免IE下的“空白闪烁”和“无样式内容的闪烁”等问题。
  2. 如果页面中有几个样式表,尽量合并为一个样式表文件,避免FF、Opera样式闪烁的问题。既然文件大小总量不变,那就尽量保持HTTP请求数的最小化吧。
  3. 在样式表Minify后,再Gzip压缩下,效果更佳,最小化各个浏览器对于加载并解析样式表的差异性而造成不同程度的用户体验的影响。
  4. 尽早的让样式表加载,最好是在加载并解析HTML之后就开始加载样式表。但是也要避免样式表后紧跟行内脚本,从而造成对后续资源的阻塞。
  5. 对于当前页面使用不到的样式表,就删除掉,避免整个站点的页面都使用同一个样式表,从而节省不必要的宽带和使得页面的渲染时间越早越好。

posted on 2012-04-20 17:26  G.N&K  阅读(417)  评论(0)    收藏  举报