当前位置: 首页 > 面试题库 >

如何防止浮动元素的父项崩溃?

马琛
2023-03-14
问题内容

尽管像这样

的元素通常会增长以适应其内容,但是使用float属性会给 CSS新手带来一个惊人的问题:如果浮动元素具有非浮动父元素,则父元素会折叠。

例如:

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

在此示例中,父div 不会扩展为包含其浮动的子级-似乎有height: 0。

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

解决方案1

Float the parent.

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

优点:语义代码。
缺点:您可能并不总是希望父母浮动。即使您这样做,您是否也浮动了父母的父母,依此类推?您是否必须浮动每个祖先元素?

解决方案2

Give the parent an explicit height.

<div style="height: 300px;">
  <div style="float: left;">Div 1</div>
  <div style="float: left;">Div 2</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>

优点:直接编写代码。
缺点:没有语义;spacer div仅作为版式hack存在。

解决方案4

将parent设置为overflow: auto

<div style="overflow: auto;">
  <div style="float: left;">Div 1</div>
  <div style="float: left;">Div 2</div>
</div>

优点:不需要额外的div。
缺点:好像是骇客-这不是overflow酒店的既定目的。


问题答案:

解决方案1:
最可靠,最简单的方法似乎是这样的:

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进行修改,如下所示:

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;和width: 100%;模拟正常的块元素。

CSS:

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

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



 类似资料:
  • 急求!子元素设置了float:left,为什么是浮动到父元素的父元素(part1)上,而不是浮动到父元素(box1)上?想让这个子元素和学院新闻同行应该怎么办? 这是那个子元素 这是那个子元素 这是整体:

  • 我正在开发一个web应用程序,它显示了一个巨大的卡片网格,其高度本质上是可变的。 为了美观起见,我们使用jQuery的来均衡每行卡片的高度。 它的性能没有得到很好的扩展,所以今天我一直在迁移到一个基于flex box的解决方案,它的速度要快得多。 然而,我失去了一个行为——如果卡头的内容不合适,应该用省略号将其截断。 目标: 3列 列宽度变化以填充父 行间距不变 高度在一排内相等 如何安排容器大小

  • 问题内容: 考虑以下HTML: 和以下CSS: 就目前情况而言,Firefox目前与以下内容类似: 注意,第四项在第二和第三列之间分配。我该如何预防? 所需的渲染可能更像: 要么 编辑: 仅指定宽度以演示不需要的渲染。在实际情况下,当然没有固定的宽度。 问题答案: 正确的方法是使用闯入式CSS属性: 不幸的是,截至2019年10月,Firefox不支持此功能,但其他所有主流浏览器均支持此功能。使用

  • 问题内容: 任何人都知道为什么overflow:hidden强制具有浮动元素的元素包装元素吗? 我真的很想了解内部工作原理,而不是仅仅使用它并相信“它确实有效”。 当包含元素的方向与浮动的子元素相同的方向时,我可以理解它的工作原理,但是overflow:hidden意味着裁剪溢出的内容(与position:absolute / relative一起使用时)。 任何信息表示赞赏。 问题答案: 浮点数

  • 问题内容: 我已经在SO上看到了几次这样的问题,并且给出了相同的答案,但这些答案在我的Chrome或Firefox中不起作用。 我想让一组左浮动div开始运行,水平放置一个带有水平滚动条的父div。 我可以在这里演示如何使用此糟糕的嵌入式CSS 但是,从SO *给出的答案来看,这应该可行,但对我而言却不可行。 有没有一种方法可以定义每个项目的绝对位置呢? eg [防止浮动的div包装到下一行 问题

  • 问题内容: 我有一个“浮动工具箱”-的div 。效果很好。 但是,当在该框内滚动(使用鼠标滚轮)并到达底部或顶部时,父元素将“接管”“滚动请求”:工具箱后面的文档将滚动。 -这很烦人,而不是用户的“要求”。 我正在使用jQuery,并认为可以使用event.stoppropagation()停止此行为: 它确实输入了该函数,但是仍然会发生传播(文档滚动) 很难在SO(和Google)上搜索此主题,