2 Box sizing in CSS

Box sizing in CSS

CSS box的计算依赖于box model,每一个box都有一个content区域以及可选的围绕着content区域的padding,border和margin三个部分,如图所示。

box-model.png

Content dimensions and margins

case 1

paddingborder的属性渲染结果一贯比较稳定,都是围绕着content区域。唯一主要的corner case是在inline的元素上(不包括inline-block),左边和右边的border只渲染一次,即使content太多折行了,上下的border会在多行都渲染,但是和block元素渲染的方式不太一致。

例子中的第一段border在block元素中,所以它渲染成一个单独、连续的box。

第二段border在inline元素中,如上面所说,它的左右border只渲染了一次,第二行上面的border在第一行下面border之上。

另外两个盒模型有趣的方面是content dimension的计算margin:auto对不同类型元素的影响。content dimension也就是heightwidth的计算。

如图总结了content dimension 和 margin:auto的机制。

content-dimension-and-marginauto.png

Box model calculations for inline elements

inline, non-replaced元素widthheight属性忽略,不参与计算,实际的宽和高完全由他们的内容决定。inline元素在布局中是放在line box中进行计算的,line box的尺寸基于font-sizeline-height计算。margin-topmargin-bottom属性同样是忽略不计算的,但是margin-leftmargin-right能正常使用,相对同一个line box中的其它元素布局。

"Content-based" height for blocks, floats and inline-blocks

blocks, floats, inline-blocks在属性height:auto的情况下有相同的计算方式。height:auto意思是元素的高度以content决定,有两种基于content的高度计算方法:

  • 一种是floats, inline-block和block元素在文档流中并且没有将overflow设置为visible的计算方法
  • 另一种是block元素在文档流中并且overflow:visible的计算方法

两种计算方式将content作为高度的计算依据,但是对于overflow:visible的block元素,会忽略子元素中的float元素,这就是为什么当只有float子元素时,父元素的高度为0的原因。

overflow的值不是visible时,float元素的高度会计算进去,标准里说

if the element has any floating descendants whose bottom margin edge is below the element's bottom content edge, then the height is increased to include those edges. Only floats that participate in this block formatting context are taken into account, e.g., floats inside absolutely positioned descendants or other floats are not.

也就是说,当widthheight为auto时,blocks会一直扩展,直到完全包裹content,但对于float元素,仅是那些参与block formatting context的参与计算,比如absolute定位的元素就不参与。

Width calculation

宽度的计算要更复杂些,针对widthmargin值都为auto的情况有两种算法。

Block-level元素使用constraint-based的方法,所谓的限制也就是盒模型(比如borderpaddingmargin等属性),如果width或者margin其中有一个的值设置为auto,则这个auto的计算是通过可使用的空间减去那些已经设定好有具体值的属性得到的值作为auto最终渲染时使用的结果。

Floating block和inline-block元素使用shrink-to-fit的方法,它包括三个步骤,1)首选宽度(例如,尽可能少的换行符),2)首选最小可用宽度(例如,使用尽可能多的换行符),3)可用的宽度。

如果水平空间可用,则宽度值设置为首选宽度,否则设置为首选最小宽度,最坏的情况下,可用宽度可能存在一些潜在的溢出。对于floating block和inline-block元素,margin:auto会被解读为margin:0

Width calculations: block-level elements(constraint-based)

标准

'margin-left' + 'border-left-width' + 'padding-left' + 'width' + 'padding-right' + 'border-right-width' + 'margin-right' = width of containing block

这其中borderpadding的属性不能设置为auto,它们必定有一个确定的值,上面的式子可以化简为

margin-left + width + margin-right = width of containing block

当显式的设置这三个属性的值时,可以直接使用这个计算结果。当发生以下三种情况时,使用constraint-based方法

  • width是auto且margins是auto
  • width是具体的值且margins是auto
  • 三个值中有两个是具体的值,另一个是auto

case1

width设置为auto时,其它设置为auto的属性变为0,在case 1中box的width为整个行的宽,包括了所有padding和border需要的空间。

case2

width有具体的值,margin为auto时,将box居中。这里隐含的计算是,当margin-leftmargin-right都为auto时,他们的值相等,所以就将box居中了。当然只是水平居中,因为block formatting context 将box从上至下顺序排布,所以不能垂直居中。

case3

当三个值中有两个是具体值时,剩下的那个值等于可用宽度减去那两个特定值。

Width calculations: floating blocks and inline-block elements(shrink-to-fit)

在了解shrink-to-fit算法之前首先了解几个概念:

  1. perferred width(pw)使换行符最少的宽度
  2. perferred minimum width(pmw)使换行符尽可能多的宽度,CSS 2.1并没有指定计算这个宽度的算法
  3. available width(aw)父元素的宽度减去水平方向margin,border,padding的值以及可能存在的滚动条的宽度

shrink-to-fit算法就可以描述为min(max(pmw, aw),pw)。

case1

perferred width值作为宽度的例子。

case2

当available width小于preferred width,但是大于等于preferred minimum width,使用available width作为宽度的例子。

case3

当available width小于preferred minimum width,使用available width作为宽度的但是会有溢出的例子。

Margins for floating blocks and inline-block elements

floating blocks和inline-block元素的margin计算十分简单,任何被设置为auto的magrin都将置为0。

Absolutely positioned, non-replaced elements

absolutely positioned元素将constraint-based,shrink-to-fit和content-based三种算法结合在一起来定位水平和垂直位置。

高度的计算:

'top' + 'margin-top' + 'border-top-width' + 'padding-top' + 'height' + 'padding-bottom' + 'border-bottom-width' +
'margin-bottom' + 'bottom'
= height of containing block

宽度的计算:

'left' + 'margin-left' + 'border-left-width' + 'padding-left' +
'width' + 'padding-right' + 'border-right-width' + 'margin-right' +
'right'
= width of containing block

同样,我们可以忽略padding和borders,因为他们不能被设置为auto,值要么为0,要么为一个特定的值。所以上面的可以简化为

height = 'top' + 'margin-top' + 'height' + 'margin-bottom' + 'bottom'

width = 'left' + 'margin-left' + 'width' + 'margin-right' + 'right'

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

推荐阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,726评论 1 92
  • 1. 前言 前端圈有个“梗”:在面试时,问个css的position属性能刷掉一半人,其中不乏工作四五年的同学。在...
    YjWorld阅读 4,422评论 5 15
  • 移动开发基本知识点 一.使用rem作为单位 html { font-size: 100px; } @media(m...
    横冲直撞666阅读 3,452评论 0 6
  • 我这破心理素质啊,现在就心跳加快,紧张到不行,还有点困,脑子有点木
    cocogao阅读 229评论 0 1
  • 无心听风,人睡了 我未睡 算床,是床,我爱的 还是夜 林静了,灯静了 山河在做梦……想从前 有那马只身打草原走过 ...
    牛怀良阅读 188评论 0 3