Containing Block(包含块模型)

定义

css中,定位一个元素需要计算其和另外一个矩形区域的相对位置,这个矩形区域就是该元素的包含块。一般来讲,一个元素生成的矩形框扮演其子孙元素的包含块角色。

The position and size of an element’s box(es) are sometimes calculated relative to a certain rectangle, called the containing block of the element.
一个元素其盒子的位置和大小是参照一个特定的矩形框计算得到的,这个矩形框被称为这个元素的包含块。

界定

包含块的界定如下:

  1. 根元素的包含块称为初始包含块,通常它的大小就是可视区域的大小。

The containing block in which the root element lives is a rectangle called the initial containing block. For continuous media, it has the dimensions of the viewport and is anchored at the canvas origin; it is the page area for paged media. The ‘direction’ property of the initial containing block is the same as for the root element.

  1. 位置属性设置为static或者relative的其他元素,它的包含块就是最近祖先的箱子模型中的内容区域(不论其父元素是行内元素还是块级元素)。

For other elements, if the element’s position is ‘relative’ or ‘static’,the containing block is formed by the content edge of the nearestblock container ancestor box.

  1. 元素的positionfixed,那么该元素脱离HTML文档,其包含块为当前屏幕的可视窗口。

If the element has ‘position: fixed’, the containing block isestablished by the viewportin the case of continuous media or the page area in the case of paged media.

  1. 如果元素的位置属性为absolute,那么该元素的包含块由最近的含有属性relativeabsolutefixed的祖先决定。如果该祖先元素是块级元素,那么包含块是其内边距所包围的区域(注意不是content区域);如果是行内元素,那么元素的包含块是由该祖先第一个和最后一个inline框的内边距区域以及direction决定的(这个具体后面分析)。

If the element has ‘position: absolute’, the containing block is established by the nearest ancestor with a ‘position of ‘absolute’, ‘relative’ or ‘fixed’, in the following way:

  1. In the case that the ancestor is an inline element, the containing block is the bounding box around the padding boxes of the first and the last inline boxes generated for that element. In CSS 2.1, if the inline element is split across multiple lines, the containing block is undefined.
  2. Otherwise, the containing blockis formed by the padding edge of the ancestor

position:absolute

上面的第四条指出了两种情况:1. 包含块是块级元素; 2. 包含块是行内元素。我们展开分析:

块级包含块

块级包含块比较容易理解,需要注意的是它的边界是内边距,而不是content区域。依据标准盒模型可知,内边距包含了conten区域和padding:

  <style>
  .pr-outer{
        position: relative;
        height: 50px;
        width: 200px;
        padding: 20px;
        border: 1px solid red;
    }
    .pa-inner{
        position: absolute;
        left: 0;
        top: 0;
    }
  </style>
  <div class="pr-outer">
        <div class="pa-inner">absolute</div>
    </div>
    <div class="pr-outer">
        <div>普通</div>
    </div>

内边距和content比较.png

特别指出当postion:absolute时,topleft的默认值是auto。如果不显示设置这些属性,元素的位置和postion:static一致,把上面例子中pa-innertopleft设置去掉:
absolute的默认值为auto 与static表现一致.png

行内包含块

行内包含块由两部分决定:1. 第一个和最后一个inline框的内边距; 2. 排版方向。

  1. direction:ltr:
    包含块的左边界是祖先元素第一行的顶、左内边距边界,右边界是祖先元素最后一个框的底、右内边距边界。但是包含块的左边框不能比右边框靠右,最多是同一个位置。
  <div style="border:1px solid red; width:200px; padding:20px; direction:ltr;">
      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> 
  </div>
第一行的左边距在最后一行右边距的左边
第一行的左边距在最后一行右边距的右边 此情况下包含块的左右边距重叠
  1. direction:rtl
    与1相反,此方向下包含块的右边界一定是元素的最右边,而左边界则最后一行的左边界。
<div style="border:1px solid red; width:200px; padding:20px; direction:rtl;">
      TEXT TEXT 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> 
  </div>
Paste_Image.png

总结

需要特别注意postion:absolute是的包含块模型,可以参考《webkit技术内幕》第6章第5小节对包含块模型的介绍。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,711评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,932评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,770评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,799评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,697评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,069评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,535评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,200评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,353评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,290评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,331评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,020评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,610评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,694评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,927评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,330评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,904评论 2 341

推荐阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,721评论 1 92
  • 先前在学习CSS float时,有同学提到了BFC这个词,作为求知好问的好学生,哪里不懂查哪里,那么今天就来研究一...
    这名字真不对阅读 6,530评论 3 19
  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,716评论 0 33
  • •前端面试题汇总 一、HTML和CSS 21 你做的页面在哪些流览器测试过?这些浏览器的内核分别是什么? ...
    Simon_s阅读 2,219评论 0 8
  • 7.30上午《教师专业发展,专题资源》 授课教师:赵小瑞 记录者:新乡英语老师朱晋萍 西安航天小学,军工企业,34...
    精神灿烂阅读 177评论 0 0