包含塊(containing block)
包含塊可以理解為盒子的參考系。盒子的尺寸和位置,會受它的包含塊所影響。對於一些屬性,例如 width, height, padding, margin,絕對定位元素的偏移值top,bottom,left,right,當我們對其賦予百分比值時,這些值的計算值,就是透過元素的包含塊計算得來。在 CSS 規範中也是明確書寫了的:https://drafts.csswg.org/css2/#containing-block-details
初始包含塊(initial containing block)
根元素(HTML 元素)所在的包含塊,被稱之為初始包含塊。對於瀏覽器而言,初始包含塊的大小等於視口 viewport 的大小,基點在畫布的原點(視口左上角)。
resize會改變初始包含塊,滾動不會。
包含塊判定
- 常規流盒子,浮動盒子,固定定位盒子與粘性定位盒子,它們的包含塊是離它最近的祖先塊容器(block container)的內容盒(content area)。
- 固定定位盒子的包含塊為視口。(與初始包含塊不同)
- 絕對定位盒子的包含塊是它祖先中最近的定位元素的填充盒(padding盒),如果找不到定位元素則其包含塊為初始包含塊。
其他特殊情況(平移,透視,渲染邊界,火狐的濾鏡)
對於絕對定位盒子與固定定位盒子,包含塊也可能是由滿足以下條件的最近父級元素的填充盒組成的:
- transform 或 perspective 的值不是 none
- will-change 的值是 transform 或 perspective
- contain 的值是 paint (例如: contain: paint;)
- filter 的值不是 none 或 will-change 的值是 filter(只在 Firefox 下生效).