032. CSS 包含块(containing block)

包含块:指元素最近的祖先块元素(inline-block, block 或 list-item 元素)的内容区

包含块的影响

元素的尺寸及位置,常常会受它的包含块所影响。

width, height, padding, marginleftrighttopbottom 等属性,当其值为百分比时,元素的这些值,就是通过包含块计算得出。

如何确定元素的包含块?

确定一个元素的包含块的过程完全依赖于这个元素的 position 属性:

  • 如果 position 属性为 staticrelativesticky,包含块可能由它的最近的祖先块元素的内容区的边缘组成,也可能会建立格式化上下文。

  • 如果 position 属性为 absolute ,包含块就是由它的最近的 position 的值不是 static (也就是值为 fixed, absolute, relativesticky)的祖先元素的内边距区的边缘组成。

  • 如果 position 属性是 fixed,在连续媒体的情况下(continuous media)包含块是 viewport ,在分页媒体(paged media) 下的情况下包含块是分页区域(page area)。

  • 如果 position 属性是 absolutefixed,包含块也可能是由满足以下条件的最近父级元素的内边距区的边缘组成的:

    • transform 或 perspective 的值不是 none
    • will-change 的值是 transformperspective
    • filter 的值不是 none 或 will-change 的值是 filter(只在 Firefox 下生效).
    • contain 的值是 paint (例如: contain: paint;)

通过包含块计算元素属性的百分比值

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

  • 要计算 height top 及 bottom 中的百分值,是通过包含块的 height 的值。如果包含块的 height 值会根据它的内容变化,而且包含块的 position 属性的值被赋予 relative 或 static ,那么,这些值的计算值为 auto。

  • 要计算 width, left, right, padding, margin 这些属性由包含块的 width 属性的值来计算它的百分值。

<body>
  <section>
    <p></p>
  </section>
</body>

例 1

section {
  display: block;
  width: 400px;
  height: 160px;
  background: lightgray;
}

p {
  width: 50%; /* == 400px * .5 = 200px */
  height: 25%; /* == 160px * .25 = 40px */
  margin: 5%; /* == 400px * .05 = 20px */
  padding: 5%; /* == 400px * .05 = 20px */
  background: cyan;
}

例 2

section {
  display: inline;
  background: lightgray;
}

p {
  width: 50%; /* == body 宽度的一半 */
  height: 200px; /* 使用百分比将会计算为 0 */
  background: cyan;
}

例 3

section {
  position: absolute;
  left: 30px;
  top: 30px;
  width: 400px;
  height: 160px;
  padding: 30px 20px;
  background: lightgray;
}

p {
  position: absolute;
  width: 50%; /* == (400px + 20px + 20px) * .5 = 220px */
  height: 25%; /* == (160px + 30px + 30px) * .25 = 55px */
  margin: 5%; /* == (400px + 20px + 20px) * .05 = 22px */
  padding: 5%; /* == (400px + 20px + 20px) * .05 = 22px */
  background: cyan;
}

例 4

section {
  width: 400px;
  height: 480px;
  margin: 30px;
  padding: 15px;
  background: lightgray;
}

p {
  position: fixed;
  width: 50%; /* == (50vw - (width of vertical scrollbar)) */
  height: 50%; /* == (50vh - (height of horizontal scrollbar)) */
  margin: 5%; /* == (5vw - (width of vertical scrollbar)) */
  padding: 5%; /* == (5vw - (width of vertical scrollbar)) */
  background: cyan;
}

例 5

section {
  transform: rotate(0deg);
  width: 400px;
  height: 160px;
  background: lightgray;
}

p {
  position: absolute;
  left: 80px;
  top: 30px;
  width: 50%; /* == 200px */
  height: 25%; /* == 40px */
  margin: 5%; /* == 20px */
  padding: 5%; /* == 20px */
  background: cyan;
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一个元素的大小和位置都受其父级元素的影响。通常来说,包含块是一个元素最近的块级父级的内容区域,不过也有一些例外的情...
    看穿一切的我阅读 173评论 0 0
  • 建议直接阅读官方文档: https://developer.mozilla.org/zh-CN/docs/Web/...
    good__day阅读 349评论 0 0
  • 文档流 文档流处在网页的最底层,它表示的是一个页面中的位置, 我们所创建的元素默认都处在文档流中元素在文档流中的特...
    fb941c99409d阅读 476评论 0 0
  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,816评论 1 92
  • 夜莺2517阅读 127,761评论 1 9