IE7中浮动元素无法自动换行的bug
Time: 10-05-27 Comments: 6
项目中,一不留神就碰到了这个bug,虽未找到根本原因,但还是先和大家分享一下。。。
一. 重现bug
重现条件:当一个容器中的所有子元素被浮动,未显示的设置子元素宽度,且将元素设置为溢出隐藏,我们来看看具体的code:
// html:
<ul>
<li>我是第一项</li>
<li>我是第二项二项</li>
<li>我是第三项三项三项</li>
<li>我是第四项四项四项四项</li>
</ul>
// css:
* {
margin: 0;
padding: 0;
}
ul {
width: 400px;
overflow: hidden;
margin: 20px auto;
padding: 10px;
font-size: 14px;
border: 1px solid red;
}
ul li {
display: inline;
float: left;
overflow: hidden; // 未设置宽度时,这哥们会导致bug
white-space: nowrap;
border: 1px solid green;
}
IE7和IE8的显示结果如下(非IE7的显示结果与IE8相同):
二. 原因
这次有点杯具,只找到一点有参考价值的说明:
// 摘自"Do floated items need a width?"章节 You should always set a width on floated items. If no width is set, the results can be unpredictable. Theoretically, a floated element with an undefined width should shrink to the widest element within it. This could be a word, a sentence or even a single character - and results can vary from browser to browser. // 这里说明了两点(这里的信息也无法解释IE7中的表现): // 1. 当浮动元素未设置宽度时,结果可能是不可预知的; // 2. 当浮动元素未设置宽度时,从理论上讲,元素的宽度等于其子元素宽度的最大值。
三. 解决办法
目前找到的解决方法有:
1. 去掉浮动元素上的overflow:hidden;
2. 显示设置浮动元素的宽度(但有时候,为了让元素自适应宽度,我们会故意不设置宽度);
3. 如果被浮动的元素有子元素时,可将overflow: hidden设置到子元素上,如li下有个子元素a,那么可将a设置为block,然后再设置overflow: hidden。
Leave a comment!
探秘数组的push方法 >>

Comments
释然 at 2010年05月28日 7:52 上午
姐,下次搞个demo出来呗。。。
狂热软件站 at 2010年07月9日 3:32 上午
如果可以有QQ代码那样的演示运行就好了!
murray86 at 2010年10月10日 10:54 上午
3. 如果被浮动的元素有子元素时,可将overflow: hidden设置到子元素上,如li下有个子元素a,那么可将a设置为block,然后再设置overflow: hidden。
+1
小菜 at 2011年01月5日 11:16 下午
这两天在搞一个ul列表,里面使用了一个小技巧,首先是ul有定宽,并且overflow:hidden, 然后让ul下面的li有1px的左边框并浮动,且左margin设为-1px(重点),这样的列表可以用来呈现一些并列词汇(譬如个行业类别),相邻li之前有竖线隔开,同时最左最右的li外侧边均不出现竖线。。。有点意外,在ie7下面遇到了跟你一样的问题。搜到你的文章,整好是li多了个overflow:hidden,去掉,完美解决,特此感谢一下
IE7中浮动元素无法自动换行的bug « 可乐吧 at 2011年01月7日 11:46 上午
[...] 本文转载自:哈哈小老虎’s Blog [...]
Author comment by Tcer at 2011年01月14日 8:07 下午
@小菜,能对你有帮助,我很高兴,呵呵。。。