• css清除浮动


    清除浮动的方法:

     Block formatting contexts(BFC),块级格式化上下文是在CSS2.1中提出的一个概念,在布局中,BFC自成体系,对自己内部的元素负责,不会与浮动元素重叠,相邻BFC上下margin也不会重叠。所以我们会通过构造一个BFC来防止margin重叠,清除浮动或者实现一个双栏布局。

    1 正常情况下,浮动元素的子元素不能自动撑开父元素的高度,可以给浮动元素的父元素设置固定高度,只适合浮动元素的子元素是固定高度的布局,如果给出的高度和父级div不一样时,也会产生问题。

    <style type="text/css"> 
        .div1{background:#000080;border:1px solid red;/*解决代码*/height:200px;} 
        .div2{background:#800080;border:1px solid red;height:100px;margin-top:10px} 
        .left{float:left;width:20%;height:200px;background:#DDD} 
        .right{float:right;width:30%;height:80px;background:#DDD} 
    </style> 
    <div class="div1"> 
        <div class="left">Left</div> 
        <div class="right">Right</div> 
    </div> 
    <div class="div2"> 
        div2 
    </div> 

    2 在浮动元素后加一个空div,给div设置css属性:clear: both; 让父级div能自动获取到高度,浏览器支持好,如果页面浮动布局多,就要增加很多空div,让人感觉很不好。

    <html>,
        <head>
            <script type="text/javascript" src="jquery.js"></script>
            <style type="text/css">
                .div1{
                    background:#000080;
                    border:1px solid red;
                } 
                .div2{
                    background:#800080;
                    border:1px solid red;
                    height:100px;
                    margin-top:10px
                } 
                .left{
                    float:left;
                    width:20%;
                    height:200px;
                    background:#DDD
                } 
                .right{
                    float:right;
                    width:30%;
                    height:80px;
                    background:#DDD
                } 
                 /*解决代码*/
                .clearfloat{clear:both} 
            </style>
        </head>
    
        <body>
            <div class="div1"> 
                <div class="left">Left</div> 
                <div class="right">Right</div> 
                 <!-- 解决代码 -->
                <div class="clearfloat"></div>
            </div> 
            <div class="div2"> 
                div2 
            </div> 
        </body>
    </html>

    clear属性的取值说明:
    none :    允许两边都可以有浮动对象
    both :  默认值,不允许有浮动对象
    left :    在左侧不允许有浮动元素
    right :  在右侧不允许有浮动元素

    inherit:规定应该从父元素继承 clear 属性的值。

    定义比较容易理解,但是实际使用时可能会发现不是这么回事。定义没有错,只不过它描述的太模糊,让我们不知所措。根据上边的基础,假如页面中只有两个元素div1、div2,它们都是左浮动,场景如下:

     此时div1、div2都浮动,根据规则,div2会跟随在div1后边,但我们仍然希望div2能排列在div1下边,就像div1没有浮动,div2左浮动那样。

    这时候就要用到清除浮动(clear),如果单纯根据官方定义,读者可能会尝试这样写:在div1的CSS样式中添加clear:right;,理解为不允许div1的右边有浮动元素,由于div2是浮动元素,因此会自动下移一行来满足规则。

    其实这种理解是不正确的,这样做没有任何效果。看小菜定论:

    对于CSS的清除浮动(clear),一定要牢记:这个规则只能影响使用清除的元素本身,不能影响其他元素。

    怎么理解呢?就拿上边的例子来说,我们是想让div2移动,但我们却是在div1元素的CSS样式中使用了清除浮动,试图通过清除div1右边的浮动元素(clear:right;)来强迫div2下移,这是不可行的,因为这个清除浮动是在div1中调用的,它只能影响div1,不能影响div2。

    根据小菜定论,要想让div2下移,就必须在div2的CSS样式中使用浮动。本例中div2的左边有浮动元素div1,因此只要在div2的CSS样式中使用clear:left;来指定div2元素左边不允许出现浮动元素,这样div2就被迫下移一行。

    那么假如页面中只有两个元素div1、div2,它们都是右浮动呢?读者此时应该已经能自己推测场景,如下:

    此时如果要让div2下移到div1下边,要如何做呢?

    同样根据小菜定论,我们希望移动的是div2,就必须在div2的CSS样式中调用浮动,因为浮动只能影响调用它的元素。

    可以看出div2的右边有一个浮动元素div1,那么我们可以在div2的CSS样式中使用clear:right;来指定div2的右边不允许出现浮动元素,这样div2就被迫下移一行,排到div1下边。

    3 给父元素加伪元素:after( IE8以上和非IE浏览器)并给他设置clear:both,给父元素加zoom属性(IE专有属性)可解决ie6,ie7浮动问题

    <html>
        <head>
            <script type="text/javascript" src="jquery.js"></script>
            <style type="text/css">
                .div1{
                    background:#000080;
                    border:1px solid red;
                } 
                .div2{
                    background:#800080;
                    border:1px solid red;
                    height:100px;
                    margin-top:10px
                } 
                .left{
                    float:left;
                    width:20%;
                    height:200px;
                    background:#DDD
                } 
                .right{
                    float:right;
                    width:30%;
                    height:80px;
                    background:#DDD
                } 
                /*清除浮动代码*/ 
                .clearfloat:after{
                    display:block;
                    clear:both;
                    content:"";
                    visibility:hidden;
                    height:0
                } 
                .clearfloat{
                    zoom:1
                } 
            </style>
        </head>
    
        <body>
            <div class="div1 clearfloat"> 
                <div class="left">Left</div> 
                <div class="right">Right</div> 
            </div> 
            <div class="div2"> 
                div2 
            </div> 
        </body>
    </html>

    给父元素加:after相当于在子元素最后加了一个伪类:

     Zoom属性是IE浏览器的专有属性, 它可以设置或检索对象的缩放比例。

    当设置了zoom的值之后,所设置的元素就会就会扩大或者缩小,高度宽度就会重新计算了,这里一旦改变zoom值时其实也会发生重新渲染,运用这个原理,也就解决了ie下子元素浮动时候父元素不随着自动扩大的问题。

    然而,zoom现在已经被逐步标准化,出现在 CSS 3.0 规范草案中,也就是CSS3中的transform: scale这个属性来实现

    4 给父元素添加overflow:hidden

    <html>
        <head>
            <script type="text/javascript" src="jquery.js"></script>
            <style type="text/css">
                .div1{
                    background:#000080;
                    border:1px solid red;
                    /*解决代码*/
                    overflow: hidden;
                } 
                .div2{
                    background:#800080;
                    border:1px solid red;
                    height:100px;
                    margin-top:10px
                } 
                .left{
                    float:left;
                    width:20%;
                    height:200px;
                    background:#DDD
                } 
                .right{
                    float:right;
                    width:30%;
                    height:80px;
                    background:#DDD
                } 
            </style>
        </head>
    
        <body>
            <div class="div1"> 
                <div class="left">Left</div> 
                <div class="right">Right</div> 
            </div> 
            <div class="div2"> 
                div2 
            </div> 
        </body>
    </html>

     部分转载:https://blog.csdn.net/zhll3377/article/details/23654169

    https://www.cnblogs.com/dongtianee/p/4563084.html

  • 相关阅读:
    面试题:找出数组中只出现一次的2个数(异或的巧妙应用)(出现3次)
    线段树 | 第1讲 (给定区间求和)(转)
    C++中的静态多态和动态多态(转)
    ARP与RARP详细解析(转)
    排序算法之归并排序
    byte数组使用Arrays.asList转换List出错
    排序算法之希尔排序
    排序算法之冒泡排序、选择排序、插入排序
    Tomcat配置优化
    内连接、左外连接、右外连接、全外连接、交叉连接
  • 原文地址:https://www.cnblogs.com/xjy20170907/p/8492155.html
Copyright © 2020-2023  润新知