美文网首页前端笔试+面试
什么时候需要清除浮动,清除浮动都有哪些方法

什么时候需要清除浮动,清除浮动都有哪些方法

作者: xyfun | 来源:发表于2016-11-21 14:16 被阅读2727次

什么时候要清除浮动

其实浮动float最开始出现的意义只是为了让文字环绕图片而已。但人们发现,如果想要三个块级元素并排显示,都给它们加个float来得会比较方便。但这样做也会带来问题......

我们希望看到这样的效果:

希望看到的效果

但结果却是这样:

实际的效果

这个时候,我们就要清除浮动带来的影响——父元素高度塌陷了。

这里引用张鑫旭大神观点

撇开浮动的“破坏性”,浮动就是个带有方位的display:inline-block属性。

一目了然:如果我们给上面的三个绿颜色的方块设置display:inline-block也能达到让它们并排显示的效果。并且父元素的高度也不会塌陷。只不过无法控制是居左还是居右,display:inline-block只能从左往右。


来看看我们如何清除浮动

我们说的清除浮动是指清除由于子元素浮动带来父元素高度塌陷的影响

  1. 为父元素设置高度
    为父元素定高,简单粗暴,坏处不用多说吧,没有人会这么干的..._

  2. 在父元素的最后设置clear:both

<div class="p">
        <div class="c"></div>
        <div class="c"></div>
        <div class="c"></div>
        <div style="clear:left;"></div> <!--冗余的子元素-->
</div>

当添加了最后一个冗余元素(未设置clear:both)时;父元素和此冗余元素的高度都为0,并且三个浮动的元素都浮在了它们的上方盖住了它们(可以把它们看成PS中的图层)。现在,给这个冗余元素添加clear:bothclear属性介绍),它便要躲开这三个浮动元素,因此,一直往下跑,直到没有被浮动元素盖住才停下来。而父元素看到这个子元素跑开了,自然想要包裹住它。

加了`clear`后冗余元素由位置1跑到了位置2
这样就能看到我们想要的结果了——父元素高度被撑开了。
大功告成
貌似不错,不过似乎有点问题——我们有必要在页面中添加这么多没有意义的冗余元素吗?显然这样太麻烦,而且不符合语义化。
还好有伪元素,这里我们使用::after。添加一个类fix
.fix::after { 
        content:"."; 
        display:block; 
        height:0; 
        visibility:hidden; 
        clear:both;
}

在我们需要清除浮动时,只需要给父元素追加fix类就能达到清除浮动的效果,既方便又符合语义化。

<div class="p fix">
        <div class="c"></div>
        <div class="c"></div>
        <div class="c"></div>
</div>

当然,大神的fix类这么写:

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

大师手笔,看起来更清爽了......

  1. 给父元素添加overflow:hidden
    这里有必要了解一下BFC块级格式化上下文,只说结论:

创建了 BFC的元素就是一个独立的盒子,不过只有Block-level box可以参与创建BFC, 它规定了内部的Block-level Box如何布局,并且与这个独立盒子里的布局不受外部影响,当然它也不会影响到外面的元素。它具有以下特征:

  1. 内部的Box会在垂直方向,从顶部开始一个接一个地放置。
  2. Box垂直方向的距离由margin决定。属于同一个BFC的两个相邻Box的margin会发生叠加。
  3. 每个元素的margin box的左边, 与包含块border box的左边相接触(对于从左往右的格式化,否则相反)。即使存在浮动也是如此。
  4. BFC的区域不会与float box叠加。
  5. BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素,反之亦然。
  6. 计算BFC的高度时,浮动元素也参与计算。

看到第六条,如获至宝。只需给父元素创建块级格式化上下文,就可以让浮动的元素参与高度计算,这样一来,父元素的高度就有了。
不单单只有给父元素添加overflow:hidden才可以创建块级格式化上下文,下列方法都可以:

  • 浮动 (元素的 float不为 none
  • 绝对定位元素 (元素的 positionabsolutefixed)
  • 行内块 inline-blocks (元素的 display: inline-block)
  • 表格单元格 (元素的 display: table-cell,HTML表格单元格默认属性)
  • 表格标题 (元素的 display: table-caption,HTML表格标题默认属性)
  • overflow的值不为 visible的元素
  • 弹性盒子 flex boxes (元素的 display: flexinline-flex)

overflow:hidden较多的原因是不会带来其它的布局问题。

题外话:其实用块级上下文解释清除浮动个人感觉牵强,但也解释的过去哈。开拓下思维,看下知乎的问题CSS中为什么overflow:hidden能清除浮动(float)的影响?原理是什么?,或许能找到你想要的。

相关文章

  • 什么时候需要清除浮动,清除浮动都有哪些方法

    什么时候要清除浮动 其实浮动float最开始出现的意义只是为了让文字环绕图片而已。但人们发现,如果想要三个块级元素...

  • css清除浮动的三种方法

    摘要:css清除浮动float的三种方法总结,为什么要清除浮动?浮动会有哪些影响? 一.先看现象(display:...

  • 11.22 前端学习

    清除浮动 clear:left清除左浮动clear:right清除右浮动clear:both清除对它影响最大的浮动...

  • 前端06

    清除浮动 clear:left清除左浮动clear:right清除右浮动clear:both清除对它影响最大的浮动...

  • 06 前端学习

    清除浮动 clear:left清除左浮动clear:right清除右浮动clear:both清除对它影响最大的浮动...

  • (17.03.27)清除浮动

    清除浮动的方法: clear:both/left/right;清除浮动;两边/左边/右边

  • 小猿圈之HTML/css清除浮动的方法都有哪些?

    清楚浮动对于前端学习者是比较了解的,刚开始接触前端就需要了解,那你知道HTML/css清除浮动的方法都有哪些?小猿...

  • 清除浮动

    3.4清除浮动总结 为什么需要清除浮动? 1、父级没有高度2、子盒子浮动了3、影响下面布局了 清除浮动的方式优点缺...

  • 完美clearfix

    clearfix 清除浮动分为两种: 清除自身浮动 清除父级浮动 这里不讲空标签的方法,因为空标签还要额外添加新的...

  • 清除浮动

    未清除浮动前 清除浮动后

网友评论

    本文标题:什么时候需要清除浮动,清除浮动都有哪些方法

    本文链接:https://www.haomeiwen.com/subject/qccupttx.html