【 视觉格式化模型 visual formatting model (详细介绍) 】


1. 视觉/可视化 格式化模型 和 文档树
  • 视觉/可视化 格式化模型 和 文档树:
    • 获取/处理/显示 文档树:
      • 在CSS中,CSS 视觉 格式化模型(visual formatting model)描述了 用户代理 如何获取 文档树,以及 如何处理和显示它。
    • 适用于 连续/分页媒体: 这包括 连续媒体(如 计算机屏幕)和 分页媒体(如通过 浏览器 打印功能 打印的书籍或文档)。
      • 连续媒体( continuous media): 内容 没有间断 的环境,即其 流动性 是连续的。
      • 分页媒体(paged media): 属性 控制打印 或 能够将 内容拆分 成离散页面的 任何其它媒体内容的呈现。

2. 元素和盒子
  • 元素和盒子
    • 根据模型 生成盒子:
      • 在 可视化 格式化模型 中,文档树中 的每个元素 根据 框模型/盒模型, 生成零个或多个框/盒子。
    • 盒子的布局 的 影响因素
      • 盒子的尺寸
        • 精确指定、由约束条件指定 或 没有指定
      • 盒子的类型
        • 行内盒子(inline)、行内级盒子(inline-level)、原子行内级盒子(atomic inline-level)、块盒子(block
      • 定位方案positioning scheme):
        • 普通流定位、浮动定位或绝对定位
      • 文档树中 元素之间的关系
        • 如, 当前盒子的 子元素 或 兄弟元素
      • 外部信息
        • 如 视窗大小、图像的内在尺寸等。
      • 其他的 某些外部因素

3. 盒子和包含块
  • 盒子 和 包含块
    • 渲染盒子:
      • 包含块: 该视觉 格式化模型 会根据 盒子的包含块(containing block)的边界 来渲染盒子。
    • 包含块和溢出:
      • 不受包含块限制: 通常,盒子会创建 一个 包含其后代元素的 包含块,但是盒子 并不由包含块 所限制,当盒子的布局 跑到包含块的外面时 称为溢出(overflow)。

4. 盒子 相关的术语
  • block
    • 独立的区域: 一个抽象的概念,一个块 在文档流上 占据一个 独立的区域
    • 垂直依次排序: 块与块之间, 在垂直方向上 按照顺序 依次堆叠。
  • 包含块containing block
    • 包含 其他盒子的块 称为包含块。

  • 盒子box
    • 生成: 元素⇒ 盒子
      • 根据内容 创建: 一个抽象的概念,由 CSS 引擎 根据 文档中的内容 所创建
    • 用途: 主要用于 文档元素的定位、布局和格式化等用途。
    • 并非一对一:
      • 盒子与元素并不是一 一对应的,有时, 多个元素 会合并生成 一个盒子,有时 一个元素 会生成多个盒子(如 匿名盒子)。

  • 块级元素block-level element
    • 元素的 display : 为 块 block、列表项list-item、表格table 时,该元素 将成为 块级元素。
    • 不用于 格式化: 元素 是否是块级元素 仅是元素本身的属性,并不直接用于 格式化上下文的 创建或布局。
  • 块级盒子block-level box
    • 生成: 块级元素⇒ 块级盒子
      • 块级盒子由 块级元素 生成。
    • 1:1,1:n关系:
      • 一个 块级元素 至少会生成 一个块级盒子,但也有可能 生成多个(例如 列表项list-item元素)。
  • 块容器盒子block container boxblock containing box
    • 块容器盒子= 块级盒子/行内盒子
      • 要么只包含其 它块级盒子
        • 块级盒子≠块容器盒子
          • 有些块级盒子 并不是块容器盒子,比如 表格;
      • 要么只包含 行内盒子 并同时创建一个 行内格式化上下文(inline formatting context)。
      • 块容器盒子, 侧重于 当前盒子 作为“容器”的这一角色
    • 它不参与 当前块的布局和定位,它所描述的仅仅是 当前盒子与其后代之间的关系。
      • 换句话说,块容器盒子 主要用于确定 其子元素的定位、布局等。
  • 块盒子block box
    • 生成: 块级盒子+块容器盒子⇒ 块盒子 (交集)
      • 如果一个 块级盒子 同时也是一个 块容器盒子(见下),则称其为 块盒子。
    • 块盒子分类: 具名块盒子+匿名块盒子
      • 除 具名块盒子 之外,还有一类 块盒子 是匿名的,称为 匿名块盒子(Anonymous block box),匿名盒子 无法被 CSS 选择符选中。
      • 在这里插入图片描述

  • 行内级元素inline-level element
    • display为: inlineinline-blockinline-table的元素 称为行内级元素。
    • 与块级元素一样,元素是否是 行内级元素 仅是元素本身的属性,并不直接用于 格式化上下文的创建或布局。
  • 行内级盒子inline-level box
    • 生成: 行内级元素⇒ 行内级盒子
      • 行内级盒子 由行内级元素生成。
    • 行内级盒子 分类:
      • 行内盒子 原子行内级盒子
      • 区别在于: 该盒子 是否参与 行内 格式化 上下文的创建。
  • 行内盒子inline box
    • 行内盒子 = 行内级盒子+参与格式化
      • 参与 行内格式化 上下文创建的 行内级盒子 称为行内盒子。
    • 与块盒子类似,行内盒子 也分为
      • 具名行内盒子 和 匿名行内盒子(anonymous inline box)两种。
  • 原子 行内级盒子atomic inline-level box
    • 原子 行内级盒子 = 行内级盒子 + 不参与格式化
      • 不参与 行内 格式化上下文创建 的 行内级盒子。
      • 原子行内级盒子一开始叫做 原子行内盒子(atomic inline box),后被修正。
    • 不拆分多行:
      • 原子 行内级盒子的内容 不会拆分成 多行显示。

  • 块和块级的 区分:
    • 盒子分为“块盒子”和“块级盒子”两种
    • 但元素只有“块级元素”,而没有“块元素”。“行内级元素”也是一样。
    • 行内级元素⇒ 行内级盒子

5. 盒子的生成
  • 盒子的生成: 元素 ⇒ 盒子
    • 是 CSS 视觉格式化模型的一部分,用于从 文档元素 生成盒子。
    • 盒子和格式化方法:
      • 盒子有不同的类型,不同类型的盒子 的格式化方法 也有所不同。

  • 盒子的类型: 取决于 CSS display 属性: 元素⇒ 盒子
    • 块级盒子: 块级元素⇒ 块级盒子
      • 块盒子: 块级盒子+块容器盒子⇒ 块盒子
      • 块级元素block-level element
        • 元素的 display : 为 块 block、列表项list-item、表格table 时,该元素 将成为 块级元素。
    • 行内级盒子: 行内级元素⇒ 行内级盒子
      • 行内盒子: 行内盒子 = 行内级盒子+参与格式化
      • 原子 行内级盒子: 原子 行内级盒子 = 行内级盒子 + 不参与格式化
      • 行内级元素inline-level element
        • display为: inlineinline-blockinline-table的元素 称为行内级元素。

5.1 块级元素与 盒子
  • 块级元素与 盒子
    • 当元素的 display: block| list-item |table 时⇒ 块级元素。
    • 块级元素 ⇒ 块 ⇒ 垂直方向依次排列
      • 一个块级元素 会被格式化成 一个块(例如文章的一个段落),默认 按照垂直方向 依次排列。
    • 块级元素 ⇒ 块级盒子⇒ 参与格式化
      • 每个块级盒子 都会 参与 块格式化上下文(block formatting context)的创建
        • ❶ 主块级盒子:
          • 而每个块级元素 都会至少生成一个块级盒子,即 主块级盒子(principal block-level box)。
          • 主块级盒子 包含由 后代元素生成的盒子 以及内容,同时 它也会参与 定位方案。
        • ❷ 列表项 和 多个块级盒子:
          • 有一些元素,比如 列表项 会生成额外的盒子 来放置 项目符号,而那些 会生成 列表项的元素 可能会生成 更多的盒子。不过,多数元素 只生成一个 主块级盒子。

  • 块级盒子 和 块容器盒子 的区别和联系
    • 块级盒子: 由块级元素生成, 强调的是 “块”, 描述了元素 与其父元素和兄弟元素之间 的行为
    • 块容器盒子: 强调盒子是个"容器", 描述了元素 跟其后代之间 的行为。
      • 块容器盒子= 块级盒子/行内盒子
        • 要么只包含其 它块级盒子
        • 要么只包含 行内盒子 并同时创建一个 行内格式化上下文(inline formatting context)。
    • 一个块级盒子, 可能 是/不是 一个块容器盒子。
      • 块级盒子≠块容器盒子
        • 有些块级盒子 并不是块容器盒子,比如 表格;
      • 块容器盒子 ≠ 块级盒子
        • 而有些块容器盒子 也不是块级盒子,比如 非替换行内块 和 非替换 表格单元格。

  • 匿名盒子
    • 匿名盒子 = 不能被 CSS 选择符选中
      • 在某些情况下 进行视觉格式化时,需要添加 一些 增补性的盒子,这些盒子 不能用 CSS 选择符选中,因此称为 匿名盒子(anonymous boxes)。
  • 匿名盒子的属性值
    • CSS 选择器 不能作用于 匿名盒子(anonymous boxes),所以它不能被样式表 赋予样式。也就是说,此时
      • 所有可继承的 CSS 属性值都为: inherit
      • 所有 不可继承的 CSS 属性值都为: initial
  • 匿名块盒子:
    • 块级盒子的前后,没有 被标签包裹的文本, 创建 匿名块盒子。

  • 示例1: <div><p>都保持 默认的样式(即 它们的display: block;
<div>Some inline text <p>followed by a paragraph</p> followed by more inline text.</div>
  • 显示为
    • 在这里插入图片描述
  • 两个 匿名块盒子:块级盒子的前后,没有 被标签包裹的文本
    • 一个是<p>元素 前面的那些文本(Some inline text
    • 另一个是 <p> 元素后面的文本(followed by more inline text.)。此时会 生成下面的块结构:
    • 在这里插入图片描述

5.2 行内级元素 和 盒子
  • 行内级 元素: 一个元素 display: inline| inline-block| inline-table;,则称该元素为 行内级元素。
    • 行内级元素的 显示:
      • 显示时,它 不会生成 内容块,但是 可以与其他行内级内容 一起显示为 多行。
      • 包含 多种格式内容(如 强调文本、图片等)的段落,就可以由 行内级元素组成。

  • 行内级元素 ⇒ 行内级盒子 ⇒ 行内盒子 / 原子 行内级盒子
    • 行内盒子
      • 既是行内级盒子,也是一个 其内容会参与创建其容器的行内格式化上下文的 盒子
      • 比如 所有具有 display:inline 样式的非替换盒子。
    • 原子 行内级盒子
      • 一个行内级盒子的内容 不参与行内格式化上下文的创建,则称其为 原子行内级盒子
      • 而通过 替换行内级元素或 display: inline-block| inline-table; 的元素 创建的盒子 不会像行内盒子一样 可以被拆分为 多个盒子。
        • (一个行内块元素,行内表格,会一直单独占据一个块,不会因为自动换行,换成好几行)
        • 在这里插入图片描述

  • 匿名行内盒子
    • 类似于块盒子,CSS 引擎有时候也会 自动创建 一些行内盒子。
    • 这些行内盒子无法 被 CSS 选择符 选中,因此是匿名的,它们从父元素那里 继承那些可继承的属性,其他属性保持默认值initial
    • 当一个字符串 被一个 内联元素分割时,就会创建 匿名行内盒子.
      • 一个句子 包含一个用 <em> 包装的部分

6. 定位规则
  • 定位规则: 生成盒子 ⇒ 定位 ⇒ 完成布局
    • 一旦生成了盒子 以后,CSS 引擎 就需要定位它们 以完成布局。
    • 定位盒子时 使用的规则:
      • 普通流:按照次序 依次定位 每个盒子
        • 依次放置: 在普通流中,盒子会依次放置。
          • 在块格式化上下文中,盒子在垂直方向 依次排列;
          • 而在行内格式化上下文中,盒子则 水平排列。
        • 普通流: 静态定位 和 相对定位:
          • 当 CSS的 position 属性为 staticrelative,并且 floatnone 时,其布局方式为普通流。
          • 静态定位:
            • 确切位置: 此时每个盒子 根据普通流 所计算出的确切位置 来定位。
          • 相对定位
            • 偏移: 此时每个盒子还会根据 topbottomleftright 属性的值 在其原本所在的位置上 产生指定大小的 偏移。
      • 浮动:将盒子 从普通流中 单独拎出来,将其 放到外层盒子 的某一边
        • ❶ 在浮动定位中,浮动盒子 会浮动到 当前行的开始或尾部位置。
          • 内容流动: 这会导致 普通流中的文本 及其他内容 会“流”到 浮动盒子的边缘处,除非元素通过 clear 清除了 前面的浮动。
        • 静态/相对定位 下的 浮动定位:
          • 一个盒子的 float 值不为 none,并且其 positionstaticrelative 时,该盒子为 浮动定位。
          • 左浮动: 如果将 float: left
            • 浮动盒子 会定位到 当前行盒子的开始位置(左侧)
          • 右浮动: 如果设置float: right
            • 浮动盒子 会定位到当前行盒子的 尾部位置(右侧)。
            • 不管是左浮动 还是右浮动,行盒子 都会伸缩 以适应 浮动盒子的大小
      • 绝对定位:按照 绝对位置 来定位盒子,其位置 根据盒子的包含元素 所建立的绝对坐标系 来计算,因此绝对定位元素 有可能会 覆盖其他元素
        • 从流中移除:
          • 在绝对定位中,盒子会 完全从当前流中 移除,并且不会再与其 有任何联系
            • 此处仅指 定位和位置 计算,而绝对定位的元素 在文档树中 仍然与其他元素有父子或兄弟等 关系)
          • ❷ 其位置会使用 topbottomleftright 相对其包含块 进行计算。
          • ❸ 如果元素的 positionabsolutefixed,该元素为 绝对定位。
            • 对固定位置的元素 来说,其包含块为: 整个视口,该元素 相对视口 进行绝对定位,因此滚动时 元素的位置 并不会改变。

♣ 结束语 和 友情链接

  • 感谢:♥♥♥ 如果这篇文章 对您有帮助的话,可以点赞、评论、关注,鼓励下作者哦,感谢阅读 ~
  • 欢迎指正: 如果发现 有需要 更正的细节问题,欢迎指正,谢谢大家 ~╮( ̄▽ ̄)╭

  • 转载 请评论告知作者 并注明出处 ,Thanks♪(・ω・)ノ
    • 作者:Hey_Coder
    • 来源:CSDN
    • 原文:https://blog.csdn.net/VickyTsai/article/details/103396154
    • 版权声明:本文为博主原创文章,转载 请评论告知作者 并附上博文链接!

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值