你如何让浮动元素的父母崩溃?

Nat*_*ong 988 html css layout css-float clearfix

尽管像<div>s 这样的元素通常会增长以适应其内容,但使用该float属性可能会给 CSS新手带来惊人的问题:如果浮动元素具有非浮动父元素,则父元素将崩溃.

例如:

<div>
  <div style="float: left;">Div 1</div>
  <div style="float: left;">Div 2</div>
</div>
Run Code Online (Sandbox Code Playgroud)

此示例中的父div 不会展开以包含其浮动的子项 - 它似乎具有height: 0.

你怎么解决这个问题?

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

解决方案1

浮动父母.

<div style="float: left;">
  <div style="float: left;">Div 1</div>
  <div style="float: left;">Div 2</div>
</div>
Run Code Online (Sandbox Code Playgroud)

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

解决方案2

给父母一个明确的高度.

<div style="height: 300px;">
  <div style="float: left;">Div 1</div>
  <div style="float: left;">Div 2</div>
</div>
Run Code Online (Sandbox Code Playgroud)

优点:语义代码.
缺点:不灵活 - 如果内容更改或浏览器调整大小,布局将中断.

解决方案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>
Run Code Online (Sandbox Code Playgroud)

优点:直接编码.
缺点:不是语义; spacer div仅作为布局黑客存在.

解决方案4

将父级设置为overflow: auto.

<div style="overflow: auto;">
  <div style="float: left;">Div 1</div>
  <div style="float: left;">Div 2</div>
</div>
Run Code Online (Sandbox Code Playgroud)

优点:不需要额外的div.
缺点:看起来像一个黑客 - 这不是该overflow财产的既定目的.

评论?其他建议?

A.M*_*M.K 526

解决方案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>?
Run Code Online (Sandbox Code Playgroud)

CSS:

.clearfix::after { 
   content: " ";
   display: block; 
   height: 0; 
   clear: both;
}
Run Code Online (Sandbox Code Playgroud)

通过一些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>?
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

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

解决方案3:

也可以在不折叠的情况下设置display: inline-block;width: 100%;模拟普通块元素.

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

CSS:

.clearfix {
    display: inline-block;
    width: 100%;
}
Run Code Online (Sandbox Code Playgroud)

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

  • @lededje:IE6(地狱,甚至是IE7)都有一个破碎的浮动模型,任何类型的clearfix都无法完全解决. (13认同)
  • -1当您对该元素进行填充时,100%的内联块会产生不良影响.-1:在ie6中不起作用 (7认同)
  • 喜欢认真关心IE6:D IE8的人,我会理解,但IE6对于2012年来说太过分了:P (4认同)
  • @davidtaubmann W3Schools以任何方式官方或部分标准__not__,由不隶属于W3C的第三方公司运营.尽管过去几年它们已经有了很大的改进,但许多开发人员仍然认为它们是一个糟糕的信息来源.我建议您查看MDN或Web平台文档(远不那么全面,但官方)文档.我省略了`overflow:auto`技巧,因为它在问题中提到了要求其他建议. (4认同)

Bob*_*ack 72

我经常使用这个overflow: auto技巧; 虽然这不是严格来说,溢出的用途,它有点关系-足以令它容易记住,一定.float: left在这个例子中,IMO本身的含义已经扩展到各种用途,而不是溢出.

  • W3!= W3Schools,实际上W3Schools imho在标准HTML方面提供了非常"可疑"的内容. (17认同)
  • 关于 W3Schools,我认为这些年来他们至少进步了一点,但重要的是要认识到,就像 @DR 所说,他们不是万维网联盟 (W3C) (2认同)

tyb*_*103 20

放入overflow:auto,而不是放在父母身上overflow:hidden

我为任何网页写的第一个CSS总是:

div {
  overflow:hidden;
}
Run Code Online (Sandbox Code Playgroud)

然后我再也不用担心了.

  • 这是一个坏主意.您不希望随机剪辑任何内容,尤其是在这些div上设置固定尺寸时.此外,有些情况下`overflow:auto`比`overflow:hidden`更受欢迎(例如,您希望内容在溢出时可滚动). (11认同)

Sar*_*raz 18

当浮动元素位于容器框内时,该问题就会发生,该元素不会自动强制容器的高度调整到浮动元素.当一个元素浮动时,它的父元素不再包含它,因为浮动元素从流中移除.您可以使用2种方法来修复它:

  • { clear: both; }
  • clearfix

一旦了解了发生的情况,请使用以下方法"清除"它.

.clearfix:after {
    content: ".";
    display: block;
    clear: both;
    visibility: hidden;
    line-height: 0;
    height: 0;
}

.clearfix {
    display: inline-block;
}

html[xmlns] .clearfix {
    display: block;
}

* html .clearfix {
    height: 1%;
}
Run Code Online (Sandbox Code Playgroud)

示范:)


Joh*_*ers 14

clearfix有几个版本,Nicolas GallagherThierry Koblentz是主要作者.

如果您想要支持旧浏览器,最好使用此clearfix:

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

.clearfix:after {
    clear: both;
}

.clearfix {
    *zoom: 1;
}
Run Code Online (Sandbox Code Playgroud)

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

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

  &:after {
    clear:both;
  }

  & {
    *zoom:1;
  }
}

#clearfixedelement {
    @extend %clearfix;
}
Run Code Online (Sandbox Code Playgroud)

如果您不关心对旧版浏览器的支持,那么版本较短:

.clearfix:after {
    content:"";
    display:table;
    clear:both;
}
Run Code Online (Sandbox Code Playgroud)


Bry*_*n A 9

虽然代码不是完全语义的,但我认为在每个容器的底部都有一个我称之为"清除div"的浮点数更直接.事实上,我在每个项目的重置块中都包含以下样式规则:

.clear 
{
   clear: both;
}
Run Code Online (Sandbox Code Playgroud)

如果你是IE6的样式(上帝帮助你),你可能想要给这个规则一个0px的行高和高度.


Dis*_*oat 9

理想的解决方案是使用inline-block列而不是浮动.我认为如果您遵循(a)inline-block仅适用于通常内联的元素(例如span),浏览器支持非常好; (b)添加-moz-inline-boxFirefox.

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


led*_*dje 9

奇怪的是没有人为此提出一个完整的答案,啊,这就好了.

解决方案一:明确:两者

添加样式清除的块元素:两者; 在它上面将清除浮点数超过该点并停止该元素的父级崩溃.http://jsfiddle.net/TVD2X/1/

优点:允许您清除元素,下面添加的元素不受上面浮动元素和有效css的影响.

缺点:需要另一个标签来清除浮点数,膨胀标记.

注意:要回退到IE6并使其适用于禁用父项(即输入元素),您将无法使用:after.

解决方案二:显示:表格

添加显示:表; 到父母那里,让它从花车上耸耸肩,并以正确的高度展示.http://jsfiddle.net/h9GAZ/1/

优点:没有额外的加价,而且更加整洁.适用于IE6 +

缺点:需要无效的CSS以确保在IE6和7中一切都很好.

注意:IE6和7宽度自动用于防止宽度为100%+填充,而在较新的浏览器中则不然.

关于其他"解决方案"的说明

这些修复工作回到支持最低的浏览器,全局使用率超过1%(IE6),这意味着使用:after后不切断它.

隐藏溢出确实显示内容,但不会阻止元素折叠,因此不会回答问题.使用内联块可能有错误的结果,孩子有奇怪的边距等等,表格要好得多.

设置高度确实"防止"崩溃,但它不是一个正确的修复.

无效的CSS

无效的CSS从来没有伤害任何人,事实上,它现在是常态.使用浏览器前缀与使用浏览器特定的黑客一样无效,并且不会影响最终用户.

结论

我使用上述两种解决方案来使元素正确反应并相互配合,我恳请你也这样做.


Kon*_*lph 6

我在适用的地方使用2和4(即当我知道内容的高度或溢出不会造成伤害时).在其他任何地方,我都使用解决方案3.顺便说一句,你的第一个解决方案没有超过3的优势(我可以发现),因为它不再具有语义,因为它使用相同的虚拟元素.

顺便说一句,我不会担心第四个解决方案是黑客攻击.只有当他们的潜在行为需要重新解释或其他变化时,CSS中的黑客才会有害.这样,你的黑客就不能保证工作了.但是在这种情况下,你的hack依赖于具有的确切行为overflow: auto.搭便车是没有害处的.


小智 5

我最喜欢的方法是为父元素使用clearfix类

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

.clearfix {
    display: inline-block;
}

* html .clearfix {
    height: 1%;
}

.clearfix {
    display: block;
}
Run Code Online (Sandbox Code Playgroud)