BFC和IFC

160 阅读1分钟

BFC

BFC特点
1. 内部的盒子会在垂直方向,一个个地放置;
2. 盒子垂直方向的距离由margin决定,属于同一个BFC的两个相邻Box的上下margin会发生重叠;
3. 每个元素的左边,与包含的盒子的左边相接触,即使存在浮动也是如此;
4. BFC的区域不会与float重叠;
5. BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素,反之也如此;
6. 计算BFC的高度时,浮动元素也参与计算。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <style>
    .main {
        background-color: pink;
        /* float: left; */
        /* float: left; */
        /* overflow: hidden; */
        /* position: absolute; */
        display: inline-block;
    }
    .box1 {
        width: 200px;
        height: 200px;
        background-color: green;
        /* margin-bottom: 100px; */
        /* float: left; */
    }
    .box2 {
        width: 100px;
        height: 100px;
        background-color: purple;
        /* margin-top: 50px; */
        float: left;
    }
    .box3 {
        width: 300px;
        height: 100px;
        background-color: orange;
        float: left
    }
    </style>
    <!-- 
        BFC特点
            内部的盒子会在垂直方向,一个个地放置;
            盒子垂直方向的距离由margin决定,属于同一个BFC的两个相邻Box的上下margin会发生重叠;
            每个元素的左边,与包含的盒子的左边相接触,即使存在浮动也是如此;
            BFC的区域不会与float重叠;
            BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素,反之也如此;
            计算BFC的高度时,浮动元素也参与计算。
     -->
    <div class="main">
        <div class="box1"></div>
        <div class="box2"></div>
    </div>
    <div class="box3"></div>
    <hr>
    <style>
    .list {
        background-color: pink;
        /* float: left; */
        /* position: absolute; */
        /* display: inline-block; */
        overflow: hidden;
    }
    .item {
        width: 100px;
        height: 100px;
        margin-right: 50px;
        background-color: green;
        float: left;
    }
    .outer {
        width: 400px;
        height: 100px;
        background-color: orange;
    }
    </style>
    <div class="list">
        <div class="item"></div>
        <div class="item"></div>
        <div class="item"></div>
        <div class="item"></div>
    </div>
    <div class="outer"></div>
</body>
</html>

IFC

IFC特点
1.IFC的line box(线框)高度由其包含行内元素中最高的实际高度计算而来(不受到竖直方向的padding/margin影响)
2.IFC中的line box一般左右都贴紧整个IFC,但是会因为float元素而扰乱。当float元素会位于IFC与line box之间的时候,会使得line box宽度缩短。
3. 同一个IFC下的多个line box高度会不同。
4.IFC中是不可能有块级元素的,当插入块级元素时(如p中插入div)会产生两个匿名块与div分隔开,即产生两个IFC,每个IFC对外表现为块级元素,与div垂直排列。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <!-- 
        IFC特点
            IFC的line box(线框)高度由其包含行内元素中最高的实际高度计算而来(不受到竖直方向的padding/margin影响)
            IFC中的line box一般左右都贴紧整个IFC,但是会因为float元素而扰乱。当float元素会位于IFC与与line box之间的时候,会使得line box宽度缩短。 
            同一个IFC下的多个line box高度会不同。
            IFC中是不可能有块级元素的,当插入块级元素时(如p中插入div)会产生两个匿名块与div分隔开,即产生两个IFC,每个IFC对外表现为块级元素,与div垂直排列。
     -->
    <style>
    .box {
        background-color: pink;
        display: inline-block;
    }
    .box span {
        background-color: green;
        margin: 0 10px;
        vertical-align: middle;
    }
    .item1 {
        font-size: 20px;
    }
    .item2 {
        font-size: 50px;
        /* float: left; */
    }
    .item3 {
        font-size: 40px;
    }
    .item4 {
        font-size: 30px;
        /* display: block; */
    }
    .item5 {
        font-size: 20px;
    }
    </style>
    <div class="box">
        <span class="item1">span1</span>
        <span class="item2">span2</span>
        <span class="item3">span3</span>
        <span class="item4">span4</span>
        <span class="item5">span5</span>
    </div>
    <hr>
    <style>
    .demo {
        width: 1000px;
        height: 400px;
        margin: 0 auto;
        background-color: pink;
        /* vertical-align: middle; */
        text-align: center;
    }
    .demo span {
        vertical-align: middle;
    }
    .test1 {
        background-color: green;
        font-size: 50px;
    }
    .test2 {
        display: inline-block;
        width: 100px;
        height: 100px;
        background-color: purple;
    }
    .test3 {
        display: inline-block;
        background-color: brown;
    }
    .demo::before {
        content: "";
        display: inline-block;
        height: 100%;
        vertical-align: middle;
        width: 20px;
        background-color: orange;
    }
    </style>
    <!-- 利用IFC居中 -->
    <div class="demo">
        <span class="test1">test1</span>
        <span class="test2">test2</span>
        <span class="test3">test3</span>
    </div>
</body>
</html>