在HTML中經常使用的概念是元素,而在CSS中,佈局的基本單位是盒,盒老是矩形的。html
元素與盒並不是一一對應的關係,一個元素可能生成多個盒,CSS規則中的僞元素也可能生成盒,display屬性爲none的元素則不生成盒。佈局
除了元素以外,HTML中的文本節點也可能會生成盒。post
一個盒包括了內容(content)、邊框(border)、內邊距(padding)、外邊距(margin)。下圖展現了盒模型的直觀意義:flex
盒的尺寸(width與height)定義受到box-sizing屬性的影響。box-sizing可選擇content-box(默認), padding-box和border-box三種模式。url
正常流是頁面,大部分盒排佈於正常流中。正常流中的盒一定位於某一格式化上下文中,正常流中有兩種格式化上下文:塊級格式化上下文(block formatting context,簡稱BFC)和行內格式化上下文(inline formatting context,IFC)。orm
在塊級格式化上下文中,盒呈縱向排布,在行內格式化上下文中,盒則呈橫向排布。htm
正常流根容器中是塊級格式化上下文,不一樣的盒可能會在內部產生行內格式化上下文或者塊級格式化上下文。blog
正常流中的盒分爲塊級與行內級兩種,任何一個行內級盒都不可以直接被放入塊級格式化上下文中。若是有一個HTML元素生成了一個行內盒,而其所在的上下文是塊級的話,那麼應當爲它生成一個匿名塊級盒,匿名塊級盒會在內部生成行內格式化上下文。ip
元素的display屬性會決定盒是行內級仍是塊級:element
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)。