如何理解CSS中的BFC特性

640?wx_fmt=gif

css中的 BFC 特性是在css2.1规范中引入的块渲染规则,利用这些规则可以帮助我们处理页面中的布局等问题。比如:在清除浮动方案中我们可以在父容器中加入 overflow:hidden,这就是利用了 BFC 特性。同时也是面试中一个常问的知识点,所以深入理解 BFC 很重要。

什么是BFC

BFC是 (Block Formatting context)的简称,即块格式化上下文。可以理解为它是运用一些渲染规则的块渲染区域,它是css世界中的结界。为何说是结界,因为在触发了 BFC 特性的容器下元素和容器外部元素完全隔离,子元素的布局不会影响外部元素,反之依然。


BFC 元素有如下一些特征:

  • BFC的块不会和浮动块重叠

  • 计算BFC元素的高度时,会包括浮动元素

  • 在一个BFC下的块 margin 会发生重叠,不在同一个则不会

  • BFC元素是一个独立的容器,使得里面的元素和外部元素隔离开,互补影响


触发BFC

通过以下设置可以触发一个块元素的BFC特性:

  • float 的值不为 none

  • overflow 的值为 autoscroll和 hidden

  • display 的值为 table-celltable-caption和 inline-block

  • position 设置为 absolute和 fixed

除此之外, html 元素本身默认就是一个 BFC 元素

应用场景

清除浮动
<div class="box">
    <div class="left"></div>
    <div class="right"></div>
</div>

.box {
    background: #eee;
}
.left {
    width: 200px;
    height: 200px;
    float: left;
    border: 1px solid pink;
}
.right {
    height: 100px;
    border: 1px solid greenyellow;
}

效果如下:

640?wx_fmt=other

可见,浮动元素 .left脱离了正常流,和元素 .right发生了重叠。而且父容器的高度不包含浮动元素,发生了坍塌。

利用 BFC 元素的特征2,在包含浮动元素的容器触发 BFC 特性,防止容器的高度发生坍塌。一般是设置 overflow:hidden 来触发,如下:

.box {
    background: #eee;
    
    overflow: hidden;
}
复制代码

效果如下:

640?wx_fmt=other

自适应布局

利用特征1,我们可以对 .right 触发 BFC 特性,让他不和左边的浮动元素重叠,确保子元素不受到外部影响。同时因为 .right 是一个块元素,具有流体的特性,会随着视口宽度变化发生自适应,从而实现两栏自适应,甚至多栏也是如此。

.right {
    height: 100px;
    border: 1px solid greenyellow;
    overflow: hidden;
}

效果如下:

640?wx_fmt=other

但是对于超出 .right 区域需要显示内容的场景,这种方案就不适用了。可以利用 table-cell 和 inline-block 触发 BFC 特性。

.right {
    display: table-cell;
    width: 9999px;
    height: 100px;
    border: 1px solid greenyellow;
    /* 利用 css hack 兼容IE7 的情况 */
    *display: inline-block;
    *width: auto;
}

对于单元格的盒子有一个特点,就是设置的宽度超过父容器时,实际宽度也是不会超过父容器的,这就和自适应效果一样。所以我们给宽度设置了一个超大值。但是table-cell 只使用于IE8+的浏览器,对于需要考虑IE7的情况,可以利用设置 inline-block ,它在IE7上表现的和 block 盒一样,也是会自适应的。

其他触发 BFC 特性的条件都有自己的约束,所以常用的就是上面两种方案来触发

防止margin合并

我们知道两个相邻的块盒会发生 margin 合并,以最大的为准。所以利用 BFC 特性3,让其中一个块盒包含在一个新的BFC容器下,让他们相互隔离,不会影响。

参考文章

CSS深入理解流体特性和BFC特性下多栏自适应布局

学习 BFC (Block Formatting Context)

史上最全面、最透彻的BFC原理剖析

原文链接:https://juejin.im/post/5c7a84b1518825629f3877a0

作者:inoob

来源:掘金

 热 文 推 荐 

☞ 用Node+wechaty写一个爬虫脚本每天定时给女朋友发微信暖心话

☞ 中高级前端大厂面试秘籍,寒冬中为您保驾护航,直通大厂(上)

☞ 我是如何在阿里巴巴面试中壮烈牺牲的?(内含面试题)

☞ vue-cli3 项目从搭建优化到docker部署

☞ 前端开发免费资源大汇总

640?wx_fmt=png

640?wx_fmt=png

喜欢就点击“好看”吧!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言是一种广泛使用的编程语言,它具有高效、灵活、可移植性强等特点,被广泛应用于操作系统、嵌入式系统、数据库、编译器等领域的开发。C语言的基本语法包括变量、数据类型、运算符、控制结构(如if语句、循环语句等)、函数、指针等。在编写C程序时,需要注意变量的声明和定义、指针的使用、内存的分配与释放等问题。C语言常用的数据结构包括: 1. 数组:一种存储同类型数据的结构,可以进行索引访问和修改。 2. 链表:一种存储不同类型数据的结构,每个节点包含数据和指向下一个节点的指针。 3. 栈:一种后进先出(LIFO)的数据结构,可以通过压入(push)和弹出(pop)操作进行数据的存储和取出。 4. 队列:一种先进先出(FIFO)的数据结构,可以通过入队(enqueue)和出队(dequeue)操作进行数据的存储和取出。 5. 树:一种存储具有父子关系的数据结构,可以通过序遍历、前序遍历和后序遍历等方式进行数据的访问和修改。 6. 图:一种存储具有节点和边关系的数据结构,可以通过广度优先搜索、深度优先搜索等方式进行数据的访问和修改。 这些数据结构在C语言都有相应的实现方式,可以应用于各种不同的场景。C语言的各种数据结构都有其优缺点,下面列举一些常见的数据结构的优缺点: 数组: 优点:访问和修改元素的速度非常快,适用于需要频繁读取和修改数据的场合。 缺点:数组的长度是固定的,不适合存储大小不固定的动态数据,另外数组在内存是连续分配的,当数组较大时可能会导致内存碎片化。 链表: 优点:可以方便地插入和删除元素,适用于需要频繁插入和删除数据的场合。 缺点:访问和修改元素的速度相对较慢,因为需要遍历链表找到指定的节点。 栈: 优点:后进先出(LIFO)的特性使得栈在处理递归和括号匹配等问题时非常方便。 缺点:栈的空间有限,当数据量较大时可能会导致栈溢出。 队列: 优点:先进先出(FIFO)的特性使得
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值