• 关于css清除元素浮动的方法总结(overflow clear floatfix)


    在前两天的一个面试中考官问我web中清除浮动的一些css常用方法,我很轻松的答出了:

    1.overflow:hidden

    2.clear:both

    3.floatfix类

    然后问题就来了,考官接着问'为什么overflow:hidden'可以清除浮动?这下就把我问住了。写了这么多年css只是单纯的解决问题,但是从来没想过为什么。

    看来是需要反省和认真总结一下以前的这些细节问题了,只要不明白的就要加一个'为什么?'

    clear:both

    这三种方法里最好理解的就是clear:both 

        <style>
            #con{border: 2px dashed #ccc;padding:5px;}
            div.c{width: 100px;height: 100px;background-color: green;margin-right:5px; _display: inline; float: left;color: #fff;}
        </style>
        <div id="con">
            <div class="c">内容一</div>
            <div class="c">内容二</div>
            <div class="c">内容三</div>
            <div style="clear:both"></div>
        </div>    

    原理就是在父元素最后面添加一个非浮动的空div由于有clear:both属性用来清除浮动,父元素会把它包围起来,顺带手把float:left的div也一起包裹起来,高度不再塌陷。

    这种方法不再流行的主要原因就是改变了结构添加了无用的内容。

    overflow:hidden

    写这篇文章的起因就是它overflow:hidden,到底为什么加入这个属性就可以清除浮动呢?我上网查了一下,文章还是挺多的'block format content'下面简称BFC,相关文章可以自己搜一下挺多的。

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8" />
        <title></title>
            <style>
            #con{border: 2px dashed #ccc;padding:5px;overflow: hidden;}
            #con div.c{width: 100px;height: 100px;background-color: green;margin-right:5px; _display: inline; float: left;color: #fff;}
        </style>
    </head>
    <body>
    
        <div id="con">
            <div class="c">内容一</div>
            <div class="c">内容二</div>
            <div class="c">内容三</div>
        </div>    
    </body>
    </html>

    添加这个属性就使父级容器形成了BFC,它有三个特性:

    1.BFC会阻止垂直外边距(margin-top、margin-bottom)折叠

    2.BFC不会重叠浮动元素

    3.BFC可以包含浮动

    父级形成了BFC之后说'清除浮动'有点不太恰当,应该改为'包含浮动'。形成BFC的一些方法:

    • float为 left|right
    • overflow为 hidden|auto|scroll
    • display为 table-cell|table-caption|inline-block
    • position为 absolute|fixed

    当然父级BFC也不是一个很好的解决方法,比如:

    1.父级设置float:left会改变宽度,父级也会悬浮

    2.父级设置overflow:hidden会影响绝对定位的定位的子元素显示问题

    3.ie6兼容性

    .floatfix

    最后说现在大家都在用的floatfix类

    .floatfix{*zoom:1;}
    .floatfix:after{content:"";display:table;clear:both;}

    .floatfix:after挺好理解的,就是在元素后面添加一个清除浮动的元素等同于<div style="clear:both"></div>,只不过这是用css来添加的。

    但是IE6、7不支持a以外的伪类,所以我们再用*zoom:1用来兼容IE6、7。

    在IE6、7内有个hasLayout的概念,很多bug都是由hasLayout导致的,当元素的hasLayout属性值为false的时候,元素的尺寸和位置由最近拥有布局的祖先元素控制。当元素的hasLayout属性值为true的时候会达到和BFC类似的效果,元素负责本身及其子元素的尺寸设置和定位。我们可以利用这点儿在IE6、7下完成清浮动,先看看怎么使元素hasLayout为true

    • position: absolute 
    • float: left|right
    • display: inline-block
    • width: 除 “auto” 外的任意值
    • height: 除 “auto” 外的任意值
    • zoom: 除 “normal” 外的任意值
    • writing-mode: tb-rl

    在IE7中使用overflow: hidden|scroll|auto 也可以使hasLayout为true

    最后总结

    现在我们已经知道父级div什么情况可以形成BFC,ie6、7的hasLayout属性值什么时候可以形成true,那么在项目的不同应用中就可以使用不同的方法来清除浮动了。

  • 相关阅读:
    Cocoa中对日期和时间的处理 NSCalendar (一)
    iOS优秀博客收录
    八大排序(内容是转载链接)
    IOS8定位无效问题
    ios 里如何判断当前应用的定位服务是否可用
    MKMapView和MKMapViewDelegate
    根据经纬度翻译成详细位置的各种方法
    iOS 根据经纬度反查 地名
    MapKit学习笔记
    解决Collection <__NSArrayM: 0xb550c30> was mutated while being enumerated
  • 原文地址:https://www.cnblogs.com/dtdxrk/p/3555438.html
Copyright © 2020-2023  润新知