<?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; ie7</title>
	<atom:link href="http://lifesinger.org/blog/tag/ie7/feed/" rel="self" type="application/rss+xml" />
	<link>http://lifesinger.org/blog</link>
	<description>关注用户体验、前端开发，记录生活点滴、岁月足迹。</description>
	<lastBuildDate>Mon, 06 Sep 2010 15:05:09 +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>脱离文档流的容器，IE下宽度自适应的bug</title>
		<link>http://lifesinger.org/blog/2009/05/float-element-bug-in-ie/</link>
		<comments>http://lifesinger.org/blog/2009/05/float-element-bug-in-ie/#comments</comments>
		<pubDate>Sun, 17 May 2009 13:24:05 +0000</pubDate>
		<dc:creator>lifesinger</dc:creator>
				<category><![CDATA[开发]]></category>
		<category><![CDATA[bug]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[hasLayout]]></category>
		<category><![CDATA[ie6]]></category>
		<category><![CDATA[ie7]]></category>

		<guid isPermaLink="false">http://lifesinger.org/blog/?p=1717</guid>
		<description><![CDATA[时不时会遇见这个bug，学习PPK，记录沉淀下。 现象 测试页面：ie_hasLayout_width_bug.html 正常情况下，没有设定宽度的浮动容器test-wrap，当包含的block元素test-box也没有设定宽度时，test-box的宽度会和test-wrap保持一致： 其中test-wrap的宽度取决于所包含的子元素的最大宽度。 但在IE7下，test-box的宽度塌缩到最小了： IE6下，test-box的宽度则扩展到和浏览器窗口一样宽： 分析 上面的测试页面，只给出了容器浮动时的场景。实际上，绝对定位的容器也有此问题。浮动和绝对定位有个共同点，就是让元素脱离了文档流。如果没有脱离文档流，比如相当定位，则无此bug。 对于脱离文档流的容器，当容器没有设定宽度时，其宽度会尽量小，取决于容器内子节点的最大宽度。 对于该容器内的block元素，当没有设定宽度时，正常情况下，其宽度会自动和容器的宽度保持一致。 注意测试页面中的第4种情景，当不给test-box设定高宽，保持无hasLayout时，test-box的宽度在IE6和IE7下都是正确的。 第1种情景，给test-box设定了高度，实际上是触发了test-box的hasLayout. 这是引发IE6和IE7下bug的本因。IE7的处理方式是，将容器内有hasLayout的block元素，也塌缩到宽度最小。IE6的处理方式则是，一旦容器内的block元素有了hasLayout，就会无视容器的限制，其宽度会直接越级与document.body保持一致，太不尊重领导了-.- 第2种和第3种情景，给test-wrap设定了宽度。一旦设定了宽度，IE7乖乖的都ok了。恼人的是，当给容器设定的宽度容纳不了里面的block元素时，IE6依旧非常不尊重领导，直接将领导的办公室扩建了。 总结成一句话：当脱离文档流的容器没设定宽度时，在IE7下，容器内触发了hasLayout但没设定宽度的block元素，会很谦虚的缩在一角；而在IE6下，容器内的元素一旦有了hasLayout，就会不尊重领导，直接越级与领导的领导保持一致；即便设定了宽度，也会将直属领导的办公室扩建。 解决方法 知道了缘由，解决方法很自然就能想到： 方法一：给容器设定宽度，并且宽度值能包容所有block子元素，以防止IE6扩建。 方法二：给容器内的子元素设定宽度，让它们自己管好自己，不给领导找麻烦。 方法三：当容器内的元素宽度都未知时，通过js去动态计算子元素的最大宽度。算好后，赋值给容器。比如用 Ext.util.TextMetrics 就能干这事。]]></description>
			<content:encoded><![CDATA[<p>时不时会遇见这个bug，学习PPK，记录沉淀下。</p>
<h3>现象</h3>
<p>测试页面：<a href="http://lifesinger.org/lab/2009/ie_hasLayout_width_bug.html">ie_hasLayout_width_bug.html</a></p>
<p>正常情况下，没有设定宽度的浮动容器test-wrap，当包含的block元素test-box也没有设定宽度时，test-box的宽度会和test-wrap保持一致：<br />
<img src="http://lifesinger.org/blog/wp-content/uploads/2009/05/ie_hasLayout_width_bug_1.png" alt="ie_hasLayout_width_bug_1.png" /><br />
其中test-wrap的宽度取决于所包含的子元素的最大宽度。</p>
<p>但在IE7下，test-box的宽度塌缩到最小了<span id="more-1717"></span>：<br />
<img src="http://lifesinger.org/blog/wp-content/uploads/2009/05/ie_hasLayout_width_bug_2.png" alt="ie_hasLayout_width_bug_2.png" /></p>
<p>IE6下，test-box的宽度则扩展到和浏览器窗口一样宽：<br />
<img src="http://lifesinger.org/blog/wp-content/uploads/2009/05/ie_hasLayout_width_bug_3.png" alt="ie_hasLayout_width_bug_3.png" /></p>
<h3>分析</h3>
<p>上面的测试页面，只给出了容器浮动时的场景。实际上，绝对定位的容器也有此问题。浮动和绝对定位有个共同点，就是让元素脱离了文档流。如果没有脱离文档流，比如相当定位，则无此bug。</p>
<p><strong>对于脱离文档流的容器，当容器没有设定宽度时，其宽度会尽量小，取决于容器内子节点的最大宽度。<br />
对于该容器内的block元素，当没有设定宽度时，正常情况下，其宽度会自动和容器的宽度保持一致。</strong></p>
<p>注意测试页面中的第4种情景，当不给test-box设定高宽，保持无hasLayout时，test-box的宽度在IE6和IE7下都是正确的。</p>
<p>第1种情景，给test-box设定了高度，实际上是触发了test-box的hasLayout. 这是引发IE6和IE7下bug的本因。IE7的处理方式是，将容器内有hasLayout的block元素，也塌缩到宽度最小。IE6的处理方式则是，一旦容器内的block元素有了hasLayout，就会无视容器的限制，其宽度会直接越级与document.body保持一致，太不尊重领导了-.-</p>
<p>第2种和第3种情景，给test-wrap设定了宽度。一旦设定了宽度，IE7乖乖的都ok了。恼人的是，当给容器设定的宽度容纳不了里面的block元素时，IE6依旧非常不尊重领导，直接将领导的办公室扩建了。</p>
<p>总结成一句话：当脱离文档流的容器没设定宽度时，在IE7下，容器内触发了hasLayout但没设定宽度的block元素，会很谦虚的缩在一角；而在IE6下，容器内的元素一旦有了hasLayout，就会不尊重领导，直接越级与领导的领导保持一致；即便设定了宽度，也会将直属领导的办公室扩建。</p>
<h3>解决方法</h3>
<p>知道了缘由，解决方法很自然就能想到：</p>
<ul>
<li>方法一：给容器设定宽度，并且宽度值能包容所有block子元素，以防止IE6扩建。</li>
<li>方法二：给容器内的子元素设定宽度，让它们自己管好自己，不给领导找麻烦。</li>
<li>方法三：当容器内的元素宽度都未知时，通过js去动态计算子元素的最大宽度。算好后，赋值给容器。比如用 Ext.util.TextMetrics 就能干这事。</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://lifesinger.org/blog/2009/05/float-element-bug-in-ie/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
	</channel>
</rss>
