包含块(containing block)

什么是包含块?

MDN 定义:一个元素的尺寸和位置经常受其 包含块(containing block)的影响。大多数情况下,包含块就是这个元素最近的祖先块元素的内容区域,但也不是总是这样

包含块(containing block)就是元素用来计算和定位一个的框。如:width: 50%,那到底是哪个 “元素” 宽度的一半呢?其实,这个 “元素” 实际上就是指的包含块

包含块的影响

元素的尺寸及位置,常常会受它的包含块所影响。对于一些属性,例如 width、height、padding、margin,绝对定位元素的偏移值 position 被设置为 absolute 或 fixed,当我们对其赋予百分比值时,这些值的计算值,就是通过元素的包含块计算得来。

确定包含块

确定一个元素的包含块的过程完全依赖于这个元素的 position 属性:
元素如果未声明 position 特性,那么就会采用 position 的默认值 static
如果没有找到符合条件的祖先元素则包含块是 “初始化包含块”

备注: 根元素 <html> 所在的包含块是一个被称为 初始包含块 的矩形。其尺寸等同于浏览器可视窗口大小

  1. 如果 position 属性为 staticrelative sticky,包含块可能由它的最近的祖先块元素(比如说 inline-block, block 或 list-item 元素)的内容区的边缘组成,也可能会建立格式化上下文 (比如说 a table container, flex container, grid container, 或者是 the block container 自身)。
  2. 如果 position 属性为 absolute ,包含块就是由它的最近的 position 的值不是 static (也就是值为fixed, absolute, relativesticky)的祖先元素的内边距区的边缘组成。
  3. 如果 position 属性是 fixed,则包含块是 “初始化包含块”
  4. 如果 position 属性是 absolutefixed,包含块也可能是由满足以下条件的最近父级元素的内边距区的边缘组成的:
  • transform 或 perspective 的值不是 none
  • will-change 的值是 transformperspective
  • filter 的值不是 nonewill-change 的值是 filter(只在 Firefox 下生效)
  • contain 的值是 layoutpaintstrictcontent(例如:contain: paint;
  • backdrop-filte 的值不是 none(例如:backdrop-filter: blur(10px);

备注: perspective 和 filter 属性对形成包含块的作用存在浏览器之间的不一致性

根据包含块计算百分值

如上所述,如果某些属性被赋予一个百分值的话,它的计算值是由这个元素的包含块计算而来的。这些属性包括盒模型属性和偏移属性:

  1. 要计算 heighttopbottom 中的百分值,是通过包含块的 height 的值。如果包含块的 height 值会根据它的内容变化,而且包含块的 position 属性的值被赋予 relativestatic ,那么,这些值的计算值为 auto
  2. 要计算 widthleftrightpaddingmargin 这些属性由包含块的 width 属性的值来计算它的百分值
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 包含块:指元素最近的祖先块元素(inline-block, block 或 list-item 元素)的内容区。 ...
    Iwtem阅读 269评论 0 0
  • 一个元素的大小和位置都受其父级元素的影响。通常来说,包含块是一个元素最近的块级父级的内容区域,不过也有一些例外的情...
    看穿一切的我阅读 173评论 0 0
  • 定义 css中,定位一个元素需要计算其和另外一个矩形区域的相对位置,这个矩形区域就是该元素的包含块。一般来讲,一个...
    狐尼克朱迪阅读 1,738评论 0 1
  • 建议直接阅读官方文档: https://developer.mozilla.org/zh-CN/docs/Web/...
    good__day阅读 349评论 0 0
  • 文档流 文档流处在网页的最底层,它表示的是一个页面中的位置, 我们所创建的元素默认都处在文档流中元素在文档流中的特...
    fb941c99409d阅读 476评论 0 0