浮动

清除浮动

Ⅰ额外添加新标签

在浮动元素的末尾添加空标签<div style="clear: left;"></div>

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .outer {
            width: 300px;
            border: 1px solid #ccc;
            background: red;
        }

        .inner {
            width: 100px;
            height: 100px;
            background: blue;
            float: left;
        }
    </style>
</head>

<body>
    <div class="outer">
        <div class="inner"></div>
        <div style="clear: left;"></div>
    </div>
</body>

</html>

原理分析:clear:both属性会防止指定了clear的元素两边存在浮动元素。由于.new左右均不能有浮动元素,所以它必须在.inner下面找到一个位置,所以.outer就被撑开了。注意:新添加的.new一定要为块级元素,不然.new就不会换行在.inner下面找位置,而是在inner右边找位置了。

优点:易理解,不容易受其他属性设置影响

缺点:增加了dom节点数

Ⅱ给父级标签添加overflow:hidden;可以触发BFC,而BFC具有清除浮动的效果

缺点:缺点是内容多的时候容易造成不会自动换行导致内容被隐藏

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .outer {
            width: 300px;
            border: 1px solid #ccc;
            background: red;
            overflow: hidden;
        }

        .inner {
            width: 100px;
            height: 100px;
            background: blue;
            float: left;
        }
    </style>
</head>

<body>
    <div class="outer">
        <div class="inner"></div>
    </div>
</body>

</html>

注释:overflow:hidden/auto/scroll都可以触发BFC清楚浮动

BFC

块格式化上下文(Block Formatting Context,BFC) 是Web页面的可视化CSS渲染的一部分,是块盒子的布局过程发生的区域,也是浮动元素与其他元素交互的区域。

下列方式会创建块格式化上下文:

  • 根元素或包含根元素的元素

  • 浮动元素(元素的 float不是 none

  • 绝对定位元素(元素的 position为absolutefixed`)

  • 行内块元素(元素的 displayinline-block

  • 表格单元格(元素的 displaytable-cell,HTML表格单元格默认为该值)

  • 表格标题(元素的 displaytable-caption,HTML表格标题默认为该值)

  • 匿名表格单元格元素(元素的 displaytable、``table-rowtable-row-group、``table-header-group、``table-footer-group(分别是HTML table、row、tbody、thead、tfoot的默认属性)或 inline-table

  • overflow值不为 visible 的块元素

  • display值为 flow-root 的元素

  • contain值为 layoutcontentstrict 的元素

  • 弹性元素(displayflexinline-flex元素的直接子元素)

  • 网格元素(displaygridinline-grid 元素的直接子元素)

  • 多列容器(元素的 column-countcolumn-width不为 auto,包括 column-count1

  • column-spanall 的元素始终会创建一个新的BFC,即使该元素没有包裹在一个多列容器中.

  • 块格式化上下文包含创建它的元素内部的所有内容.

  • 块格式化上下文对浮动定位与清除浮动都很重要。浮动定位和清除浮动时只会应用于同一个BFC内的元素。浮动不会影响其它BFC中元素的布局,而清除浮动只能清除同一BFC中在它前面的元素的浮动。外边距折叠(Margin collapsing)也只会发生在属于同一BFC的块级元素之间。

  • 设置 overflow: auto 创建一个新的BFC来包含这个浮动。我们的

    元素现在变成布局中的迷你布局。任何子元素都会被包含进去。

  • 使用 overflow 来创建一个新的BFC,是因为 overflow 属性告诉浏览器你想要怎样处理溢出的内容。当你使用这个属性只是为了创建BFC的时候,你可能会发现一些不想要的问题,比如滚动条或者一些剪切的阴影,需要注意。另外,对于后续的开发,可能不是很清楚当时为什么使用overflow。所以你最好添加一些注释来解释为什么这样做。

Ⅲ使用after伪元素清楚浮动

使用after伪元素清楚浮动,优点不用单独添加标签,符合闭合浮动思想,结构语义正确;缺点:由于IE6-7不支持:after,使用zoom:1触发hasLayout

注意:content:"." 里面尽量跟一个小点,或者其他,尽量不要为空,否则再firefox 7.0前的版本会有生成空格。

结合 :after 伪元素(注意这不是伪类,而是伪元素,代表一个元素之后最近的元素)和 IEhack ,可以完美兼容当前主流的各大浏览器,这里的 IEhack 指的是触发 hasLayout。
给浮动元素的容器添加一个clearfix的class,然后给这个class添加一个:after伪元素实现元素末尾添加一个看不见的块元素(Block element)清理浮动。

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .box1 {
            /* height: 200px; 很多情况下,我们父级盒子,不方便给高度 考虑孩子高度会变  */
            width: 600px;
            background-color: orange;
        }

        .box2 {
            width: 600px;
            height: 240px;
            background-color: purple;
        }

        .son1 {
            /*  son1 和 son2 是标准流,会撑开盒子 */
            width: 150px;
            height: 100px;
            background-color: skyblue;
            float: left;
        }

        .son2 {
            width: 300px;
            height: 100px;
            background-color: yellow;
            float: left;
        }
        
        
        .clearfix:after {
            content: ".";
            /* 内容为小点, 尽量加不要空, 否则旧版本浏览器有空隙 */
            display: block;
            /* 转换为块级元素 */
            height: 0;
            /* 高度为0 */
            visibility: hidden;
            /* 隐藏盒子 */
            clear: both;
            /* 清除浮动 */
        }

        .clearfix {
            /* ie6.7浏览器的处理方式 */
            *zoom: 1;
            /*  * 代表ie6.7能识别的特殊符号  带有这个*的属性 只有ie6.7才执行  
             zoom 就是ie6.7 清除浮动的方法 */
        }

    </style>
</head>

<body>
    <h1>浮动影响</h1>
    <div class="box1 clearfix">
        <div class="son1"></div>
        <div class="son2"></div>
    </div>
    <div class="box2"></div>

</body>

</html>

通过CSS伪元素在容器的内部元素最后添加了一个看不见的空格"020"或点".",并且赋予clear属性来清除浮动。需要注意的是为了IE6和IE7浏览器,要给clearfix这个class添加一条*zoom:1;触发haslayout。

Ⅳ使用双伪类元素清除浮动

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .box1 {
            /* height: 200px; 很多情况下,我们父级盒子,不方便给高度 考虑孩子高度会变  */
            width: 600px;
            background-color: pink;
        }

        .box2 {
            width: 600px;
            height: 240px;
            background-color: purple;
        }

        .son1 {
            /*  son1 和 son2 是标准流,会撑开盒子 */
            width: 150px;
            height: 100px;
            background-color: skyblue;
            float: left;
        }

        .son2 {
            width: 300px;
            height: 100px;
            background-color: hotpink;
            float: left;
        }

        .clearfix:before,
        .clearfix:after {
            /*下面这三个写法是双伪元素解决清除浮动的完整写法*/
            content: "";
            display: table;
            /* 触发bfc 还可以防止外边距合并 */
        }

        .clearfix:after {
            clear: both;
        }

        .clearfix {
            *zoom: 1;
        }
    </style>
</head>

<body>
    <div class="box1 clearfix">
        <div class="son1"></div>
        <div class="son2"></div>
    </div>
    <div class="box2"></div>

</body>

</html>
posted @ 2020-03-01 12:32  LXF&蒲公英  阅读(115)  评论(0编辑  收藏  举报