虽然<div>这样的元素通常会增长以适应其内容,但使用float属性可能会给CSS新手带来一个惊人的问题:如果浮动元素具有非浮动的父元素,父元素将会折叠。

例如:

< div > < span style=" font - family:宋体;"> Div 1 < / Div > < span style=" font - family:宋体;"2 > Div < / Div > < / div >

本例中的父div不会展开以包含它的浮动子div——它看起来高度为:0。

你如何解决这个问题?

我想在这里创建一个详尽的解决方案列表。如果您知道跨浏览器兼容性问题,请指出来。

解决方案1

浮动父节点。

< span style=" font - family:宋体;"> < span style=" font - family:宋体;"> Div 1 < / Div > < span style=" font - family:宋体;"2 > Div < / Div > < / div >

优点:语义代码。 缺点:你可能不总是希望父元素浮动。即使你这样做了,你是否浮动了父母的父母等等?必须浮动每个祖先元素吗?

解决方案2

给父节点一个明确的高度。

< span style=" font - family:宋体;> < span style=" font - family:宋体;"> Div 1 < / Div > < span style=" font - family:宋体;"2 > Div < / Div > < / div >

优点:语义代码。 缺点:不灵活——如果内容改变或浏览器大小调整,布局就会中断。

解决方案3

在父元素中添加一个“spacer”元素,如下所示:

<div> <div style=“float: left;”>div 1</div> <div style=“float: left;”>div 2</div> <div class=“spacer” style=“clear: both;”></div> </div>

优点:编码简单明了。 缺点:没有语义性;分隔符div仅作为布局hack存在。

解决方案4

将parent设置为overflow: auto。

< span style=" font - family:宋体;"> < span style=" font - family:宋体;"> Div 1 < / Div > < span style=" font - family:宋体;"2 > Div < / Div > < / div >

优点:不需要额外的div。 缺点:看起来像一个黑客-这不是溢出属性的声明的目的。

评论?其他建议吗?


当前回答

我认为最好的方法是明确:既要对即将到来的元素。

原因如下:

1):after选择器在IE6/7中不支持,在FF3中有bug,但是 如果你只关心IE8+和FF3.5+清除:after可能对你来说是最好的…

2) overflow应该做一些其他的事情,所以这个hack不够可靠。

作者注意:在清算方面没有什么hack…清除意味着跳过浮动字段。CLEAR是自HTML3(谁知道呢,也许更久)http://www.w3.org/MarkUp/html3/deflists.html以来就与我们在一起了,也许他们应该选择一个有点不同的名字,比如page: new,但这只是一个细节…

其他回答

我通常使用overflow: auto trick;虽然严格地说,这不是overflow的预期用途,但它有点相关——当然,这足以让它容易记住。float: left本身的含义已经扩展到各种用途,在这个例子中,比overflow更重要。

理想的解决方案是对列使用内联块,而不是浮动。我认为浏览器的支持是非常好的,如果你遵循(a)应用内联块的元素通常是内联的(如span);(b)为Firefox添加-moz-inline-box。

在FF2中检查你的页面,因为我在嵌套某些元素时遇到了很多问题(令人惊讶的是,这是IE比FF表现更好的一种情况)。

我认为最好的方法是明确:既要对即将到来的元素。

原因如下:

1):after选择器在IE6/7中不支持,在FF3中有bug,但是 如果你只关心IE8+和FF3.5+清除:after可能对你来说是最好的…

2) overflow应该做一些其他的事情,所以这个hack不够可靠。

作者注意:在清算方面没有什么hack…清除意味着跳过浮动字段。CLEAR是自HTML3(谁知道呢,也许更久)http://www.w3.org/MarkUp/html3/deflists.html以来就与我们在一起了,也许他们应该选择一个有点不同的名字,比如page: new,但这只是一个细节…

clearfix有几个版本,Nicolas Gallagher和Thierry Koblentz是主要作者。

如果你想要支持旧的浏览器,最好使用这个clearfix:

.clearfix:before, .clearfix:after {
    content: "";
    display: table;
}

.clearfix:after {
    clear: both;
}

.clearfix {
    *zoom: 1;
}

在SCSS中,你应该使用以下技术:

%clearfix {
  &:before, &:after {
    content:" ";
    display:table;
  }

  &:after {
    clear:both;
  }

  & {
    *zoom:1;
  }
}

#clearfixedelement {
    @extend %clearfix;
}

如果你不关心对旧浏览器的支持,有一个更短的版本:

.clearfix:after {
    content:"";
    display:table;
    clear:both;
}

解决方案1:

最可靠和不引人注目的方法似乎是:

演示:http://jsfiddle.net/SO_AMK/wXaEH/

HTML:

<div class="clearfix">
    <div style="float: left;">Div 1</div>
    <div style="float: left;">Div 2</div>
</div>​

CSS:

.clearfix::after { 
   content: " ";
   display: block; 
   height: 0; 
   clear: both;
}

通过一点CSS目标,您甚至不需要向父DIV添加类。

这个解决方案向后兼容IE8,所以你不需要担心旧的浏览器失败。

解决方案2:

有人建议对解决办法1进行调整,具体如下:

演示:http://jsfiddle.net/wXaEH/162/

HTML:

<div class="clearfix">
    <div style="float: left;">Div 1</div>
    <div style="float: left;">Div 2</div>
</div>​

CSS:

.clearfix::after { 
   content: " ";
   display: block; 
   height: 0; 
   clear: both;
   *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML += '<div class="ie7-clear"></div>' );
}

.ie7-clear {
    display: block;
    clear: both;
}

该解决方案似乎向后兼容IE5.5,但未经测试。

解决方案3:

也可以设置display: inline-block;宽度:100%;在不折叠的情况下模拟一个正常的块元素。

演示:http://jsfiddle.net/SO_AMK/ae5ey/

CSS:

.clearfix {
    display: inline-block;
    width: 100%;
}

该解决方案应该向后兼容IE5.5,但只在IE6中进行了测试。