Box与Formatting Context
一直对css都不够重视,觉得简单,其实也是有些知识的。所以抽空做了些总结
参考文献:mdn的css文档、w3c css规范
w3c是制定标准的,而mdn的目标是做开发者服务的开发文档。
但实际上,大家还是用mdn多一些,颜值高,讲的没那么啰嗦。当然要是还刨根问题 还得是w3c!
Box model(盒子模型)
参考文档:w3c的css-box-3与 mdn的盒子模型
当对一个文档进行布局(lay out)的时候,浏览器的渲染引擎会根据标准之一的 CSS 基础框盒模型(CSS basic box model),将所有元素表示为一个个矩形的盒子(box)。CSS 决定这些盒子的大小、位置以及属性(例如颜色、背景、边框尺寸…)。
每个盒子尺寸(box dimensions)由四个部分组成,包括:边距[margging],边框[border],填充[padding],和实际内容[content width & content height]
简单来说就是:取得元素的内容并将其放在一个独立的元素盒子中,然后在其周边加上内外边距、边框——这就是我们所说的盒子模型。

注意:
正常情况下,区块(盒子)的上下外边距有时会合并(即折叠)为单个边距,其大小为两个边距中的最大值(或如果它们相等,则仅为其中一个),这种行为称为外边距折叠。
<style>
div {
height: 20px;
background-color: pink;
}
.box1 {
margin-bottom: 10px;
}
.box2 {
margin-top: 20px;
}
</style>
<body>
<div class="box1"></div>
<div class="box2"></div>
</body>

visual formatting model(视觉格式化模型)
官方标准中对于视觉格式化模型的阐述为 how user agents process the document tree for visual media. 直译过来就是 用户代理在视觉媒体下如何处理文档树的意思。
通俗和侠义点讲就是 视觉格式化模型就是规定了 网页如何在你设备上的浏览器中如何被渲染和展示。
视觉媒体:visual media 指得是用户可视化媒体,如手机,电脑、打印机、幻灯机、电影放映机、dvd等
用户代理:user agents,简称UA,指的是用户在可视化媒体(终端)上使用(访问并解析html)的程序,最常见的比如浏览器、小程序或原生安卓和ios的webview
文档树: document tree,它是文档元素分级结构的形象表示。一个文档结构树包含根元素,根元素是最顶级的元素
在可视化格式化模型 规定中,文档树中的每个元素根据【盒子模型】规范 生成零个或多个盒子。
且这些盒子的布局受以下因素的控制:
盒子尺寸和类型(下边讲)。
定位方案 (正常流、浮动和绝对定位)。
文档树中元素之间的关系。
其它因素(例如,viewport的大小、置换的固有尺寸等)
viewport(可视窗口)
User agents for continuous media generally offer users a viewport through which users consult a document.
用户代理为连续媒体提供的一个(呈现解析和渲染后的文档树的)区域,用户通过这个区域可以阅读文档内容。在(用户代理为)浏览器中,一般指的就是浏览器用于呈现网页的区域。

注意 continuous media(连续媒体) 其实就是visual media的一种,比如网页。但是像打印机打印的文档内容必须是分页的,所以就是paged media(分页媒体)。这里有详细的媒体类型介绍。
当视口在小于文档渲染的尺寸时,必须提供一种滚动机制,最常见的就是浏览器的滚动条,通过滚动条我们就可以浏览超出视口的文档部分,也就是文档中阐述的 When the viewport is smaller than the area of the canvas on which the document is rendered, the user agent should offer a scrolling mechanism.
当然关于视口的知识点可不只是上述的这么简单,比如在移动web中,viewport的相关属性对于移动web的开发至关重要,但本文暂不涉及其他关于视口的知识点。
Containing blocks(包含块)
它是【视觉格式化模型】的一个重要概念,它与盒子模型非常的类似,也可以理解为一个矩形,
而这个矩形的作用是为它里面包含的元素提供一个参考,元素的尺寸和位置的计算往往是由该元素所在的包含块决定的。
包含块简单说就是定位参考框,或者定位坐标参考系,元素一旦定义了定位显示(相对、绝对、固定)都具有包含块性质,它所包含的定位元素都将以该包含块为坐标系进行定位和调整。
除了定位参考 还有宽度参考 等等等等很多重要的作用~
Controlling box generation(控制【box】的生成)
CSS的【视觉格式化模型】一部分工作是 从文档元素(document tree element)生成盒(box)。
根据CSS属性display属性,可以生成不同类型的盒。
Block-level elements & block boxes(块级元素和块盒)
块级元素视觉上呈现为块,竖直排列
当元素的CSS属性display为block,list-item或table时,它就是块级元素
css排班布局
正如上文所说,css将网页上的元素都是为一个个盒子,那么这些盒子是怎么排版的呢?
css有多种布局方式,接下来一一介绍
常规布局
元素的类型 和 display 属性 会决定这 Box 的类型。不同类型的 Box 会参与 不同的 Formatting Context,所以 Box 内的元素会以不同的方式渲染
我们总结一下有哪些类型的 盒子模型:
block-level box: 块状盒子模型。display 属性为 block, list-item, table 的元素,会生成 block-level box。并且参与 block fomatting context;
inline-level box:行内盒子模型。display 属性为 inline, inline-block, inline-table 的元素,会生成 inline-level box。并且参与 inline formatting context;
run-in box:css3加的之后讲
Formatting context
Formatting context 即格式化上下文,是 W3C CSS规范中的一个概念:
它是页面中的一块渲染区域,并且有一套渲染规则,它决定了其子元素将如何定位,以及和其他元素的关系和相互作用
CSS2.1 中只有 BFC 和 IFC,CSS3 增加了 GFC 和 FFC。
IFC:Inline Formatting Context(内联格式化上下文)
BFC:Block Formatting Context(块级格式化上下文)
GFC:Grids Formatting Context(网格格式化上下文)
FFC:Flexible Formatting Context(弹性盒格式化上下文)
通俗的理解就是:
通过刚才说的盒模型我们知道 HTML 页面是由一个个盒子组成的,
但那这些盒子该怎么摆放在页面上面呢?--这其实就是格式化上下文的工作;
比如:块元素“自带换行符”、行内元素无法设置上下外边距和高度 等等等
这些我们平时觉得理所应当的规则 其实就是格式化上下文的组成部分,
浏览器就是按照这些规则来将我们写的页面展示给用户看的;
BFC
即块级格式化上下文,它是一个独立的渲染区域,它规定了内部的Block-level Box如何布局,并且与这个区域外部毫不相干。
BFC可以让元素成为隔离独立的容器,且容器内的子元素不会影响到外面的布局
BFC布局规则:
- 内部的Box会在垂直方向,一个接一个地放置。
- Box垂直方向的距离由margin决定。属于同一个BFC的两个相邻Box的margin会发生重叠
- 每个元素的margin box的左边, 与包含块border box的左边相接触(对于从左往右的格式化,否则相反)。即使存在浮动也是如此。
- BFC的区域不会与float box重叠。
- BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素。反之也如此。
- 计算BFC的高度时,浮动元素也参与计算
如何创建BFC:
- 根元素body
- float属性不为none
- position为absolute或fixed
- display为inline-block, table-cell, table-caption, flex, inline-flex
- overflow不为visible
BFC的应用场景
解决容器内子元素浮动、绝对定位等原因造成的高度塌陷的问题;
Box与Formatting Context的更多相关文章
- BFC(Box Formatting Context)的原理
BFC 已经是一个耳听熟闻的词语了,网上有许多关于 BFC 的文章,介绍了如何触发 BFC 以及 BFC 的一些用处(如清浮动,防止 margin 重叠等).虽然我知道如何利用 BFC 解决这些问题, ...
- BFC(Box,Formatting,Context) —— 块级格式化上下文
Box:CSS布局的基本单位 Formatting context是页面中的一块渲染区域,最常见的是BFC和IFC,CSS3增加了GFC和FFC BFC定义:块级格式化上下文,它是一个独立的渲染区域, ...
- 【转】关于Block Formatting Context--BFC和IE的hasLayout
转自穆乙 http://www.cnblogs.com/pigtail/ 一.BFC是什么? BFC(Block Formatting Context)直译为“块级格式化范围”. 是 W3C CSS ...
- 块级格式化上下文(block formatting context)、浮动和绝对定位的工作原理详解
CSS的可视化格式模型中具有一个非常重要地位的概念——定位方案.定位方案用以控制元素的布局,在CSS2.1中,有三种定位方案——普通流.浮动和绝对定位: 普通流:元素按照先后位置自上而下布局,inli ...
- 关于Block Formatting Context--BFC和IE的hasLayout
转文请标明 --- 出处:穆乙 http://www.cnblogs.com/pigtail/ 一.BFC是什么? BFC(Block Formatting Context)直译为"块级格式 ...
- css Block formatting context BFC
w3c关于BFC解释: http://www.w3.org/TR/CSS21/visuren.html#block-formatting Mdn描述: A block formatting conte ...
- 什么是BFC(Block Formatting Context)
原文:https://segmentfault.com/a/1190000012221820 https://www.w3.org/TR/CSS2/visuren.html#block-formatt ...
- BFC --- Block Formatting Context --- 块级格式化上下文
虽然知道块级格式化上下文是什么东西,但要我把这个东西给说清楚,还真的不是一件容易的事儿,所以这篇文章我就要说说清楚到底什么使传说中的BFC,即块级格式化上下文. 一.BFC的通俗理解 通俗的理解 -- ...
- 关于Block Formatting Context--BFC和IE的hasLayout(转)
转文请标明 --- 出处:穆乙 http://www.cnblogs.com/pigtail/ 一.BFC是什么? BFC(Block Formatting Context)直译为“块级格式化范围”. ...
- 块格式化上下文(Block Formatting Context,BFC)
块格式化上下文(Block Formatting Context,BFC) 是Web页面的可视化CSS渲染的一部分,是块盒子的布局过程发生的区域,也是浮动元素与其他元素交互的区域. 下列方式会创建块格 ...
随机推荐
- 前端ai工具v0使用配置
资料 ai工具Vo Installation - Tailwind CSS 以vue3 + sass为例,配置如下 安装tailwindcss npm install -D tailwindcss n ...
- Eclipse 安装---windows10环境下
Eclipse 安装---windows10环境下 一.下载 1.前往eclipse官网下载 https://www.eclipse.org/downloads/ 2.选择类型(压缩包) 3.选择版本 ...
- @Accessors lombok注解用法
最近学习代码看到很多有趣的注解:慢慢整理下: @Accessors注解 @Accessors注解官方给出的解释是:面向getter和setter的更流畅的API.用于生成和查找getter和sette ...
- windows下redis设置redis开机自启动
windows系统下启动redis命令 进入redis安装目录 cd redis 输入 redis-server.exe redis.windows.conf 启动redis命令,看是否成功 可能会启 ...
- hadoop部署安装(六)hive
5.配置hive 5.1 hive下载地址 http://mirror.bit.edu.cn/apache/hive/ 解压缩 [root@master ~]# tar xf apache-hive- ...
- idea添加类或方法快捷键的方法
前言: 使用idea有过一段一段时间了,每次写完方法需要都需要注释,要么手动注释要么用快捷键(/** 回车)默认模板注释,不符合项目规定的注释要求,于是想了想是不是设置自定义的注释模板,上网查了资料整 ...
- vue3 基础-条件渲染 v-if 和 v-show
本篇讲 vue 中对 dom 元素节点进行 "显示和隐藏" 的实现方式指令, 即 v-if 和 v-show. 其实一句话就能说明白, v-if 的底层是从 dom 树中增删节点; ...
- 队列-Python 实现
用 Python 来实现 队列和双端队列, 直接上代码理解即可. 队列蛮好理解的, 就是模拟咱生活中的排队. 先进, 先出嘛. """ 队列 - ADT 队列 Queue ...
- PHP MD5强碰撞
MD5强碰撞 搬得这个师傅的 https://www.cnblogs.com/kuaile1314/p/11968108.html 可以看到,使用了三个等号,这个时候PHP会先检查两边的变量类型,如果 ...
- [VulnHub]DC-2靶场全过程
DC-2 信息收集 arp-scan -l nmap -sP 192.168.190.0/24 kali靶机:192.168.190.128 DC-2靶机:192.168.190.138 知道了靶机i ...