包含块( Containing block )

包含块

包含块是Css可视化模型一个重要的概念。很多理论性知识都跟包含块有关,比如,宽度高度自动值的计算,浮动元素的定位,绝对定位元素的定位等等。

一般来说,(元素)生成的框会扮演它子孙元素包含块的角色;我们称之为:一个(元素的)框为它的子孙节点建造了包含块。

包含块判定及其范围

根元素

文档最顶端的元素,它没有父元素。它所在的包含块是被称为“初始包含块”(initial containing block)。

static和relative定位元素

如果元素的position为relative或者static,那么它的包含块由最近的块级、单元格、行内块祖先元素的内容框创建。

fixed定位元素

如果元素position:fixed,那么它的包含块是当前可视窗口。

absolute定位元素

祖先元素是块级元素:绝对定位的元素的包含块是由它最近的position为absolute,relative,fixed的祖先元素创建。

祖先元素是行内元素:包含块取决于祖先元素的"direction"特性。

1.如果 'direction' 是 'ltr',包含块的顶、左边是祖先元素生成的第一个框的顶、左内边距边界(padding edges) ,右、下边是祖先元素生成的最后一个框的右、下内边距边界(padding edges)

示例代码:

<p style="border:1px solid red; width:200px; padding:20px;">
T
<span style="background-color:#C0C0C0; position:relative;">
        这段文字从左向右排列,红 XX 和 蓝 XX 和黄 XX 都是绝对定位元素,它的包含块是相对定位的SPAN。 可以通过它们绝对定位的位置来判断它们包含块的边缘。
        <em style="position:absolute; color:red; top:0; left:0;">XX</em>
        <em style="position:absolute; color:yellow; top:20px; left:0;">XX</em>
        <em style="position:absolute; color:blue; bottom:0; right:0;">XX</em>
</span>
</p>

示意图:

2.如果 'direction' 是 'rtl',包含块的顶、右边是祖先元素生成的第一个框的顶、右内边距边界 (padding edges) ,左、下边是祖先元素生成的最后一个框的左、下内边距边界 (padding edges)

示例代码:

<p style="border:1px solid red; width:200px; padding:20px; direction:rtl;">
T
<span style="background-color:#C0C0C0; position:relative;">
     这段文字从右向左排列,红 XX 和 蓝 XX 和黄 XX 都是绝对定位元素,它的包含块是相对定位的SPAN。可以通过它们绝对定位的位置来判断它们……
    <em style="position:absolute; color:red; top:0; left:0;">XX</em>
    <em style="position:absolute; color:yellow; top:20px; left:0;">XX</em>
    <em style="position:absolute; color:blue; bottom:0; right:0;">XX</em>
</span>
</p>

示意图:

其他情况下,如果祖先元素不是行内元素,那么包含块的区域应该是祖先元素的内边距边界

示例代码:

<div id="container" style="padding:50px; background-color:#c0c0c0; position:relative; width:200px; height:200px;">
<div id="div1" style="width:100%; height:100%; border:2px solid blue;">
    <div id="content" style="border:1px solid red; position:absolute; left:0; top:0;">absolute element</div>
</div>
</div>

以上代码中,content 的父元素虽是 div1,但,按照标准它的包含块应该是 container。

原文请查看 KB008: 包含块( Containing block )

0 条评论