元素與盒
在HTML中常常使用的概念是元素,而在CSS中,布局的基本單位是盒,盒總是矩形的。
元素與盒並非一一對應的關系,一個元素可能生成多個盒,CSS規則中的偽元素也可能生成盒,display屬性為none的元素則不生成盒。
除了元素之外,HTML中的文本節點也可能會生成盒。
盒模型
一個盒包括了內容(content)、邊框(border)、內邊距(padding)、外邊距(margin)。下圖展示了盒模型的直觀意義:

盒的尺寸(width與height)定義受到box-sizing屬性的影響。box-sizing可選擇content-box(默認), padding-box和border-box三種模式。
正常流
正常流是頁面,大部分盒排布於正常流中。正常流中的盒必定位於某一格式化上下文中,正常流中有兩種格式化上下文:塊級格式化上下文(block formatting context,簡稱BFC)和行內格式化上下文(inline formatting context,IFC)。
在塊級格式化上下文中,盒呈縱向排布,在行內格式化上下文中,盒則呈橫向排布。
正常流根容器中是塊級格式化上下文,不同的盒可能會在內部產生行內格式化上下文或者塊級格式化上下文。
塊級與行內級
正常流中的盒分為塊級與行內級兩種,任何一個行內級盒都不能夠直接被放入塊級格式化上下文中。如果有一個HTML元素生成了一個行內盒,而其所在的上下文是塊級的話,那么應當為它生成一個匿名塊級盒,匿名塊級盒會在內部生成行內格式化上下文。
元素的display屬性會決定盒是行內級還是塊級:
- block, table, flex, grid, list-item 為塊級
- inline, inline-block, inline-table, inline-flex, inline-grid 為行內級
格式化上下文
display同時還可能決定元素內部如何顯示,一些容器型元素生成的盒會產生BFC和IFC以外的格式化上下文。
有一類盒被稱為塊容器,它們能夠包含塊級盒。塊容器要么創建塊級格式化上下文,這樣它內部僅僅包含塊級盒,要么創建一個行內格式化上下文,這樣它內部僅僅包含行內級元素。(也就是說,塊容器中不可能既包含塊級盒,又包含行內級盒,一旦他的子盒中有塊級盒,所有行內級盒都會被自動創建匿名盒包裹)。
在非塊級格式化上下文中的塊容器總是會創建新的塊級格式化上下文:如display為inline-blocks, table-cells, 和table-captions所生成的盒。而自身也在塊級格式化上下文中的塊容器,則只有overflow不為visible的情形下才會創建新的塊級格式化上下文。
絕對定位和浮動的塊容器則總是會創建新的塊級格式化上下文。
display值為table或者inline-table的元素將會生成表格(table),表格內部會使用特殊的格式化方式來排布其內部元素。
display值為grid或者inline-grid的元素將會生成格元素(grid element),與table情形類似,它內部也是使用特殊的格式化方式來牌不其內部元素,
display值為flex或者inline-flex的元素將會生成自適應容器(flex container),自適應容器在其內部產生自適應格式化上下文(flex formatting context)。
