包含块(containing block)

  包含块(containing block)是可视化格式模型中得一个重要概念。CSS2中,很多框的位置和尺寸的计算都基于一个被称为包含块的长方形盒子的四边。通常地,生成的框表现为其派生框的包含块;我们说一个框“建立”了它的派生框的包含块。短语“一个框的包含块”意味着“该框所存在的那个包含块”,而不是它所生成的块。

一、包含块的判定与范围

  包含块判定的总流程,一行图就可以说明,这里注明下这张图的来源地址http://w3help.org/zh-cn/kb/008/

  然后根据这张图,我们来一个个的分析。

根元素

  根元素,就是处于文档树最顶端的元素,它没有父节点。

  用户代理(比如浏览器)选择根元素作为包含块(称之为初始包含块)。在(X)HTML中,根元素是html元素(尽管有的浏览器会不正确地使用body元 素)。而初始包含块的direction属性与根元素相同。

static与relative定位元素

  如果该元素的定位为 "relative" 或者 "static",它的包含块由它最近的块级、单元格(table cell)或者行内块(inline-block)祖先元素的内容框创建。元素如果未声明 ‘position‘ 特性,那么就会采用 ‘position‘ 的默认值 "static"。还是结合一个例子来说明下:

<table>
  <tr>
      <td>
          <div>
               <span>
                   <em>txt</em>
                   other txt
              </span>
          </div>
      </td>
  </tr>
</table>
元素   包含块
html 初始包含块
body html
table body
td table
div td
txt div

  块级、单元格(td,th)、行内块,牢牢抓住这几点,上面的表格就不难理解了。td的包含块不是tr,因为tr不属于这三种;txt的包含块是div,因为em也不属于这三种。

fixed定位元素

  如果元素是fixed定位元素,那么它的包含块是当前可视窗口(viewport)。

absolute定位元素

  absolute这个元素相信大家用得比较多也比较熟悉了,我们在这里不会细致去谈它的表现和用处,这些东西会在这个系列文章的绝对定位这一节中具体去分析。我们在这里只讨论绝对定位元素的包含块。

  总得来说,绝对定位元素的包含块由离它最近的 ‘position‘ 属性为 ‘absolute‘、‘relative‘ 或者 ‘fixed‘ 的祖先元素创建,也就是非static祖先元素。但是如果当这个祖先元素为行内元素的时候,包含块就要取决于祖先元素的direction元素了。下面我们结合例子具体说明。

  1.非static祖先元素不为行内元素时,absolute元素的包含块由这个非static祖先元素的padding edge来生成。(什么是padding edge可以看下面一张图)

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title>absolute定位</title>
    <style>
        div{position:absolute; left: 50px; top:50px;}
    </style>
</head>
<body>
    <table>
      <tr>
          <td>
              <div>
                   <span>
                       <em>txt</em>
                       other txt
                  </span>
              </div>
          </td>
      </tr>
    </table>
</body>
</html>

  如上,就是前面一个例子,不过我们对div设置了position:absolute,这样,div的包含块不再是body,而变成了初始包含块,这里也就是html,因为div没有其他非static的定位祖先元素了。

  如果我们给上面的例子加上下面的style:

  div{position:absolute; left:50px; top:50px;}

  em{position:absolute; left:100px; top:100px;}

  那么包含块的关系就变成下面这样了:

  

元素   包含块
html 初始包含块
body html
table body
td table
div 初始包含块
em div
txt em

  注意几个变化,em与txt,em是因为它的祖先元素中有div这个非static定位元素,txt是因为现在em是块级元素了。

  2.下面,我们来结合例子谈谈非static祖先元素为行内元素时,absolute元素的包含块是怎么一个表现。

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

  

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title>direction:ltr</title>
</head>
<body>
    <p style="border:1px solid red; width:200px; padding:20px;">
        T
        <span style="background-color:#C0C0C0; position:relative; border:1px red solid;">
          这段文字从左向右排列,红 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>
    <p style="border:1px solid red; width:200px; padding:20px;">
        TEXT TEXT TEXT
        <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>
</body>
</html>

  看了这张图应该一目了然了。以上代码中,文字采取默认从左到右的方式排列。红 XX 和 蓝 XX 和黄 XX 都是绝对定位元素,它的包含块是相对定位的 SPAN。 它们定位需要参照包含块,按照标准来说,它们包含块的左顶边是 SPAN 形成的第一个框的顶、左内边距边,包含块的右、下边是 SPAN 生成的最后一个框的右、下内边距边界。

  包含块的宽度可能是负的。如上面例子里的第二个p,包含块的边界无法围成一个区域,在这种情况下,包含块的宽度是负的。

  

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

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title>direction:rtr</title>
</head>
<body>
    <p style="border:1px solid red; width:200px; padding:20px; direction:rtl;">
        T
        <span style="background-color:#C0C0C0; position:relative; border:1px red solid;">
          这段文字从左向右排列,红 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>
</body>
</html>

 

  同样很清晰了。

  不过有一点要注意,行内元素内形成的包含块,在各浏览器中各不相同,存在兼容性问题。这个大家可以具体去测试一下。

二、总结

  其实包含块这个在标准中是放在可视化格式模型细节这一章来讲的,但是考虑到这个系列很多地方用到了这个概念,还是在这里先提一下。然后包含块这个概念涉及到宽高度的自动、absolute元素定位和float定位的很多问题,是很重要也是值得去了解的。这篇文章成文比较仓促,很多细节还没完善,后续会继续完善,也不排除有遗漏盒错误,如有发现还请指正。

参考资料:

  1.http://w3help.org/zh-cn/kb/008/

  2.http://www.w3.org/TR/2011/REC-CSS2-20110607/visudet.html#containing-block-details

时间: 2024-11-05 00:24:19

包含块(containing block)的相关文章

包含块( Containing block ) 转自W3CHelp

包含块简介 在 CSS2.1 中,很多框的定位和尺寸的计算,都取决于一个矩形的边界,这个矩形,被称作是包含块( containing block ). 一般来说,(元素)生成的框会扮演它子孙元素包含块的角色:我们称之为:一个(元素的)框为它的子孙节点建造了包含块.包含块是一个相对的概念. <div> <table> <tr> <td>hi</td> </tr> </table> </div> 以上代码为例,DI

[转]包含块( Containing block )

原文链接:KB008: 包含块( Containing block ) - W3Help 包含块简介 在 CSS2.1 中,很多框的定位和尺寸的计算,都取决于一个矩形的边界,这个矩形,被称作是包含块( containing block ). 一般来说,(元素)生成的框会扮演它子孙元素包含块的角色:我们称之为:一个(元素的)框为它的子孙节点建造了包含块.包含块是一个相对的概念. <div> <table> <tr> <td>hi</td> <

CSS2.1SPEC:视觉格式化模型之包含块

原汁原味的才是最有味道的,在阅读CSS标准时对这一点的体会更加深刻了,阅读文档后的一大感觉就是很多看上去理所应当的样式表现也都有了对应的支持机制.本文首先从包含块写起,一方面总结标准中相应的阐述,并且结合具体的实例进行具体分析,特别是对于CSS2.1支持并不完善的IE6/7.由于经验尚浅,文中肯定存在一些问题,希望大家可以多多包涵并且指出问题. 阅读本文前,应当对于CSS盒模型以及视觉格式化模型中会产生的各种框(box,也可以成为盒子)以及各种不同的布局方式有比较准确的认识,可以阅读杜瑶大神的两

CSS3包含块及其定位判定

每次布局总会被搞糊涂,于是上网上找到了这个文章,讲的很详细,转载过来 原文链接: > http://w3help.org/zh-cn/kb/008.html 包含块简介 在 CSS2.1 中,很多框的定位和尺寸的计算,都取决于一个矩形的边界,这个矩形,被称作是包含块( containing block ). 一般来说,(元素)生成的框会扮演它子孙元素包含块的角色:我们称之为:一个(元素的)框为它的子孙节点建造了包含块.包含块是一个相对的概念. <div> <table> &l

包含块的分离与显示

1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8" /> 5 <title>包含块的显示</title> 6 <style type="text/css"> 7 8 9 #div1{ 10 width: 100px; 11 height: 100px; 12 background-color: red; 13 pos

通过案例学调优之--Oracle数据块(block)

数据块概述Oracle对数据库数据文件(datafile)中的存储空间进行管理的单位是数据块(data block).数据块是数据库中最小的(逻辑)数据单位.与数据块对应的,所有数据在操作系统级的最小物理存储单位是字节(byte).每种操作系统都有一个被称为块容量(block size)的参数.Oracle每次获取数据时,总是访问整个数(Oracle)数据块,而不是按照操作系统块的容量访问数据. 数据库中标准的数据块(data block)容量是由初始化参数 DB_BLOCK_SIZE 指定的.

由position属性引申的关于css的进阶讨论(包含块、BFC、margin collapse)

写这篇文章的起因是源于这篇文章:谈谈面试与面试题 中关于position的讨论,文中一开始就说的这句话: 面试的时候问个css的position属性能刷掉一半的人这是啥情况…… 其实这问题我本来打算的是可以顺着一路扯到normal flow.containing block.bfc.margin collapse,base line,writing mode,bidi,这样一路问下去的,奈何第一个问题(亲我真的只问了position有哪些取值和行为啊)就悲剧了…… 说到position,那么稍微

&lt;p&gt;&lt;/p&gt;标签为什么不能包含块级标签?还有哪些特殊标签?

最近,在码代码的时候,就是下面的这段代码,我犯了一个很不起眼,但犯了就致命的BUG. <body> <p> <ol> <li>Hello</li> </ol> </p> <div>How are you?</div> </body> <script src="jquery-3.1.1.js"></script> <script> v

css绝对定位中的初始包含块问题

在css的绝对定位问题中如果绝对定位的元素没有最近已定位的父元素,那么它相对与初始包含块进行定位.其中初始包含块是是呢?body? html? viewport? 如图所示: <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />