zoukankan      html  css  js  c++  java
  • css浮动布局注意点以及为什么需要清除浮动

    1.浮动和标准流的父盒子搭配

    先用标准流的父元素排列上下位置,之后内部子元素采取浮动排列左右位置

    2.一个元素浮动了,理论上其余的兄弟元素也要浮动

    一个盒子里面有多个子盒子,如果其中一个盒子浮动了,那么其他兄弟也应该浮动,以防止引起问题。
    浮动的盒子只会影响浮动盒子后面的标准流不会影响前面的标准流

    为什么需要清除浮动

    在前面我们都给了父元素高度,但有些场景我们不适合给元素高度,比如:

    像这种我们给高度就不合适了,理想状态下我们希望子元素自己能够撑开盒子比如下面这样:

    <!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>
            * {
                margin: 0;
                padding: 0;
            }
    
            .box {
                 500px;
                border: 1px solid pink;
            }
    
            .damao {
                 200px;
                height: 200px;
                background-color: red;
            }
    
            .ermao {
                 150px;
                height: 150px;
                background-color: purple;
            }
    
    
        </style>
    </head>
    <body>
        <div class="box">
            <div class="damao">大毛</div>
            <div class="ermao">二毛</div>
        </div>
    </body>
    </html>
    


    像这样我们往里面无论添加多少子元素都能自己撑开父元素的内容。

    现在我们有一个需求,希望能使子元素浮动起来

    <!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>
            * {
                margin: 0;
                padding: 0;
            }
    
            .box {
                 500px;
                border: 1px solid pink;
            }
    
            .damao {
                float: left;
                 200px;
                height: 200px;
                background-color: red;
            }
    
            .ermao {
                float: left;
                 150px;
                height: 150px;
                background-color: purple;
            }
    
    
        </style>
    </head>
    <body>
        <div class="box">
            <div class="damao">大毛</div>
            <div class="ermao">二毛</div>
        </div>
    </body>
    </html>
    


    现在我们子元素已经浮动了,但我们发现父元素高度变成0(因为浮动的元素是不占用位置的)

    <!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>
            * {
                margin: 0;
                padding: 0;
            }
    
            .box {
                 500px;
                border: 1px solid pink;
            }
    
            .damao {
                float: left;
                 200px;
                height: 200px;
                background-color: red;
            }
    
            .ermao {
                float: left;
                 150px;
                height: 150px;
                background-color: purple;
            }
    
            .footer {
                height: 200px;
                background: #000;
            }
    
    
        </style>
    </head>
    <body>
        <div class="box">
            <div class="damao">大毛</div>
            <div class="ermao">二毛</div>
        </div>
    
        <div class="footer"></div>
    </body>
    </html>
    

    由于父元素高度为0 所以下面的footer直接跑上面去了

    解决方案:清除浮动

    清除浮动的本质

    清除浮动的本质是清除浮动元素造成的影响
    如果父盒子本身有高度,则不需要清除浮动
    清除浮动后,父级就会根据浮动的子盒子自动监测高度,父级有了高度,就不会影响下面的标准流了

    选择器{clear:属性值:}

    属性值:
    left: 不允许左侧有浮动元素(清除左侧浮动的影响)
    right: 不允许右侧有浮动元素(清除右侧浮动的影响)
    both: 同时清除左右两侧的影响

    我们实际工作中,几乎只用clear:both;
    清除浮动的策略是,闭合浮动

    清除浮动有四种方式:

    1.额外标签法,也成为隔墙法,是w3c推荐的做法(必须给块级元素加)
    2.父级添加overflow属性
    3.父级添加after伪元素
    4.父级添加双伪元素

    隔墙法:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>清除浮动隔墙法</title>
        <style>
            * {
                margin: 0;
                padding: 0;
            }
    
            .box {
                 500px;
                border: 1px solid pink;
            }
    
            .damao {
                float: left;
                 200px;
                height: 200px;
                background-color: red;
            }
    
            .ermao {
                float: left;
                 150px;
                height: 150px;
                background-color: purple;
            }
    
            .footer {
                clear: both;
                height: 200px;
                background: #000;
            }
    
            .clear {
                clear: both;
            }
    
    
        </style>
    </head>
    <body>
        <div class="box">
            <div class="damao">大毛</div>
            <div class="ermao">二毛</div>
            <div class="clear"></div>
        </div>
    
        <div class="footer"></div>
    </body>
    </html>
    
    

    总结:
    **清除浮动的本质是什么
    清除浮动的本质是清除浮动元素脱离标准流造成的影响
    **清除浮动策略是什么
    闭合浮动,只会让浮动在父盒子内部影响,不影响父盒子外面的其他盒子。

    3.额外标签法

    隔墙法,就是在最后一个浮动的子元素后添加一个额外标签,添加清除浮动样式

    清除浮动 --- 父级添加overflow

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>清除浮动 给父节点添加overflow</title>
        <style>
            * {
                margin: 0;
                padding: 0;
            }
    
            .box {
                 500px;
                border: 1px solid pink;
                /* 清除浮动 */
                overflow: hidden;
            }
    
            .damao {
                float: left;
                 200px;
                height: 200px;
                background-color: red;
            }
    
            .ermao {
                float: left;
                 150px;
                height: 150px;
                background-color: purple;
            }
    
            .footer {
                clear: both;
                height: 200px;
                background: #000;
            }
        </style>
    </head>
    <body>
        <div class="box">
            <div class="damao">大毛</div>
            <div class="ermao">二毛</div>
        </div>
    
        <div class="footer"></div>
    </body>
    </html>
    

    可以给父级添加overflow属性,将其属性值设置为hidden,auto或scroll
    子不教父之过,注意是给父元素添加代码
    优点:代码简洁
    缺点:无法显示溢出部分

    清除浮动 -- :after 伪元素法

    :after方式是额外标签法的升级版,也是给父元素添加

    .clearfix:after {
        content: "";
        display: block;/* 默认为行内元素 所以转换成块级元素*/
        height: 0;
        clear: both;
        visibility: hidden;
    }
    
    .clearfix {
       /*IE6 7专属 */
        *zoom: 1;
    }
    

    清除浮动 -- 双伪元素清除浮动

    也是给父元素添加

    .clearfix:before, .clearfix:after {
        content: "";
        display: table;
    }
    
    .clearfix:after {
        clear: both;
    }
    
    .clearfix {
        *zoom: 1;
    }
    
    优点:代码更简洁
    缺点:照顾低版本浏览器
    代表网站:小米,腾讯等
    

    总结:
    为什么需要清除浮动:
    ①父级没有高度
    ②子盒子浮动了
    ③影响下面的布局了,我们就应该清除浮动了

    清除浮动的方式:

    1.额外标签法(隔墙法)
    优点:通俗易懂,书写方便
    添加许多无意义的标签,结构化差

    2.父级overflow:hidden
    优点:书写简答
    缺点:溢出隐藏

    3.父级after:伪元素
    优点:结构语义化正确
    缺点:IE6-7不支持after,兼容性问题

    4.父级双伪元素
    优点:语义化正确
    缺点:由于IE6-7不支持after,兼容性问题

  • 相关阅读:
    ZRender实现粒子网格动画实战
    线段树专题—ZOJ1610 Count the Colors
    LeetCode Recover Binary Search Tree
    Android跨进程訪问(AIDL服务)
    刘下记录:ImageView.scaleType 属性全解析(含视频)
    myeclipse解决JSP文件里script背景颜色的调整
    hdu 5381 The sum of gcd(线段树+gcd)
    newlisp HTTP Basic Authentication
    codeforces 132C Logo Turtle--- dp dfs
    python代码风格-PEP8
  • 原文地址:https://www.cnblogs.com/qjuly/p/13424183.html
Copyright © 2011-2022 走看看