学习CSS视觉格式化模型,你需要掌握这些知识

本文主要是学习CSS的视觉格式化模型visual formatting model(视觉格式化模型),它是一种处理文档并把它显示在可视化媒体上的算法。这是CSS中的一个基础概念。visual formatting model把文档的每一个元素转换成0个,1个或多个符合CSS盒模型的盒子,每个盒子的布局内容包括如下部分:

. 盒子尺寸:明确指定受限制或不指定

. 盒子类型:行内,行内级,原子行内级,块盒

. 定位方案:包括正常文档流,float或者绝对定位

. 节点树的其他元素:其子元素或兄弟元素

. viewport(视口)的尺寸和定位

. 内含图片的固有尺寸

. 其他额外信息

视口(viewport)

用户代理,如浏览器通常提供给用户一个viewport(屏幕上的一个窗口或其他可视区域),通过该viewport用户可以访问到一个文档,在viewport尺寸变化时,用户代理可以改变文档的布局。

滚动(scroll)

当viewport宽度或高度小于渲染文档的画布时,默认地,用户代理会提供一个滚动机制。

包含块(containing block)

在CSS2.1中,许多盒子的定位和尺寸是根据一个矩形盒子的边界来计算的,这个矩形盒子就叫做包含块(containing block)。通常,一个盒子为其子级盒子创建包含块,我们就可以说这个盒子为其后代创建一个包含块。

初始包含块(initial containing block)

文档根元素所在的矩形包含块就是初始包含块,对于浏览器等媒体,其尺寸等于viewport尺寸并且被固定在画布,其direction属性值和根元素一样。

溢出(overflow)

visual formatting model相对于包含块的边界来渲染盒子,然而一个盒子并不受其包含块限制,当一个盒子的内容超出其包含块时,就是我们通常所说的溢出(overflow)。

盒子的生成

CSS visual formatting model从文档元素生成盒子,生成的盒子有多种类型,其类型会影响visual formatting model的行为。生成盒子的类型取决于元素CSS属性display的值。

块级元素和块级盒

当元素的CSS属性display计算值是block,list-item或table的时候,这个元素就是块级元素。一个块级元素会被视觉格式化成一个块(block),按照垂直方向排列。

主要块级盒(principal block-level box)

每个块级元素(block-level element)至少生成一个块级盒子,即主要块级盒,大多数元素只生成一个主要块级盒,而有一些元素,如li列表,则会生成多个盒子,包括主要块级盒及描述排版信息或项目符号的其他盒子。

主要块级盒包括包括后代元素生成的盒子及生成的内容,我们可以使用之前谈到的定位方案定位该盒子。

块容器盒(block container box)

块容器盒只包含其他块级盒或生成一个行内格式化上下文,即只包含行内盒。我们必须明白块级盒和块容器盒两个概念不冲突。块级盒描述盒子与它的父级和兄弟元素之间的行为,块容器盒描述它与其后代元素之间如何相互作用。块级盒也可能是一个块容器盒。一些块级盒,比如表格,不是块级容器盒;相反地,一些块级容器盒,比如非置换行内块和非置换表格单元格也不是块级盒。

块级盒与块盒

块级盒中也是块容器盒的盒子,是块盒(block box)。

匿名块盒

在某些情况下,visual formatting model 需要添加一些辅助性盒子,但是CSS选择器不能选中这些盒子,这些盒子叫做匿名盒子(anonymous box).

不能使用CSS选择器选择匿名盒子,说明不能给他们定义样式,这意味着所有可继承属性都继承自父元素,所有不可继承属性都是其初始值。

匿名块盒实例

. 1.一种情况是块级盒子与行内级盒子同时存在是,在行内级元素周围会形成匿名块盒。

块容器盒只能包含块级盒或行内级盒,但是,通常在一个文档中,包含这两种类型盒子,此时,在行内级盒子前后创建匿名块盒。

<div>我是第一个匿名块盒的内容<p>我是块级盒子的内容</p>我是第二个匿名块盒的内容</div>

效果如下:

上例中,在div块盒中,产生了一个p块级盒,两个匿名块级盒,一个是包裹p元素前的行内文本,盒模型结构如下:

对于p块级盒,我们可以通过CSS属性改变它的字体大小/颜色,背景色等样式;然而我们并不能控制两个匿名块级盒的样式,其可继承样式属性继承自其父元素div,比如字体的颜色(color),其他不可继承属性则被设置成初始值,比如背景色(background-color),通常该值的初始值是transparent(透明),这也是为什么在初始值时,我们能看见div的背景色。

. 2.另一种产生匿名块盒的情况是一个行内盒包含一个或多个块盒

当一个行内盒只包含一个块盒时,包含块盒的盒子会被分成两个行内盒子,分别在被包含块盒的前后。

被包含块盒前后的行内盒子都会包裹在一个匿名块盒中,所以被包含块盒就与包含行内元素的匿名块盒成了兄弟级盒子。

若包含多个块盒,且块盒之间没有行内内容,就只会在所有块盒的前面和后面分别产生一个匿名块盒。

如下实例p元素display为inline,span元素display属性值为block:

<p style="display: inline;">我是第一个匿名块盒的内容 <span style="display: block;">我是块级盒子的内容</span>我是第二个匿名块盒的内容</p>

效果如下:

这个实例会产生两个匿名块盒,一个是包裹span元素前面的行内文本,一个包裹span元素后面的文本,盒结构如下:

行内级元素和行内级盒

当一个元素的CSS display属性计算值是inline或inline-block或inline-table时,这个元素就是行内级元素。行内级元素不包含块内容,它和其他行内级内容分布在一行内,直至超出换行,典型的比如段落,通常由图片,文字等行内级元素组成。

行内级盒与行内盒

行内级盒中,有些盒子其内容参与其容器的行内格式化上下文,这些行内级盒子,就是行内盒子。

所有的display值为inline的非置换盒子都是行内盒。

原子行内级盒(atomic inline-level box)

行内级盒中,那些内容不参与形成行内格式化上下文的盒子,称为原子行内级盒子;由置换行内级元素或display计算值为inline-block或inline-table的元素产生;原子行内级盒不会被分割成多个盒子。在一行宽度足够显示其内容时,原子行内级盒内容不会被拆分成多行。

如下,span的display属性值为inline,即其默认值时,其形成的盒子不是原子行内级盒,因此会被拆分成多行:

<div style="width:18em;">

对于非原子行内级盒 <span style="display: inline;color: red;">我的内容会被拆分成多行    </span> 因为这里的span是inline行内盒.

</div>

效果如图:

而对于如下,将span元素display设置成inline-block;

<div style="width:18em;">对于原子行内级盒 <span style="display: inline-block;color: red;">我的内容不可以被拆分成多行</span> 因为这里的span是inline-block行内级盒.

</div>

效果如图:

匿名行内盒(anonymous inline box)

类似于上文说到的块盒,有时候CSS引擎也会自动创建行内盒,这些行内盒子不能使用CSS选择器选中,不能被命名,它们的可继承CSS属性值继承自父级元素,不可继承属性则是初始值,这就是匿名行内盒。

创建匿名行内盒,最常见的情况就是,某些文本作为一个块盒的直接子级,创建一个行内格式化上下文,这种情况下,文本就包含在匿名行内盒中。特别需要注意的是,即使是空格组成的文本也会生成匿名行内盒,除非我们使用white-space属性将空白内容清除。

其他类型的盒子

行盒

行盒是行内格式化上下文创建来表示一行文本。在一个块盒中,一个行盒从块盒的某一边框扩展到另一边框。当使用了float定位时,行盒从左浮动的最右边框扩展到右浮动的最左边框。行盒只是一种技术上的实现,通常并不需要我们进行操作。

插入盒(Run-in box)

插入盒,使用display:run-in;定义,可能是块盒也可能是行内盒,取决于其后续盒子的类型。最典型的应用场景是在文章的第一段中定义文章的标题。由于可操作性不足,Run-in box在CSS2.1中被移除,但也可能在后续版本重新出现,可以了解一下。

内容模型(content model)

内容模型,由元素类型及其内容布局触发,除了前文提到的行内和块级格式化上下文,CSS还定义了其他的内容模型,这些模型用来描述特定的内容布局,也可能会创建其他类型盒子:

. 表格内容模型:可能创建一个表格容器盒和一个表格盒,也可能创建标题caption盒

. 多列内容模型:可能在容器盒子和内容之间创建多个列盒

. 实验性的grid或flex盒子内容模型,也可能创建其他类型的盒子

一旦创建了盒子,CSS引擎就会使用以下某一种算法进行布局定位:

. 1.普通流定位,默认按从上到下,从左到右的顺序一个接一个的放置盒子

. 2.float浮动定位,使盒子脱离普通流,将盒子放置在包含盒的两边。

. 3.绝对定位,使用包含盒创建的绝对坐标系统定位盒子,绝对定位的盒子是会层叠覆盖的。

普通流

在普通文档流中,盒子是一个接一个排版。在块级格式化上下文中,它们按垂直方向排列,在行内格式化上下文中,按水平方向排列。当元素的position属性值是stati或relative时,触发普通流定位。

float浮动

在float浮动定位中,浮动盒子会被放置在当前行的首尾两端。float定位会导致普通流中的内容沿着浮动盒子的边界排列,除非使用clear属性等方法清除浮动影响。

绝对定位

在绝对定位中,盒子完全脱离普通文档流,不再发生影响。绝对定位使用相对于其包含盒的top,bottom,lefl,right属性定位。position属性值为absolute或fixed的元素是绝对定位元素,fixed定位元素包含块是viewport,其相对于viewport视口进行定位。

关于CSS的视觉格式化模型就介绍到这,下一篇,计划总结一下CSS盒子模型相关知识,希望能给读者有所帮助。

文章来源:惊鸿三世的博客

时间: 2024-10-21 20:51:02

学习CSS视觉格式化模型,你需要掌握这些知识的相关文章

CSS2.1SPEC:视觉格式化模型之包含块

原汁原味的才是最有味道的,在阅读CSS标准时对这一点的体会更加深刻了,阅读文档后的一大感觉就是很多看上去理所应当的样式表现也都有了对应的支持机制.本文首先从包含块写起,一方面总结标准中相应的阐述,并且结合具体的实例进行具体分析,特别是对于CSS2.1支持并不完善的IE6/7.由于经验尚浅,文中肯定存在一些问题,希望大家可以多多包涵并且指出问题. 阅读本文前,应当对于CSS盒模型以及视觉格式化模型中会产生的各种框(box,也可以成为盒子)以及各种不同的布局方式有比较准确的认识,可以阅读杜瑶大神的两

学习CSS布局 - 盒模型

盒模型 在我们讨论宽度的时候,我们应该讲下与它相关的另外一个重点知识:盒模型. 当你设置了元素的宽度,实际展现的元素却超出你的设置: 这是因为元素的边框和内边距会撑开元素. 看下面的例子,两个相同宽度的元素显示的实际宽度却不一样. 看看代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>盒模型</title

视觉格式化模型

CSS的一种机制,它规定了页面中的多个盒子如何布局,html中的每个元素都会在页面中生成盒子 划分页面区域时几乎都是使用的块盒 视口 可视窗口,通常指浏览器的可视区域 当网页内容的尺寸超过视口尺寸时,浏览器会出现滚动条 包含块:每个元素都有一个包含块,它指元素在页面中摆放的区域,通常情况下,元素的包含块是它父元素的内容盒 原文地址:https://www.cnblogs.com/panpan-/p/8452816.html

前端学习——css(初级)

1.Css盒模型(box model) web开发中,html的每个元素都是盒子,盒子可以装内容(content).可以有填充物(padding).有外壳(border) 和 外保护层(margin) .下图为控制台中的盒子详解:浏览器的控制台是我们了解一个元素最好的一个工具,下图可以清晰的看出一个盒子所拥有的属性. 元素的实际宽高 上图可清晰的看出 元素实际的宽=border-left+padding-left+元素内容宽+padding-right+border-right 元素实际的高=b

CSS弹性盒子模型

<!-- # 用于学习css弹性盒子模型 - 是一种一维的布局模型.给flexbox的子元素之间提供了强大的空间分布和对齐能力 - display:flex 设置为弹性盒子 - flexbox内flex元素的默认属性 - 元素排列为一行 (flex-direction 属性的初始值是 row). - 元素从主轴的起始线开始. - 元素不会在主维度方向拉伸,但是可以缩小. - 元素被拉伸来填充交叉轴大小. - flex-basis 属性为 auto. - flex-wrap 属性为 nowrap.

CSS之盒子模型

盒子模型在CSS中是个很重要的概念.它是CSS可视化格式化系统的基石.盒子模型可以用于元素定位和网页布局.根据CSS盒子模型的规定,每个元素(不管是内嵌元素还是块级元素)都会产生一个矩形盒子围绕在元素内容之外.这个盒子我们称之为元素盒.当然还有其他盒子,这里我们主要说说元素盒. 下面是一张盒子模型的示意图: 从上图我们不难看出一个完整的盒子包括:内容(content).填充(padding).边框(border).边界(margin) 那我们来分别说说上面这四个部分. 首先是内容content

CSS之盒子模型与面向对象

从接触B/S到今天才三天,学习了二十几集的牛腩,在web设计的时候学到了CSS的盒子模型,感觉这个东西是真的好,一个简单的盒子理论就把一个网页设计的全部概括了,简直是抽象的一个杰出代表,这里就把自己对盒子的认识写出来,看完后相信大家会觉得盒子其实也就那么回事. 什么叫盒子 说到盒子,鞋盒,饭盒,总之是装东西的东西,所以在web中,他也是指装东西的一个容器. 盒子和OOP的比较 说道web盒子,我们先给大家一些名词:内容(content).填充(padding).边框(border).边界(mar

css知多少(2)——学习css的思路

两周之前写过该系列的第一篇,其实当时只是一个想法,这段时间迟迟未更新,是在思考一个解决过程.现在初有成效,就开更吧. 1. 一个段子 开题不必太严肃,写博客也不像写书,像聊天似的写东西是最好的表达方式. 记得之前看过一个段子,也可能是一件真事儿,这不重要.大体内容如下:一个香港的教授说:我们香港的大学和大陆的大学差的很远啊,大陆的大学连看门保安都懂得哲学,因为当你想要进入校园时,保安都会问你一个很哲学的问题“你是谁,你从哪里来,你到哪里去?”. 看完段子的第一反映肯定是很自嘲的笑了,笑了之后就忘

深入理解CSS系列(一):理解CSS的盒子模型

接触前端也有好几个年头了,但是,讲实话,对于CSS的理解真的是不敢恭维,相信很多同行也有类似的感受吧!这是为什么呢?因为我们都认为CSS太简单了,没有必要深入学习,果真如此?其实,只不过是自己图样图森破罢了.如果真的那么简单,为什么经常会遇到一些奇怪的样式问题,而要折腾好长时间呢?就是因为无从下手,终究还是基础不扎实啊!最近打算深入的学习一下CSS,以便遇到问题时,才知道如何下手,从而迅速的对症下药."深入理解"只是相对于我个人而言的哈,如果有大神觉得不够深入,请不喜勿喷.这是深入理解