BFC相关知识点

  • 在什么场景下会出现外边距合并?如何合并?如何不让相邻元素外边距合并?给个父子外边距合并的范例
    块元素直接接触的垂直外边距(top、bottom)会合并成成单个外边距(取当中较大的值)
    • 外边距合并的情况
      • 毗邻的兄弟元素的垂直外边距
        备注:橙色的是外边距
.child {
    width: 200px;
    height: 100px;
    background-color: red;
    margin: 20px;
}

上面一个div的margin-bottom+下面一个div的margin-top是40px,但是他们合并了,合并后取两个值中较大的一个


毗邻元素的垂直外边距合并

- 父元素与第一个/最后一个子元素的垂直外边距合并

.parent {
    margin-bottom: 10px;
}

通过设置父元素的margin-bottom为10px,加上最后一个子元素的margin-bottom为20px,应该是30px,但是因为外边距合并,取他们当中较大的一个就是20px


父元素与最后一个子元素外边距合并

父元素与最后一个子元素外边距合并

- 空块级元素的垂直外边距

.box4 {
    margin: 20px:
}

一个空的div,设置了marin为20px,意味着有20px的上外边距和20px的下外边距,垂直方向上应该有40px,但是上外边距和下外边距却合并了,最后只有20px


空元素外边距合并

空元素外边距合并

- 阻止外边距合并
- 阻止相邻元素的合并
1. float、绝对定位来脱离文档流position


默认

浮动和绝对定位 脱离文档流

2. display: inline-block;的元素与其兄弟元素、子元素和父元素的外边距都不会合并
inline-block脱离文档流

因为inline-block不符合外c规范所说的必须是块级盒子的条件,因为规范中说明,块级盒子的display属性必须是以下三种之一:"block"、"list-item"、"table"
- 阻止父元素与子元素的合并
1. 设置padding和border,阻止子元素和父元素的外边距直接接触


设置padding

通过设置padding来阻止合并
设置border

通过设置border来阻止合并
2. 设置overflow形成BFC来阻止合并
overflow: hidden;

3. 设置display: inline-block:
- 父元素设置display: inline-block;
父元素设置display: inline-block;

首先对毗邻的兄弟元素外边距不合并,然后对子元素的外边距也不合并
- 子元素设置display: inline-block;
子元素设置display: inline-block;

与父元素的外边距不合并,与毗邻的兄弟元素也不合并

参考:深入理解BFC和Margin Collapse

  • 在什么场景下会出现外边距合并?如何合并?如何不让相邻元素外边距合并?给个父子外边距合并的范例
    块元素的垂直外边距(top、bottom)直接接触会合并成成单个外边距(数字大的那个)
    • 外边距合并的情况
      • 毗邻的兄弟元素的垂直外边距
      • 父元素与第一个/最后一个子元素的垂直外边距合并
      • 空块级元素的垂直外边距
  • 去除inline-block内缝隙有哪几种常见方法?
    本质是因为HTML会把多个空格当成一个
    • 去除HTML标签的空隙
    <div class="wrapper">
        <span>哈哈</span>
        <span>哈哈</span>
        <span>哈哈</span>
        <span>哈哈</span>
    </div>
    
    改成
    <div class="wrapper">
        <span>哈哈</span><span>哈哈</span><span>哈哈</span><span>哈哈</span>
    </div>
    
    或者
    <div class="wrapper">
        <span>哈哈</span
        ><span>哈哈</span
        ><span>哈哈</span
        ><span>哈哈</span>
    </div>
    
    • 利用浮动
    span {
        float: left;
    }
    
    • 利用负margin
    span {
        margin-left: -5px;
    }
    
    • 父元素设置font-size: 0;子元素再设置回来
    .wrapper {
        font-size: 0;
    }
    span {
        font-size: 16px;
    }
    
    • 父元素设置word-spacing
    .wrapper {
        word-spacing: -5px;
    }
    

    注意:
    word-spacing:
    <blockquote>The word-spacing CSS property specifies the spacing behavior between tags and words.</blockquote>
    设置的是单词和标签间的空隙


    word-spacing

    letter-space:
    <blockquote>The letter-spacing CSS property specifies spacing behavior between text characters.</blockquote>
    而letter-space设置的是字母间的空隙,所以不能用来消除行内元素的空隙,因为字与字之间的空隙也会变小


    letter-space

    所以就会出现这种情况:
    不能用letter-space消除标签间的空隙
  • 父容器使用overflow: auto| hidden撑开高度的原理是什么?
    当overflow属性的值不为visible时,会触发BFC,就是块级格式上下文,BFC可以消除浮动带来的父元素高度坍塌的影响
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        .box1,.box2,.box3 {
            width: 200px;
            height: 100px;
            background-color: orange;
            float: left;
            margin: 5px;
        }

        .wrapper {
            overflow: hidden;
        }
    </style>
</head>
<body>
    <div class="wrapper">
        <div class="box1"></div>
        <div class="box2"></div>
        <div class="box3"></div>
    </div>
</body>
</html>
overflow: hidden;
  • BFC是什么?如何形成BFC,有什么作用?
    <blockquote>Boxes in the normal flow belong to a formatting context, which may be block or inline, but not both simultaneously. Block-level boxes participate in a block formatting context. Inline-level boxes participate in an inline formatting context.</blockquote>
    在w3c规范中这样说道,每个文档流中的盒子必定属于一个格式化环境,要么块级格式化环境,要么行内格式化环境,其中,块级元素在块级格式化环境中,行内元素在行内格式化环境中
    其实HTML根元素html就是一个默认的块级格式化上下文,因为当页面的内容在视窗显示不下的时候,会出现滚动条,意味着html根元素的overflow属性的值为auto
    那么块级格式化上下文是什么呢,通俗来说,就是一个独立的布局环境,外面的元素不能影响里面的元素,里面的元素也不能影响外面的元素,那么BFC的布局规则是怎样的呢
    • BFC布局规则
      1. 内部的BOX会在垂直方向,一个接一个地放置
      2. BOX垂直方向的距离由margin决定。属于同一个BFC的两个相邻的BOX的margin会发生重叠
      3. 每个元素的margin-box的左边与包含块的border-box的左边相接触(对于从左往右的格式,反之相反)。及时存在浮动也是如此
      4. BFC的区域不会与float box重叠
      5. BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素。反之也如此
      6. 计算BFC高度时,浮动元素也参与计算
    • 如何触发BFC
      <blockquote>Floats, absolutely positioned elements, block containers (such as inline-blocks, table-cells, and table-captions) that are not block boxes, and block boxes with 'overflow' other than 'visible' (except when that value has been propagated to the viewport) establish new block formatting contexts for their contents.</blockquote>
      浮动元素,绝对定位元素,块级容器但是不是块级盒子(例如:display的值为inline-block、table-cell、table-caption),块级元素的overflow属性的值不为visible
    • BFC的作用
      1. 清除内部浮动
      .wrapper {
          overflow: hidden;
      }
      

清除浮动

2. 自适应两栏布局
.main { overflow: hidden; }
自适应两栏布局

3. 阻止垂直外边距合并

    <!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        .box1 {
            width: 200px;
            height: 100px;
            background-color: red;
            margin-bottom: 20px;
        }

        .wrapper {
            background-color: #eee;
            overflow: hidden;
        }

        .box2 {
            width: 200px;
            height: 100px;
            background-color: #ccc;
            margin-top: 20px;
        }
    </style>
</head>
<body>
    <div class="box1"></div>
    <div class="wrapper">
        <div class="box2"></div>
    </div>
</html>
阻止外边距合并
BFC的用法都体现了规则的第5条:

<blockquote>BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素。反之也如此</blockquote>
因为BFC内部和外部互不影响,所以当外部元素浮动时,BFC通过自身变窄不与浮动元素重叠来消除的影响,而当内部元素浮动时,为了不影响外部元素,所以把浮动元素的高度计算在内,阻止margin合并也是为了内部元素不与外部元素互相影响

  • 浮动导致的父容器高度塌陷指什么?为什么会产生?有几种解决方法
    指的是当父容器下的子元素都浮动了之后,子元素脱离了当前的文档流,所以父元素的高度为0


    父元素高度坍塌
    • 利用clearfix
    .clearfix:after {
        content: 0;
        display: block;
        clear: both;
    }
    
    • 触发BFC
    .wrapper {
        overflow: hidden;
    }
    
  • 以下代码每一行的作用是什么? 为什么会产生作用? 和BFC撑开空间有什么区别?

        /*在clearfix类的最后加上内容*/
        .clearfix:after{
        /*所要加上的内容是空的*/
            content: '';
        /*显示为块级元素*/
            display: block;
        /*清除两边的浮动,clear属性是作用在浮动元素的后续元素和块级元素上*/
            clear: both;
        }
        .clearfix{
        /* *是property hack,表示只有IE7及以下的版本可以识别,zoom相当于触发IE的BFC*/
            *zoom: 1;
        }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,725评论 1 92
  • 一、在什么场景下会出现外边距合并?如何合并?如何不让相邻元素外边距合并?给个父子外边距合并的范例 在CSS当中,相...
    dengpan阅读 560评论 0 0
  • 1.在什么场景下会出现外边距合并?如何合并?如何不让相邻元素外边距合并?给个父子外边距合并的范例 概念:在CSS当...
    饥人谷_任磊阅读 640评论 0 3
  • relative:生成相对定位的元素,通过top,bottom,left,right的位置相对于其正常位置进行定位...
    zx9426阅读 928评论 0 2
  • 一,浮动元素有什么特征?对父容器、其他浮动元素、普通元素、文字分别有什么影响? 浮动模型是一种可视化格式模型,浮动...
    DeeJay_Y阅读 855评论 0 4