CSS中各类布局的背后,实质上是各类*FC的组合。CSS2.1 中只有 BFC 和 IFC, CSS3 中还增长了 FFC 和 GFC。html
上图为W3C标准盒模型,另外还有一种IE盒模型(IE6如下),惟一的区别就是:前者
width = content
,后者width = content + padding + border
git
若要将IE盒模型转换为标准盒模型,须要在文档顶部加上
<!DOCTYPE html>
声明;颇有意思的是,后来CSS3 中也增长了box-sizing
属性,box-sizing: content-box
即标准盒模型,box-sizing: border-box
即IE盒模型(width包含内边距和边框),W3C反过来又认可了微软,也是有意思。github
视觉格式化模型(visual formatting model)是用来处理文档并将它显示在视觉媒体上的机制,根据上述的盒模型,为文档元素生成盒(Box)。通俗的说,视觉格式化模型就是文档里的盒子布局呈现的一种规则。浏览器
影响布局的因素ide
Positioning Scheme
(常规流,浮动和绝对定位)FC...是谁在说脏话?! Formatting Context -- 格式化上下文,*FC就是视觉格式化模型,用来描述盒子布局规则。布局
块级元素、块级盒、块容器盒、块盒、匿名块盒、行内级元素、行内级盒、原子行内级盒、原子行内盒、行盒、匿名行内盒、
插入盒......要报警了!!!这些真的不是我YY出来的,W3C 里真的有这么多概念好吗!!!感受进坑了啊!!!headache...来吧,一个个捋清楚... -_-|||flex
块级元素(Block-level elements):当元素的 CSS 属性 display:block / list-item / table
时,它就是是块级元素 block-level ,视觉上呈现为块,竖直排列。每一个块级元素生成一个主要的块级盒 (Principal Block-level Box) 来包含其后代盒和生成的内容,同时参与定位体系 (Positioning Scheme) 。某些块级元素还会在主要盒以外产生额外的盒: list-item 元素。这些额外的盒会相对于主要盒来摆放。ui
块级盒(Block-level boxes):由块级元素生成,参与块级格式化上下文(BFC)。描述元素跟它的父元素与兄弟元素之间的表现。atom
块容器盒(Block container box):只包含其它块级盒,或生成一个行内格式化上下文(inline formatting context),只包含行内盒。有些块级盒,好比表格,不是块容器盒。相反,一些块容器盒,好比非替换行内块及非替换表格单元格,不是块级盒。描述元素跟它的后代之间的影响。spa
块盒(Block boxes):同时是块容器盒的块级盒。
<div>
I am Block container box
<p>I'm Inline-level boxes</p>
I am Block container box
</div>
复制代码
display:inline, inline-block 或 inline-table
时,称它为行内级元素。行内级元素生成行内级盒(inline-level boxes),参与行内格式化上下文(IFC)。display:inline
的非替换元素生成的盒是行内盒。CSS2.1中,常规流包括块级盒的块格式化,行内盒的行内格式化,以及块级盒和行内级盒的相对定位。
在浮动模型中,盒首先根据常规流布局,而后从常规流中脱离并尽量地向左或向右位移。内容能够布局在浮动周围。
在绝对定位模型中,盒彻底从常规流中脱离(对后面的同胞元素无影响)并根据包含块来分配位置。
float: left/right/inherit
position: absolute/fixed
display: inline-block
display: table-cell
display: table-caption
overflow: hidden/scroll/auto/inherit
display: flex/inline-flex
一个块级元素中仅包含内联级别元素
内部的盒子会在水平方向,一个接一个地放置。
这些盒子垂直方向的起点从包含块盒子的顶部开始。
摆放这些盒子的时候,它们在水平方向上的 padding、border、margin 所占用的空间都会被考虑在内。
在垂直方向上,这些框可能会以不一样形式来对齐(vertical-align):它们可能会使用底部或顶部对齐,也可能经过其内部的文本基线(baseline)对齐。
能把在一行上的框都彻底包含进去的一个矩形区域,被称为该行的行框(line box)。行框的宽度是由包含块(containing box)和存在的浮动来决定。
IFC中的 line box 通常左右边都贴紧其包含块,可是会由于float元素的存在发生变化。float 元素会位于IFC与与 line box 之间,使得 line box 宽度缩短。
IFC 中的 line box 高度由 CSS 行高计算规则来肯定,同个 IFC 下的多个 line box 高度可能会不一样(好比一行包含了较高的图片,而另外一行只有文本)
当 inline-level boxes 的总宽度少于包含它们的 line box 时,其水平渲染规则由 text-align 属性来肯定,若是取值为 justify,那么浏览器会对 inline-boxes(注意不是inline-table 和 inline-block boxes)中的文字和空格作出拉伸。
当一个 inline box 超过 line box 的宽度时,它会被分割成多个boxes,这些 boxes 被分布在多个 line box 里。若是一个 inline box 不能被分割(好比只包含单个字符,或 word-breaking 机制被禁用,或该行内框受 white-space 属性值为 nowrap 或 pre 的影响),那么这个 inline box 将溢出这个 line box。
水平居中:当一个块要在环境中水平居中时,设置其为 inline-block 则会在外层产生 IFC,经过设置父容器 text-align:center 则可使其水平居中。
垂直居中:建立一个IFC,用其中一个元素撑开父元素的高度,而后设置其 vertical-align:middle,其余行内元素则能够在此父元素下垂直居中。
当 display
的值为 flex
或 inline-flex
时,将生成弹性容器(Flex Containers), 一个弹性容器为其内容创建了一个新的弹性格式化上下文环境(FFC)
flex
的容器被渲染为一个块级元素inline-flex
的容器则渲染为一个行内元素当为一个元素设置display
值为grid
的时候,此元素将会得到一个独立的渲染区域
经过在网格容器(grid container)上定义网格定义行(grid definition rows)和网格定义列(grid definition columns)属性各在网格项目(grid item)上定义网格行(grid row)和网格列(grid columns)为每个网格项目(grid item)定义位置和空间
参考:
已同步至我的博客-软硬皆施
Github 欢迎star :)