zoukankan      html  css  js  c++  java
  • 关于BFC布局的那些事

    关于BFC的那些事

    1、什么是BFC?

    它是Block Formatting Context(块级格式化上下文)的简称。

    2、什么是Block Formatting context?

    Formatting context是指页面中的一块渲染规则,它决定了其子元素将如何定位,以及和其他元素的关系和相互作用。
    最常见的Formatting cocntext 有Block formatting context(简称BFC)和Inline formatting (简称IFC).

    3、细谈BFC

    BFC是指一个独立的块级渲染区域,只有Block-level Box参与,该区域拥有一套渲染规则来约束块级盒子的布局,且与区域外部无关。
    BFC就是一种布局方式,可以理解为一个作用范围,即在一个BFC里的布局与其之外的布局不相关或者说不相互影响。

    4、使用BFC的原因:

    使用一定的CSS声明可以生成BFC,浏览器对生成的BFC有一系列的渲染规则,利用这些渲染规则我们可以达到一定的布局效果,为了达到特定的布局效果我们让元素生成BFC。

    5、哪些元素可以生成BFC?

    当一个HTML元素满足下面条件的任何一点,都可以生成Block formatting context.

    • 根元素
    • float的值不为none
    • overflow的值不为visible(可以为hidden,scroll,auto)
    • display的值为inline-block,table-cell,table-captain,flex,inline-flex中的任何一个
    • position的值为absolute,fixed(不为static,relative中的任何一个)
    • display : table也认为可以生成BFC,其实这里主要原因在于table会默认生成一个匿名的table-cell,正是这个匿名的table-cell生成了BFC。

    6、常用的用来触发BFC的CSS样式:

    overflow : scroll(可能会显示不必要的滚动条)
    overflow : hidden(将会剪掉溢出的元素,不需要给BFC元素设置宽度)
    display : flex
    float : left(将会把元素置于它的左边,其他元素环绕着它)
    display : table-cell(必须给BFC元素设置无限大的宽度)

    7、BFC的布局规则

    • 内部的Box会在垂直方向上一个接一个的放置
    • 垂直方向上的距离由margin 决定(完整的说法是:属于同一个BFC的两个相邻的Box的margin会发生重叠,与方向是无关的)
    • 每个盒子的左外边框紧挨着包含块的左边框(从右到左的格式,则为紧挨右边框),即使浮动元素也是如此。(这说明BFC中的子元素不会超出他的包含块,也就是他的父级块状元素)
    • BFC的区域不会与float的元素区域重叠
    • 计算BFC的高度时,浮动元素也参与计算
    • BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素

    1、自适应两栏布局

    
            body{
                300px;
            }
            .aside{
                100px;
                height:150px;
                float:left;
                background:#f66;
            }
            .main{
                height:200px;
                background:#ffc;
                overflow:hidden;
            }
    
    <body>
    
        <div class="aside"></div>
        <div class="main"></div>
    
    </body>
    

    效果如下:

    在不加overflow:hidden;之前的效果:

    因为根据BFC布局规则第三条可知道:
    每个元素的margin box的左边,与包含块border box的左边相接处(对于从左到右的格式化,否则相反)。虽然存在浮动的元素aside,但main的左边依然会与包含块的左边相接处。

    在加了overflow : hidden 之后aside就形成了一个BFC,这个新的BFC不会与浮动的aside重叠,main会根据包含块的宽度,和aside的宽度,自动边窄。

    2、清除内部浮动

     .parent{
                300px;
                border:5px solid #fcc;
            }
            .child{
                100px;
                height:100px;
                border:5px solid #f66;
                float:left;
            }
    
    <div class="parent">
        <div class="child"></div>
        <div class="child"></div>
    </div>
    

    结果:

    原因是:计算BFC的高度时,浮动元素也参与计算
    改变的方法是:为达到清除内部浮动,我们可以触发parent生成BFC,那么parent在计算高度时,parent内部的浮动元素child也会参与计算。

    .parent{
                300px;
                border:5px solid #fcc;
                overflow:hidden;
            }
    

    结果是:

    3、放置垂直margin重叠

       p{
                color:#f55;
                background:#fcc;
                200px;
                line-height:100px;
                text-align:center;
                margin:100px;
            }
    
        <p>Haha</p>
        <p>HeHe</p>
    

    结果如下:

    解决办法:

    p{
                color:#f55;
                background:#fcc;
                200px;
                line-height:100px;
                text-align:center;
                margin:100px;
            }
            .ddd{
                overflow:hidden;
            }
    
        <p>Haha</p>
    
        <div class="ddd">
           <p>HeHe</p>
        </div>
    

    结果:

    原因就是:BFC布局规则的第二条;
    Box垂直方向的距离由margin决定。属于同一个BFC的两个相邻Box的margin会发生重叠。
    现象:两个p之间的距离为100px,发送了margin重叠。
    解决方案:我们可以在p外面包裹一层容器,并触发该容器生成一个BFC,那么两个p便不属于同一个BFC,就不会发生margin重叠。

    在这里总结了一下,就是,如果一旦形成BFC,那么这个BFC就是一个隔离的独立容器,容器里面的子元素不会影响到外面的元素。

  • 相关阅读:
    ArcGIS API for Python
    ArcGIS Engine二次开发:从入门到精通
    OAuth2.0是什么?
    ArcGIS如何使用ArcToolbox新建要素类
    后端如何返回json
    Flask框架和Django框架
    ArcGIS时间——ArcToolbox
    ArcGIS时区设置2-编辑器追踪属性
    使用ABAP代码生成二维码(QR Code)
    如何自行分析SAP WebClient UI开发环境里抛出的错误消息根源
  • 原文地址:https://www.cnblogs.com/hixxcom/p/7306389.html
Copyright © 2011-2022 走看看