<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>优涩控 &#187; 前端开发</title>
	<atom:link href="http://www.userkon.com/category/frontend/feed" rel="self" type="application/rss+xml" />
	<link>http://www.userkon.com</link>
	<description>一群对用户脑残的家伙</description>
	<lastBuildDate>Tue, 07 Sep 2010 15:20:46 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>让页面变得更快一点（一）</title>
		<link>http://www.userkon.com/sunji/reflow_and_repaint_1.html</link>
		<comments>http://www.userkon.com/sunji/reflow_and_repaint_1.html#comments</comments>
		<pubDate>Mon, 23 Nov 2009 04:26:51 +0000</pubDate>
		<dc:creator>极爷</dc:creator>
				<category><![CDATA[前端开发]]></category>
		<category><![CDATA[reflow]]></category>
		<category><![CDATA[repaint]]></category>

		<guid isPermaLink="false">http://www.userkon.com/sunji/reflow_and_repaint_1.html</guid>
		<description><![CDATA[Web页面运行在各种各样的浏览器当中，浏览器载入、渲染页面的速度直接影响着用户体验。非常不幸的是，效率最低的IE浏览器仍然占领者绝大多数市场份额，这已经严重制约了互联网的发展（感叹一下：“马赛克和IE——阻碍人类文明发展的绊脚石!”）。 简单地说，页面渲染就是浏览器将html代码根据CSS定义的规则显示在浏览器窗口中的这个过程。先来大致了解一下浏览器都是怎么干活的： 用户输入网址（假设是个html页面，并且是第一次访问），浏览器向服务器发出请求，服务器返回html文件； 浏览器开始载入html代码，发现&#60;head&#62;标签内有一个&#60;link&#62;标签引用外部CSS文件； 浏览器又发出CSS文件的请求，服务器返回这个CSS文件； 浏览器继续载入html中&#60;body&#62;部分的代码，并且CSS文件已经拿到手了，可以开始渲染页面了； 浏览器在代码中发现一个&#60;img&#62;标签引用了一张图片，向服务器发出请求。此时浏览器不会等到图片下载完，而是继续渲染后面的代码； 服务器返回图片文件，由于图片占用了一定面积，影响了后面段落的排布，因此浏览器需要回过头来重新渲染这部分代码； 浏览器发现了一个包含一行Javascript代码的&#60;script&#62;标签，赶快运行它； Javascript脚本执行了这条语句，它命令浏览器隐藏掉代码中的某个&#60;div&#62;（style.display=”none”）。杯具啊，突然就少了这么一个元素，浏览器不得不重新渲染这部分代码； 终于等到了&#60;/html&#62;的到来，浏览器泪流满面…… 等等，还没完，用户点了一下界面中的“换肤”按钮，Javascript让浏览器换了一下&#60;link&#62;标签的CSS路径； 浏览器召集了在座的各位&#60;div&#62;&#60;span&#62;&#60;ul&#62;&#60;li&#62;们，“大伙儿收拾收拾行李，咱得重新来过……”，浏览器向服务器请求了新的CSS文件，重新渲染页面。 浏览器每天就这么来来回回跑着，要知道不同的人写出来的html和css代码质量参差不齐，说不定哪天跑着跑着就挂掉了。好在这个世界还有这么一群人——页面重构工程师，平时挺不起眼，也就帮视觉设计师们切切图啊改改字，其实背地里还是干了不少实事的。 说到页面为什么会慢？那是因为浏览器要花时间、花精力去渲染，尤其是当它发现某个部分发生了点变化影响了布局，需要倒回去重新渲染，内行称这个回退的过程叫reflow。 &#160; reflow几乎是无法避免的。现在界面上流行的一些效果，比如树状目录的折叠、展开（实质上是元素的显示与隐藏）等，都将引起浏览器的reflow。鼠标滑过、点击……只要这些行为引起了页面上某些元素的占位面积、定位方式、边距等属性的变化，都会引起它内部、周围甚至整个页面的重新渲染。通常我们都无法预估浏览器到底会reflow哪一部分的代码，它们都彼此相互影响着。 reflow问题是可以优化的，我们可以尽量减少不必要的reflow。比如开头的例子中的&#60;img&#62;图片载入问题，这其实就是一个可以避免的reflow——给图片设置宽度和高度就可以了。这样浏览器就知道了图片的占位面积，在载入图片前就预留好了位置。 另外，有个和reflow看上去差不多的术语：repaint，中文叫重绘。如果只是改变某个元素的背景色、文字颜色、边框颜色等等不影响它周围或内部布局的属性，将只会引起浏览器repaint。repaint的速度明显快于reflow（在IE下需要换一下说法，reflow要比repaint更缓慢）。下次将通过一系列的实验说明在Firefox、IE等浏览器下reflow的优化。 （待续）]]></description>
			<content:encoded><![CDATA[<p>Web页面运行在各种各样的浏览器当中，浏览器载入、渲染页面的速度直接影响着用户体验。非常不幸的是，效率最低的IE浏览器仍然占领者绝大多数市场份额，这已经严重制约了互联网的发展（感叹一下：“马赛克和IE——阻碍人类文明发展的绊脚石!”）。 </p>
<p>简单地说，页面渲染就是浏览器将html代码根据CSS定义的规则显示在浏览器窗口中的这个过程。先来大致了解一下浏览器都是怎么干活的：</p>
<blockquote><ol>
<li>用户输入网址（假设是个html页面，并且是第一次访问），浏览器向服务器发出请求，服务器返回html文件； </li>
<li>浏览器开始载入html代码，发现&lt;head&gt;标签内有一个&lt;link&gt;标签引用外部CSS文件； </li>
<li>浏览器又发出CSS文件的请求，服务器返回这个CSS文件； </li>
<li>浏览器继续载入html中&lt;body&gt;部分的代码，并且CSS文件已经拿到手了，可以开始渲染页面了； </li>
<li>浏览器在代码中发现一个&lt;img&gt;标签引用了一张图片，向服务器发出请求。此时浏览器不会等到图片下载完，而是继续渲染后面的代码； </li>
<li>服务器返回图片文件，由于图片占用了一定面积，影响了后面段落的排布，因此浏览器需要回过头来重新渲染这部分代码； </li>
<li>浏览器发现了一个包含一行Javascript代码的&lt;script&gt;标签，赶快运行它； </li>
<li>Javascript脚本执行了这条语句，它命令浏览器隐藏掉代码中的某个&lt;div&gt;（style.display=”none”）。杯具啊，突然就少了这么一个元素，浏览器不得不重新渲染这部分代码； </li>
<li>终于等到了&lt;/html&gt;的到来，浏览器泪流满面…… </li>
<li>等等，还没完，用户点了一下界面中的“换肤”按钮，Javascript让浏览器换了一下&lt;link&gt;标签的CSS路径； </li>
<li>浏览器召集了在座的各位&lt;div&gt;&lt;span&gt;&lt;ul&gt;&lt;li&gt;们，“大伙儿收拾收拾行李，咱得重新来过……”，浏览器向服务器请求了新的CSS文件，重新渲染页面。 </li>
</ol>
</blockquote>
<p><span id="more-211"></span></p>
<p>浏览器每天就这么来来回回跑着，要知道不同的人写出来的html和css代码质量参差不齐，说不定哪天跑着跑着就挂掉了。好在这个世界还有这么一群人——页面重构工程师，平时挺不起眼，也就帮视觉设计师们切切图啊改改字，其实背地里还是干了不少实事的。 </p>
<p>说到页面为什么会慢？那是因为浏览器要花时间、花精力去渲染，尤其是当它发现某个部分发生了点变化影响了布局，需要倒回去重新渲染，内行称这个回退的过程叫reflow。</p>
<p>&#160;</p>
<p><a title="reflow.gif" href="http://www.flickr.com/photos/41128764@N02/4127205910/"><img border="0" hspace="0" alt="reflow.gif" src="http://farm3.static.flickr.com/2562/4127205910_a2b977089d.jpg" /></a></p>
<p>reflow几乎是无法避免的。现在界面上流行的一些效果，比如树状目录的折叠、展开（实质上是元素的显示与隐藏）等，都将引起浏览器的reflow。鼠标滑过、点击……只要这些行为引起了页面上某些元素的占位面积、定位方式、边距等属性的变化，都会引起它内部、周围甚至整个页面的重新渲染。通常我们都无法预估浏览器到底会reflow哪一部分的代码，它们都彼此相互影响着。</p>
<p>reflow问题是可以优化的，我们可以尽量减少不必要的reflow。比如开头的例子中的&lt;img&gt;图片载入问题，这其实就是一个可以避免的reflow——给图片设置宽度和高度就可以了。这样浏览器就知道了图片的占位面积，在载入图片前就预留好了位置。</p>
<p>另外，有个和reflow看上去差不多的术语：repaint，中文叫重绘。如果只是改变某个元素的背景色、文字颜色、边框颜色等等不影响它周围或内部布局的属性，将只会引起浏览器repaint。repaint的速度明显快于reflow（在IE下需要换一下说法，reflow要比repaint更缓慢）。下次将通过一系列的实验说明在Firefox、IE等浏览器下reflow的优化。 </p>
<p><a title="repaint.gif" href="http://www.flickr.com/photos/41128764@N02/4126435059/"><img border="0" hspace="0" alt="repaint.gif" src="http://farm3.static.flickr.com/2722/4126435059_2998430fcf.jpg" /></a></p>
<p>（待续）</p>
]]></content:encoded>
			<wfw:commentRss>http://www.userkon.com/sunji/reflow_and_repaint_1.html/feed</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
	</channel>
</rss>
