理解 CSS 布局和块级格式上下文
本文的目的是介绍一些概念来帮你增强 CSS 码力。如标题所示这篇文章主要是讲块级格式上下文BFCBlock Formatting Context。你可能没听过这个术语但只要你曾经使用 过CSS 布局你就能明白它。理解 BFC 是什么、它如何工作、如何创建一个 BFC 是非常有用的这些能帮你更好的理解 CSS 布局。
这篇文章里我会通过几个你会很熟悉的的示例解释 BFC。我还会告诉你一个新的 display 值当你理解了 BFC 后可能会很需要这个值。
目录
- 前言
- 目录
- 什么是 BFC
- BFC 是布局中的迷你布局
- 创建一个 BFC 的常用方式
- 创建 BFC 的新方式
什么是 BFC
一个简单的浮动的示例就能明白 BFC 的行为在下面的示例中我们创建一个 box 元素该元素包裹一段文字和一个浮动的图片。 如果文字内容多的话文字将环绕着整个浮动图片box 的边框会把他们整个包裹起来。
1 2 3 4 5 6 | <div class="outer"> <div class="float">I am a floated element.</div> I am text inside the outer box. </div> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | .outer { border: 5px dotted rgb(214,129,137); border-radius: 5px; width: 450px; padding: 10px; margin-bottom: 40px; } .float { padding: 10px; border: 5px solid rgba(214,129,137,.4); border-radius: 5px; background-color: rgba(233,78,119,.4); color: #fff; float: left; width: 200px; margin: 0 20px 0 0; } |
文字环绕着浮动元素
但如果把一些文字删除就没有足够的文字去环绕图片浮动元素了同时由于浮动元素脱离文档流box 元素的边框高度就会随文字的减少而降低。
没有足够的文字box 元素边框的高度就会低于浮动元素的高度
之所以会发生这种情况是由于当我们浮动一个元素后box 元素仍然保持原来的宽度是文字所占的空间缩短了以给浮动元素腾出位置这就是为什么背景和边框能够看起来包裹住了浮动元素。
我们通常会使用两种不同的方式来解决这个问题一种是使用 clear hack就是在 文字和图片的下方插入一个 div 并将它的 CSS clear
属性设值为 both
。另外一种方法是使用 overflow
属性 把它设值成非默认值 visible
的值。
1 2 3 4 5 | .outer { overflow: auto; } |
使用 overflow: auto
后 box 就能包裹浮动元素了
overflow 之所以能够有效是因为当它的是是非 visible
时会创建一个 BFC而 BFC 的功能之一就是包裹浮动元素。
BFC 是布局中的迷你布局
你可以把 BFC 当做你页面中的一块小布局当一个元素被创建成 BFC 后它其中的所有元素都会被它包裹。正如我们所见当 box 元素变成 BFC 后它其中的浮动元素就再也没能突破它的底部。除此之外BFC 还有一些有用的功能。
BFC 可以阻挡外边距叠加margins collapsing
理解外边距叠加是另外一个被低估的 CSS 技巧。在接下来的示例里我创建了一个背景灰色的 div这个 div 含有两个段落div 元素的 margin-bottom 为 40px同时每个段落都有 20px 的 margin-top 与 margin-bottom。
1 2 3 4 5 6 7 8 9 10 11 12 13 | .outer { background-color: #ccc; margin: 0 0 40px 0; } p { padding: 0; margin: 20px 0 20px 0; background-color: rgb(233,78,119); color: #fff; } |
由于 p 元素的边缘与 outer 元素的边缘之间没有任何东西所以 outer 与 p 的 margin 会叠加p 会与 outer 的顶部与底部齐平p 对外的 margin 似乎与 outer 的 margin 合并了使我们无法在段落的上下看到 outer 的灰色背景。
由于 margin collapse外边距叠加我们看到 outer 内部上下没有灰色背景
如果我们把 outer 元素变成 BFC它就可以包裹住 p 以及 p 的 margin外边距不会发生叠加outer 元素内部就会出现由 p 元素的 margin 顶出来的上下灰色背景。
1 2 3 4 5 6 7 | .outer { background-color: #ccc; margin: 0 0 40px 0; overflow: auto; } |
建立 BFC 后外边距不再叠加
一旦 BFC 建立它就会阻止它内部的元素逃离突破它。
一个 BFC 会停止去环绕浮动元素
你可能很熟悉 BFC 的这个特性我们在有浮动元素的列类型布局中常用到。如果一个元素创建了 BFC它就不会去环绕或者说包装任何浮动元素。看下面这个示例
1 2 3 4 5 6 | <div class="outer"> <div class="float">I am a floated element.</div> <div class="text">I am text</div> </div> |
class 名为 float 的元素将会浮动在布局的左侧class 名为 text 的 div 元素将会在它后面并环绕它。
文字环绕着浮动元素
我们可以通过给 text 元素建立 BFC 来阻挡这种环绕行为。
1 2 3 4 5 | .text { overflow: auto; } |
text 元素建立 BFC 后就不再环绕浮动元素了
该方法也是我们创建浮动布局的基本方式。还需注意的是浮动一个元素时也会给该元素创建 BFC也就是说此时 .float 与 .text 都是 BFC这也是无论右侧高度低于还是高于左侧两者都不会互相围绕的原因。
创建一个 BFC 的常用方式
除了使用 overflow
外 一些其他的 CSS 属性也可以创建 BFC比如上面我们所见浮动一个元素也可以为该元素创建 BFC浮动元素会包裹它内部的所有元素。还有以下几种方式可以创建 BFC
使用 position: absolute
或者 position fixed
。
使用 display: inline-block
、display: table-cell
或者 display: table-caption
其中 table-cell
和 table-caption
是表格相关 HTML 元素的对应默认 CSS 值所以当你创建表格每个表格单元都会自动创建 BFC。
另外当使用 multi-column layout 多列布局时使用 colum-span: all
也可以创建 BFC。Flex弹性 和 Grid网格 布局中的元素也会自动创建类似 BFC 的机制只是它们被称为 Flex Formatting Context弹性格式上下文和 Grid Formatting Context(网格格式上下文)。这反映了它们所参与的布局类型。一个 Block Formatting Context块级格式上下文表明他内部的元素参与了块级布局一个 弹性格式上下文意味着它内部的元素参与了弹性布局。在实践中这几种布局的结果是相似的浮动元素会被包裹、外边距不会叠加。
创建 BFC 的新方式
使用 overflow 或其他的方法创建 BFC 时会有两个问题。第一个是这些方法本身是有自身的设计目的的所以在使用它们创建 BFC 时会可能产生副作用。例如使用 overflow 创建 BFC 后在某些情况下你可能会看到出现一个滚动条或者元素内容被削减。这是由于 overflow 属性是设计被用来让你告诉浏览器如何定义元素的溢出状态的。浏览器执行了它最基本的定义。
另一个问题是即使在没有出现副作用的情况下使用 overflow 也可能会使另一个开发人员感到困惑。他们可能会各种猜想这里为啥要把 overflow 的值设为 auto 或 scroll原开发人员做这个意义何在原开发人员是想让这里出现滚动条吗
最安全的做法应该是创建一个 BFC 时不会有任何副作用它内部的元素都安安全全的呆在这个小布局里这种方法不会引起任何意想不到的问题也可以让开发者意图清晰。CSS 工作组也十分认同这种想法所以他们定制了一个新的属性值display: flow-root
。
你可以使用 display: flow-root
安全的创建 BFC 来解决本文中提到的各种问题包括包裹浮动元素、阻止外边距叠加、阻止环绕浮动元素。
caniuse 上 display: flow-root 各浏览器支持情况
浏览器对该属性值的支持目前还是有限的如果你觉得这个属性值很方便请投票去让 Edge 也支持它。不过无论如何你现在应该已经理解了什么是 BFC以及如何使用 overflow 或其他方法来包裹浮动以及知道了 BFC 可以阻止元素去环绕浮动元素如果你想使用弹性或网格布局可以在一些不支持他们的浏览器中使用 BFC 的这些特性做降级处理。
理解浏览器如何布置网页是非常基础的。 虽然有时看起来无关紧要但是这些小知识可以加快创建和调试 CSS 布局所需的时间。
本文转载自前端记录http://www.ferecord.com/understanding-css-layout-block-formatting-context.html
相关文章:

Linux环境下用OpenJTAG实现Linux内核的源码级调试
1、通过U-boot将uzImage格式的内核加载到内存中(可以从Flash中读取,也可以从U盘、SD卡读取,还可以通过网络); 2、登陆到OpenOCD上,在内核中__turn_mmu_on打上断点,跳过MMU(Linux 的链…

如何在Windows中安装Python?
如何在Windows中安装Python? 1. Python的安装 官网下载:https://www.python.org/downloads/windows/ 点开上面的链接,会发现有很多版本。 首先看版本,64-bit是64位版本,32-bit是32位版本,你需要下载跟你…

Python培训教程分享:Python中选择结构是什么
越来越多的人开始报名学习Python技术,那么学习Python技术不是一两天就能学会的,本期小编为大家推荐的Python培训教程主要讲的是“Python中选择结构是什么”,下面来看看具体的内容,大家做好笔记哦。 Python培训教程分享:…

UIWebView之获取所点位置图片URL
UIWebView有自己的UIResgure,如果我们手动加入自己的GestureRecognize将不能识别,如UILongPressGestureRecongnizer. 在浏览网页的时候,如果看到喜欢的图片,想把它保存下来如何办呢? 我们可以自己写一个程序来实现&…
【组队学习】【27期】青少年编程(Turtle)
青少年编程(Turtle) 论坛版块: http://datawhale.club/c/team-learning/34-category/34 开源内容: https://github.com/datawhalechina/team-learning-program/tree/master/Turtle 学习目标 针对未接触过python、或者刚接触…

linux下activemq安装与配置
一、下载:apache-activemq-5.14.0-bin.tar.gzhttp://activemq.apache.org/activemq-5140-release.html二、安装activemq1、gz文件拷贝到/usr/local/src目录2、解压启动tar -zxvf apache-activemq-5.14.0-bin.tar.gzcd apache-activemq-5.14.0cd bin./activemq start…

参加软件测试培训需要注意哪些
零基础同学想要学习软件测试,通过自学是比较难的,那么很多人都会考虑软件测试培训机构,那么参加软件测试培训需要注意哪些问题呢?来看看下面的详细介绍。 参加软件测试培训需要注意哪些? 一、科学选择培训机构 要想学到最真实有用的软件测试…

Ubuntu12.04LTS添加broadcom 802.11g无线网卡驱动
Description: windows下无线网驱动可用,切换到Ubuntu下,无线网驱动失效。Reason: boardcom在Ubuntu下没有安装默认的驱动,需要自己手动配置install。 Solution: 1)有线连接网络,安装b43-fwcutte…

Android常用知识点回顾
开发过程中经常碰到一些问题或知识点,通过Baidu or Google 最终解决了问题。随后也对该知识点有了一定的掌握,可是过了一段时间再次碰到还是会忘记。所以该篇主要用来记录常见知识点。 山中何所有,岭山多白云。出自南北朝陶弘景,谨…
【组队学习】【27期】集成学习
集成学习 论坛版块: http://datawhale.club/c/32-category/32 开源内容: https://github.com/datawhalechina/ensemble-learning 学习目标 详细介绍了机器学习领域中最经典的算法并给出了相应的数学推导和代码,对于每个算法都进行了细致…

UI设计培训分享:2021年UI设计风格新风向标主要体现在哪些方面
UI设计在近几年的各大企业中显得尤为重要,那么随着近几年的发展,2021年UI设计风格新风向标主要体现在哪些方面呢?大家是否做过了解呢?如果没有,那么来看看下面的详细介绍就知道了。 UI设计培训分享:2021年UI设计风格新风向标主要…

《c陷阱与缺陷》之贪心法
在词法分析中,有条规则:每个符号应该包含尽可能多的字符,被称为“贪心法”或“大嘴法”。 K&R表述如下:如果(编译器的)输入流截止至某个字符之前都已经被分解为一个个符号,那么下一个符号将…

阿里云大数据计算服务MaxCompute(下篇)
关于阿里云大数据计算服务MaxCompute的详细内容: 阿里云大数据计算服务MaxCompute使用教程 (MaxCompute(原ODPS)是一项大数据计算服务,它能提供快速、完全托管的PB级数据仓库解决方案,使您可以经济并高效的…
【组队学习】【27期】李宏毅机器学习
李宏毅机器学习 论坛版块: http://datawhale.club/c/31-category/31 开源内容: https://github.com/datawhalechina/leeml-notes 学习目标 李宏毅老师的机器学习视频是机器学习领域经典的中文视频之一,也被称为中文世界中最好的机器学习…

Python培训分享:Python新版本中的6个新特性
Python在几年做了一个全面的升级,此次Python升级中有6个新特性,本期小编为大家介绍的Python培训教程就是关于介绍Python新版本中的6个新特性的,来看看下面的详细介绍。 Python培训分享:Python 3.10 有几个新的很酷的功能ÿ…

indows上的android开发环境软件架构5
(二)实验要求: ? 修改按下button 显示的内容中添加上自己的学号姓名; ? 添加一个按钮,按钮名称为“退出”,并且为这个按钮添加事件代码,使得点击这个按钮后退 出程序。事件代码如下: FullscreenActivity.…

日志服务Flink Connector《支持Exactly Once》
摘要:Flink log connector是阿里云日志服务推出的,用于对接Flink的工具,包含两块,分别是消费者和生产者,消费者用于从日志服务中读数据,支持exactly once语义,生产者用于将数据写到日志服务中&a…

【组队学习】【27期】Java编程语言
Java编程语言 论坛版块: http://datawhale.club/c/team-learning/33-category/33 开源内容: https://github.com/datawhalechina/team-learning-program/tree/master/Java 学习目标 Java独特的面向对象的抽象类编程特点,广泛应用于应用…

UI培训分享:如何提升自己的UI设计能力
相信很多UI设计师在工作中经常会遇到瓶颈,那么如何提升自己的UI设计能力?是我们要思考的一个问题,下面小编就为大家分享—些建议。 UI培训分享:如何提升自己的UI设计能力 1、多看 国内知名的设计网站,比如站酷网、花瓣网、多看优…

微信小程序使用阿里巴巴iconfont字体图标
打开阿里巴巴iconfont官网(http://www.iconfont.cn/);把用到的字体图标加到项目里面; 进入到项目里面,选择font class方式来使用,如果没有生成过代码的同学点生成,已经有代码的直接复制代码;iconfont.pngiconfont.png4.浏览器新建页面&…

IIS6 MVC3 配置
用mvc3做了一个网站,重写了下URL,http://www.xxxx.com/news/details/54.html. 结果在iis上预览找不到页面,但是在vs下就没问题直接运行就没问题。 具体的原因应该是找不到映射。 所以需要在iis上添加映射。 添加MVC的解析: 右击II…

【组队学习】【27期】动手学数据分析
动手学数据分析 论坛版块: http://datawhale.club/c/team-learning/25-category/25 开源内容: https://github.com/datawhalechina/hands-on-data-analysis 学习目标 以项目为主线,通过边学,边做以及边被引导的方式…

参加UI培训后可以找什么工作
UI设计在近几年备受大家的关注,很多企业对UI设计这个岗位也显得尤为重要,很多人都想转型学习UI设计技术,大多数人选择参加UI培训机构进行系统学习,那么通过系统培训的同学参加UI培训后可以找什么工作呢?来看看下面的详细介绍。 参…

Datawhale组队学习周报(第021周)
本文总结了本周(07月05日~07月11日)Datawhale组队学习的运行情况,我们一直秉承“与学习者一起成长的理念”,希望这个活动能够让更多的学习者受益。 第 25 期组队学习一共有 3 门开源课程,共组建了 3 个学习群…

alias重启终端失效的问题
如果使用命令 alias xxxxxx 那么登出以后,别名就会失效。下次登入的时候就不能用了。 为了保持别名可以把它写入.bashrc 在.bashrc的最后写入想要的别名,比如 alias zpll -al 然后退出,重新登入的时候就可以用了。 或者直接运行命令 source ~…

使用文本用户界面(NMTUI)进行网络配置
NetworkManager 文本用户界面(TUI)工具 nmtui 可提供一个文本界面配置由 NetworkManager 控制的网络。该工具包含在 NetworkManager-tui 子软件包中。写入时,不会默认随 NetworkManager 安装该子软件包。要安装 NetworkManager-tui࿰…

UI培训教程分享:常用的商业插画风格有哪些?
在UI设计岗位中插画设计是作为一名合格的UI设计师都会接触到的工作内容,运用插画设计,做到图文结合,令用户的印象也更加深刻,今天小编为大家分享的UI培训教程就是关于常用的商业插画风格有哪些?希望能够给大家带来帮助。 UI培训教…

快速构建Windows 8风格应用32-构建辅助磁贴
引言 Windows Phone中,我们开发者可能会开发的一个功能点是将数据列表中某一项“Pin To Start(固定到开始屏幕)”,大家都知道这种固定到开始屏幕的磁贴叫做辅助磁贴(也叫二级磁贴),用户可以通过该辅助磁贴启动应用程序…

【第22周复盘】可以查成绩了!
「青少年编程竞赛交流群」已成立(适合6至18周岁的青少年),公众号后台回复【Scratch】或【Python】,即可进入。如果加入了之前的社群不需要重复加入。 微信后台回复“资料下载”可获取以往学习的材料(视频、代码、文档&…

UI培训教程分享:APP启动页UI界面设计
本期为大家分享的ui培训教程是关于APP启动页面的UI设计方面,作为一名合格的UI设计师,APP产品的启动页是需要会的,下面就来看看详细的教程吧。 UI培训教程分享:APP启动页UI界面设计 启动页面在APP中还是很有必要的,对于…