我爱编程Web前端之路让前端飞

BFC理解

2018-06-06  本文已影响17人  青衣诶_

Block formatting context (块级格式化上下文)

页面文档由块block构成 每个block在页面上占据自己的位置
使用新的元素构建BFC overflow:hidden | auto | scroll; 只要不为visible新的空间
告诉浏览器,外面的环境影响不到我了 我重新来进行Block formatting 布局和定位

核心:
新的BFC,给出了新的不受外界影响的块级格式化环境
block 块级-> 页面的基础
formatting context 格式化-> 渲染

浏览器构建文档树的时候 布局和定位元素

网页的定位(大) 文档流正常,浮动,定位,flex,table
广义的定位 块级元素的定位 垂直的定位;行内元素 左右定位 通过内容来确定
狭义的定位:
float 浮动元素,在一行的开始或者结束
flex 弹性布局
position

BFC 在正常的文档流里面重建一个新的上下文环境

BFC的约束规则

    <style>
        *{padding: 0;margin: 0;}
        .par{
            border: 5px solid #fcc;
            width: 300px;
            /*这里的overflow并不是为了超出则隐藏,而是为了创建一个BFC*/
            /* overflow: hidden; */
            display: inline-block;
        }
        .child{
            border: 5px solid #f66;  
            width: 100px;
            height: 100px;
            float: left;
            /* clear: both; */
        }
    </style>
</head>
<body>
    <!-- 网页的定位(大) 文档流正常,浮动,定位,flex,table -->
    <div class="par">
        <div class="child"></div>
        <div class="child"></div>
    </div>
</body>
    <style>
        *{padding: 0;margin: 0;}
        .aside{
            float: left;
            width: 100px;
            height: 150px;
            background-color: #ff6666;
        }
        .main{
            height: 200px;
            background: #ffcccc;
            /* clear: left; */
            overflow: hidden;
        }
    </style>
</head>
<body>
    <!-- 自适应两栏式布局 类似于flex:1;
    aside 和 main 处于同一BFC(body)下 
    BFC布局规则3 规则4 -->
    <div class="aside"></div>
    <div class="main"></div>
</body>
/*BFC在三栏式布局中的应用*/
    <style>
        *{padding: 0;margin: 0;}
        .container{
            height: 200px;
        }
        .left,.right,.center{
            height: 200px;
        }
        .left{
            background: pink;
            float: left;
            width: 180px;
        }
        .right{
            background: lightblue;
            width: 180px;
            float: right;
        }
        .center{
            background: yellow;
            overflow: hidden;
        }
    </style>
</head>
<body>
    <!-- 三栏式布局 -->
    <div class="container">
        <!-- 页面的结构与呈现效果不一致?想一下 -->
        <div class="left">Left</div>
        <div class="right">Right</div>
        <div class="center">Center</div>
    </div>
</body>

注意:

通过 overflow:hidden将元素转换为BFC,固然可以解决高度塌陷的问题,但是大范围的应用在布局上是肯定是行不通的,毕竟overflow会造成溢出隐藏的问题,特别是与JS交互的效果时。

那有没有一个更好的高度检测方法呢?
答案是有的,就是我们经常用到的clearfix。

.clearfix:after{
    content:'';
    display:table;
    clear:both
}
.clearfix{
    *zoom:1;/* IE6,7不支持BFC,所以需要通过专有的CSS属性,触发hasLayout。*/
}

关于zoom:1

上一篇 下一篇

猜你喜欢

热点阅读