常规流( Normal flow )

格式化上下文( Formatting context )

格式化上下文指的是初始化元素定义的环境。包含两个要点,一个是元素定义的环境,一个是初始化。

在 CSS 中,元素定义的环境有两种,一种是块格式化上下文( Block formatting context ),另一种是行内格式化上下文( Inline formatting context )。 这两种上下文定义了在 CSS 中元素所处的环境,格式化则表明了在这个环境中,元素处于此环境中应当被初始化,即元素在此环境中应当如何布局等。

以上解释专业点的说法是:在常规流中的框,都属于一个格式化的上下文中。

这个上下文可能是块的,也可能是行内的,但不可能同时是行内的又是块的。块框1参与块格式化上下文。行内框1参与行内格式化上下文。

注:

  1. 关于块框和行内框,请参见 W3C CSS2.1 - 9.2 Controlling box generation

块格式化上下文( Block formatting context )

触发方式

浮动元素、绝对定位元素,‘display‘ 特性为 "inline-block","table-cell", "table-caption" 的元素,以及 ‘overflow‘ 不是 "visible" 的元素,会创建新的块格式化上下文。

  • 浮动元素
  • 绝对定位元素
  • 行内块元素
  • 单元格
  • 表格标题元素
  • overflow 非 "visible"的元素

注意,是这些元素创建了块格式化上下文,它们本身不是块格式化上下文。

作用及现实意义

块格式化上下文是一个比较抽象的概念。可以把它想象成一个大箱子,很多元素装在里面,箱子把它们和外面的元素隔开。

块格式化上下文是个重要的概念,它对宽高的计算,外边距折叠,定位等都有一定的影响。

在块格式化上下文中,框会一个接一个地被垂直放置,它们的起点是一个包含块的顶部。 两个兄弟框之间的垂直距离取决于 ‘margin‘ 特性。在块格式化上下文中相邻的块级元素的垂直外边距会折叠( collapse )。

在块格式化上下文中,每一个元素左外边1与包含块的左边相接触(对于从右到左的格式化,右外边接触右边), 即使存在浮动也是如此(尽管一个元素的内容区域会由于浮动而压缩),除非这个元素也创建了一个新的块格式化上下文。

它与普通的块框类似,不同之处在于:

  • 可以包含浮动元素2
  • 可以阻止外边距折叠3
  • 可以防止元素被浮动元素覆盖4

CSS3 草案中的 "flow root" 5

在 CSS3 中,对块格式化上下文这个概念做了改动,将 "Block formatting context" 叫做 "flow root"。

对于触发方式也做了修改,更加准确:
The value of ‘position‘ is neither "static" nor "relative".

可见,CSS3 草案中的对触发方式的描述更加准确,‘position‘ 在 "fixed" 的时候也会创建 "flow root"。这并不是CSS2.1的疏忽,
因为 "position:fixed" 本身就是 "position:absolute" 的一个子类。

注意,"display:table" 本身并不产生 "block formatting contexts"。但是,它可以产生匿名框 6
其中包含 "display:table-cell" 的框会产生块格式化上下文。
总之,对于 "display:table" 的元素,产生块格式化上下文的是匿名框而不是 "display:table"7

注:

  1. 既 left margin 边界,参见 W3Help - KB006: CSS 框模型( Box module ) 第一部分。
  2. 块格式化上下文的高度计算是包含其浮动子元素的,详见: W3C CSS2.1 - 10.6.7 ‘Auto‘ heights for block formatting context roots
  3. 详见 W3Help - KB006: CSS 框模型( Box module ) 的外边距折叠部分。
  4. 参照 W3C CSS2.1 - 9.5 Floats 第五小段的内容:
    The border box of a table, a block-level replaced element,
    or an element in the normal flow that establishes a new block formatting
    context (such as an element with ‘overflow‘ other than ‘visible‘) must
    not overlap any floats in the same block formatting context as the
    element itself.
  5. 关于 flow root,见: W3C CSS3 draft - 4.2. Block-level boxes, containing blocks, flows and anonymous boxes
  6. 关于匿名框,W3C CSS2.1 - 9.2 Controlling box generation
  7. 参见: Yahoo - CSS 101: Block Formatting Contexts

行内格式化上下文( Inline formatting context )

行框( line boxes )

相对于块格式化上下文,在行内格式化上下文中,框( boxes )一个接一个地水平排列,起点是包含块的顶部。
水平方向上的 margin,border 和 padding 在框之间得到保留。
框在垂直方向上可以以不同的方式对齐:它们的顶部或底部对齐,或根据其中文字的基线对齐。
包含那些框的长方形区域,会形成一行,叫做行框。

示例代码:

<p style=" font-size:30px;">TEXT1<span style="border:3px solid blue;">text in span</span>great1<em style="border:3px solid red;">thx a lot</em>bee<strong style="border:3px solid green;">give me 5!</strong>Aloha!</p>

以上代码中,无换行符及空格,共形成了 7 个行内框。

示意图:

行框的宽度由它的包含块1和其中的浮动元素决定。高度的确定由行高度计算规则决定。

行框的范围

通常,行框的左边接触到其包含块1的左边,右边接触到其包含块1的右边。然而,浮动元素可能会处于包含块1边缘和行框边缘之间。
总之,尽管在相同的行内格式化上下文中的行框通常拥有相同的宽度(包含块1的宽度),它们可能会因浮动元素缩短了可用宽度,
而在宽度上发生变化。同一行内格式化上下文中的行框通常高度不一样(如,一行包含了一个高的图形,而其它行只包含文本)。

示例代码:

<p style=" width:500px; overflow:hidden; ">
    <span style="border:1px solid blue; font-size:50px; float:left;">FLOAT</span>
    <em style="border:1px solid yellow; font-size:30px;">great1</em>
    <span style="border:1px solid yellow;">good</span>
</p>

示意图:

行内框可能被分割

如果几个行内框在水平方向无法放入一个行框内,它们可以分配在两个或多个垂直堆叠的行框中。因此,一个段落就是行框在垂直方向上的堆叠。
行框在堆叠时没有垂直方向上的分割且永不重叠。

如果一个行内框超出包含它的行框的宽度,它会被分割成几个框,并且这些框会被分布到几个行框内。如果一个行框不能被分割(例如,
行内框只包含单个字符,或者语言特殊的断字规则不允许在行内框里换行,或者行内框受到带有 "nowrap" 或 "pre" 值的 ‘white-space‘ 特性的影响),这时,行内框会溢出行框。

如果一个行内框被分割,margin、padding 和 border 在所有分割处没有视觉效果。

行内框还可能由于双向文本处理(bidirectional text processing)而在同一个行框内被分割为好几个框。

示例代码:

<p style=" width:100px; ">
    <span style="border:1px solid blue; font-size:50px;">text in span</span>
    <em style="border:1px solid yellow; font-size:30px; vertical-align:top;">great1</em>
</p>

示意图:

由于行框宽度限制(100px),第一个 SPAN 元素形成的行内框,被分割成了 3 段。

行内框的对齐

1). 行内框在行框中垂直方向上的对齐

行框的高度总是足够容纳所包含的所有框。不过,它可能高于它包含的最高的框(例如,框对齐会引起基线对齐)。
当一个框 B 的高度小于包含它的行框的高度时,B 在行框中垂直方向上的对齐决定于 ‘vertical-align‘2 特性。
‘vertical-align‘2 默认值为基线( ‘baseline‘ )对齐。

示例代码:

<p style=" width:500px; ">
    <span style="border:1px solid blue; font-size:50px;">text in span</span>
    <em style="border:1px solid yellow; font-size:30px; vertical-align:top;">great1</em>
</p>

示意图:

EM 所形成的行内框内容的顶端与行中最高元素的顶外边界对齐。

2). 行内框在行框中水平方向上的对齐

当一行中行内框宽度的总和小于包含它们的行框的宽,它们在水平方向上的对齐,取决于 ‘text-align‘ 特性。
如果其值是 ‘justify‘,用户端也可以拉伸行内框(除了 ‘inline-table‘ 和 ‘inline-block‘ 框)中的空间和文字 。

示例代码:

<p style=" width:500px;overflow:hidden; text-align:center;">
    <span style="border:1px solid blue; font-size:50px; float:left;">FLOAT</span>
    <em style="border:1px solid yellow; font-size:30px;">great1</em>
    <span style="border:1px solid yellow;">good</span>
</p>

示意图:

由图可见,浮动元素缩短了当前的行框,并且行内框在对齐的时候是根据行框的宽度,居中对齐。

空的行内框应该被忽略

不包含文本,保留空白符,margin/padding/border 非0的行内元素,以及其他常规流中的内容(比如,图片,inline blocks 和 inline tables),
并且不是以换行结束的行框,必须被当作零高度行框对待。就外边距折叠而言,这种行框必须被忽略。

注:

  1. 关于包含块,请见W3Help - KB008: 包含块( Containing block )
  2. 关于 ‘vertical-align‘,详见:W3C CSS2.1 - 10.8 Line height calculations: the ‘line-height‘ and ‘vertical-align‘ properties

相对定位( Relative positioning )

在常规流中的占位

一旦一个框按照常规流或者是浮动得到定位,它还可以相对该位置而偏移。
这就是相对定位。按照这种方式偏移一个框(B1)不会对后续的框(B2)有影响:

  • B2 在定位时,就好象 B1 没有发生偏移一样
  • B1 偏移后,B2 不会重新定位

相对定位元素处于常规流中,相对于元素在常规流中的原位置进行定位,偏移后,在常规流中依然占据原有位置。

这也意味着相对定位可能产生框的重叠1

注:

  1. 关于框的重叠,可以参见 W3Help - KB009: CSS 定位体系概述 中关于相对定位的例子,
    红色的框 B 将其下面蓝色的框 C 覆盖了

溢出包含块

如果相对定位引起 "overflow:auto" 或 "overflow:scroll" 框的溢出,浏览器必须允许用户访问内容,既,创建需要的滚动条,这可能会影响布局。

<div style="width:100px; height:100px; overflow:auto; border:2px solid blue;">
    <div style="width:20px; height:20px;  position:relative; top:100px; left:100px;">A</div>
</div>

其中,红色块 A 定位的时候,溢出蓝色框的显示范围。根据标准,应该出现滚动条,以保证用户可以正常的访问 A 中的内容。

示意图:

对相对定位溢出的处理,存在兼容性问题。请读者自行测试。

尺寸

相对定位元素的尺寸,会保持它在常规流中的尺寸。包括换行以及原来为它保留的位置。

定位及计算偏移后的值1

‘left‘ 和 ‘right‘ 的特性值

对于一个相对定位的元素,‘left‘ 和 ‘right‘ 会水平的位移框而不会改变它的大小。‘left‘ 会将框向右移动,‘right‘ 会将框向左移动。
由于 ‘left‘ 或者 ‘right‘ 不会造成框被拆分或者拉伸,所以,计算后的值( computed value )总是:left = -right。

1). ‘left‘ 和 ‘right‘ 的设定值都是 "auto"

如果 ‘left‘ 和 ‘right‘ 的值都是 "auto" (它们的初始值),计算后的值( computed value )为 0(例如,框区留在其原来的位置)。

2). ‘left‘ 或 ‘right‘ 其一的设定值为 "auto"

如果 left 为 ‘auto’,计算后的值(computed value)为 right 的负值(例如,框区根据 right 值向左移)。
如果 right 被指定为 ‘auto’,其计算后的值(computed value)为 left 值的负值。

示例代码:

<div style="width:20px; height:20px;  position:relative; left:100px;"></div>

上述代码中,DIV 元素是相对定位的元素,它的 ‘left‘ 值是 "100px", ‘right‘ 没有设置,默认为 "auto",那么,‘right‘ 特性计算后的值应该是 -left,即 "right:-100px"。

3). ‘left‘ 和 ‘right‘ 设定值都不是 "auto"

如果 ‘left‘ 和 ‘right‘ 都不是 "auto",那么定位就显得很牵强,其中一个不得不被舍弃。如果包含块的 ‘direction‘ 属性是 "ltr", 那么 ‘left‘ 将获胜,‘right‘ 值变成 -left。如果包含块的 ‘direction‘ 属性是 ‘rtl’,那么 ‘right‘ 获胜,‘left‘ 值将被忽略。

示例代码:

<div style="width:100px; height:100px; overflow:auto; border:1px solid blue;">
    <div style="width:20px; height:20px;  position:relative; left:60px; right:60px;"></div>
</div>

最后,‘left‘ 应该比较强悍才对。

‘top‘ 和 ‘bottom‘ 的特性值

‘top‘ 和 ‘bottom‘ 特性将相对定位元素向上或者向下移动,而不改变其大小。‘top‘ 把框向下移动,而 ‘bottom‘ 将其向上移动。 由于 ‘top‘ 和 ‘bottom‘ 没有造成框被拆分或者拉伸,计算值总是 top=-bottom,如果两个都是 "auto",其计算值就都是 0,如果其中之一是 auto,它就是另一个的负值。 如果都不是 "auto",‘bottom‘ 被忽略,这时,‘bottom‘ 的计算值会是 ‘top‘ 值的负值。

时间: 2024-08-04 04:48:40

常规流( Normal flow )的相关文章

常规流之块级格式化上下文(Block Formating Context)

在css2.1中,常规流包括块框(block boxes)的块格式化(block formatting),行内框(inline boxes)的行内格式化(inline formatting),块级框(block-level-boxes)或行内级框(inline-level-boxes)的相对定位.常规流中的框属于一个格式化上下文,可能是块或者是行内,但不能同时都是.块级框参与块级格式化上下文,行内级框参与行内级格式化上下文.今天我们先来说说块级格式化上下文,也就是我们常说的BFC. 一.形成块级

前端必须了解的布局常识:普通流(normal flow)

目录 一.概述 二.块级元素和内联元素 常见的块级元素 BFC 常见的行内元素 IFC 三.哪些情况会脱离普通流 浮动 绝对定位 固定定位 display:none 四.总结 五.参考资料 一.概述 普通流(normal flow,国内有人翻译为文档流):将窗体自上而下分成一行一行,块级元素从上至下. 行内元素在每行中按从左至右的挨次排放元素,即为文档流.了解文档流是css布局的基础.虽然 普通流 很基础, 但资料较少,之前对这个概念模糊,现总结如下,欢迎拍. 二.块级元素和内联元素 html元

层叠和继承的概念,选择器的优先级,盒模型,元素在页面上的定位体系,常规流

1.层叠和继承的概念: CSS层叠性是指CSS样式在针对同一元素配置同一属性是,依据层叠规则(权重)来处理冲突,选择应用权重高的CSS选择器所指定的属性,一般也被描述为权重高的覆盖权重低的,因此也称作层叠. 继承:子元素会自动拥有父元素的某些CSS属性,通常来说,文本类的属性会被继承(字体.字号.颜色) 2.选择器的优先级 !important>id选择器>类选择器>标签选择器>子选择器>后代选择器>伪类选择器 3.盒模型 在网页中,一个盒子占有空间的大小由几个部分构成

常规流之相对定位(Relative positioning)

相对于后面会讲到的绝对定位,相对定位确实要简单的多.但是简单不代表不重要,今天就来说说它. 一.什么是相对定位 一旦一个框按照常规流或者是浮动得到定位,它可以相对该位置进行偏移.这就叫做相对定位.这就是标准中对于相对定位的解释. 二.相对定位元素的一些特性 relative和absolute有一点很像,都能根据top.right.bottom和left属性进行偏移,但是这个偏移有所不同.absolute元素的偏移是相对于它的包含块来的,absolute的包含块在包含块那一章已经说过了,这里就不再

常规流之行内级格式化上下文(Inline Formatting Contexts)

本节我们来讨论一下Inline formatting contexts(行内格式化上下文,以下简称IFC)和line box(行框). 一.行框 在一个行内格式化上下文中,框会一个接一个的水平放置,从包含块的顶部开始.这些框水平方向的margin.border以及padding属性是会起作用的.这些框在垂直方向上的对齐方式可以不一样:可以顶部或底部对齐,或根据其中文字的基线对齐.包含这些框的矩形区域,会形成一行叫做行框(line box)的东西. 一个行框的宽度由它的包含块和和其中的浮动元素来决

Openvswitch原理与代码分析(5): 内核中的流表flow table操作

? 当一个数据包到达网卡的时候,首先要经过内核Openvswitch.ko,流表Flow Table在内核中有一份,通过key查找内核中的flow table,即可以得到action,然后执行action之后,直接发送这个包,只有在内核无法查找到流表项的时候,才会到用户态查找用户态的流表.仅仅查找内核中flow table的情况被称为fast path. ? ? 第一步:从数据包中提取出key ? 实现函数为int ovs_flow_key_extract(const struct ip_tun

文档流(常规流)

流顺序: 元素按照 HTML 中顺序,自上而下,自左至右,在窗体中排放 CSS2.1 中 position 定位的方案: 常规流: 块级元素.行内元素.相对定位 浮动 绝对定位: absolute.fix 属性 position 值 static —— 默认值,元素不被特殊定位 relative —— 配合 top.right.bottom.left 偏离正常位置, 且其他元素不会因此而调整位置来弥补空白 fixed —— 相对视窗定位,即使页面滚动依然不变(移动浏览器支持较差) absolut

洛谷 P3128 [USACO15DEC]最大流Max Flow

P3128 [USACO15DEC]最大流Max Flow 题目描述 Farmer John has installed a new system of N-1N−1 pipes to transport milk between the NN stalls in his barn (2 \leq N \leq 50,0002≤N≤50,000), conveniently numbered 1 \ldots N1…N. Each pipe connects a pair of stalls,

最大流----F - Flow Problem

#include <iostream> #include <stdio.h> #include <string.h> #include <algorithm> #include <queue> #define N 1e9 using namespace std; queue<int>q; int mapp[200][200]; int flow[200][200]; int a[200]; int p[200]; int n,m; i