[CSS] Visual formatting model

1. background

Visual formatting model是CSS 2.1规范中,第9章介绍的一个概念,它的定义如下,

Visual formatting model:
How user agents process the document tree for visual media.

在浏览器环境中,Visual formatting model用于定义,
浏览器在显示文档时的处理方式。

文档中的每一个元素,根据box model的定义,会产生0个或多个box,
这些box的布局方式,受以下因素影响,
(1)box的尺寸(box dimensions)和类型(type
(2)定位方式(positioning scheme
包括正常流(normal flow),浮动(float),和绝对定位(absolute positioning
(3)文档树(document tree)中元素的关系
(4)一些外部信息
例如,视口的大小(viewport size),图片的内在尺寸(Intrinsic dimensions

Visual formatting model并不会指出对文档进行格式化操作(formatting)的方方面面,
例如,它并没有指定计算字符间距(letter-spacing)的算法,
如果规范中没有这样的约束,浏览器可以采用任何符合规定的做法。

2. containing block

CSS 2.1规范指出,
很多box的位置和大小,是根据一个与之相关的矩形来计算的,
称为包含块(containing block)。

通常,已经产生的box,会作为后续box的包含块。
每一个box,根据其包含块来确定位置(position),
但是并不一定会受限于包含块内,也有可能溢出(overflow)。

3. box generation

元素display属性,决定了由它产生的box的类型,
Visual formatting model对于不同类型的box,会有不同的格式化(formatting)方式。

3.1 block

block-level-element
block-level box
block container box
block box
anonymous block box(略

display: block / list-item / table;,指定了一个block-level element
block-level element,会当做段落(paragraphs)来处理。

每一个block-level element,会创建一个principal block-level box
用于包含后续的box和它们的内容,
block-level box,会受控于(participate in)block formatting context的影响。

除了display: table;,以及可替换元素(replaced element)之外
的block-level box,
都是block container box,其中可以包含block-level box,
或者它会创建一个inline formatting context,用于包含inline-level box。

有的block container box,不是block-level box,
例如,不可替换的行业块级元素(non-replaced inline blocks),不可替换的单元格(non-replaced table cells),
它们都是block container box,但都不是block-level box。

如果一个box,既是block-level box,又是block container box,
则称为block box

3.2 inline

inline-level element
inline-level box
inline box
atomic inline-level box
anonymous inline box(略

display: inline / inline-table / inline-block;,指定inline-level element
inline-level element中的内容,会显示在一行(distributed in lines)。

inline-level element,会创建inline-level box
受控于inline formatting context的影响。

如果一个box,既是inline-level box,
而且其内容(content),也受到包含它的inline formatting context影响,
就称为inline box
例如,设置了display: inline;的不可替换元素(non-replaced element),会创建一个inline box。

可替换的行内元素(replaced inline-level element),行内块级元素(inline-block element),inline-table元素,
都是inline-level box,但却不是inline box,
这些元素,称之为atomic inline-level box。

之所以称之为“atomic”,它是不透明的(opaque),
它们会作为一个整体受到inline formatting context的影响。

4. normal flow

正常流(normal flow)中的box,会受到格式化上下文(formatting context)的影响,
block-level box会受到block formatting context的影响,
inline-level box会受到inline formatting context的影响。

4.1 block formatting context

以下box会为它包含的内容(content),创建一个新的block formatting context
(1)overflow不是visible的block box,
(2)不是block box,但是它设置了浮动,绝对定位
(3)不是block box,但它是一个block container box,例如,行内块(inline-block),单元格(table-cell),表格标题(table-caption)。

block formatting context中的box,会从一个containing block的顶部开始,
在垂直方向上,一个接一个的排列,
两个相邻的box间的垂直间距,由它们的margin属性决定,
并且,会发生collapsing margin

block formatting context中,
每一个box的左边缘(left outer edge)紧贴containing block的左边缘,
即使设置了浮动,也是如此。
(除非这个box,创建了一个新的block formatting context)。

4.2 inline formatting context

inline formatting context中的box,会从一个container block的顶部开始,
在水平方向上,一个接一个的排列,
水平marginborderpadding,会作用到这些box上。

在垂直方向上的对齐方式,这些box可能会有不同,
可能底部对齐,或者顶部对齐,也有可能基于它们所包含的文字基线(baseline)进行对齐。
每一行的多个box,会包含在一个矩形区域中,
这个矩形区域,称为line box

line box的宽度,取决于containing block,
line box的高度,取决于由line height calculations给出计算规则。


参考

CSS 2.1 Specification

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,277评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,689评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,624评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,356评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,402评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,292评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,135评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,992评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,429评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,636评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,785评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,492评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,092评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,723评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,858评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,891评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,713评论 2 354

推荐阅读更多精彩内容