當對一個文檔進行佈局的時候,瀏覽器渲染引擎會根據標準,將頁面中的全部元素表示爲一個一個矩形的盒子。CSS決定這些盒子的大小、位置以及屬性。每一個盒子有四個部分組成,分別是:content,padding,border,margin。
css
屬性解釋:html
content
內容區域,內容區域能夠定義width
和height
padding
內容區域和邊框之間的空間量border
內容區域和內邊距周圍邊框的粗細和樣式。margin
邊框和元素外邊緣的空間量在CSS中咱們普遍的使用兩種『盒子』——塊級盒子和內聯盒子。兩種盒子在頁面佈局中有如下特色:前端
塊級盒子css3
width
和height
屬性能夠發揮做用padding
外邊距margin
邊框border
會將其餘元素從當前盒子周圍推開內聯盒子面試
width
和height
屬性不起做用inline
狀態的盒子推開。inline
狀態的盒子推開。咱們經過對盒子display
屬性的設置,來控制盒子的外部顯示類型。segmentfault
完整的CSS盒模型應用於塊級盒子,內聯盒子只使用盒模型中定義的部份內容。盒模型有兩種類型,標準盒模型和IE盒模型。瀏覽器
在標準盒模型中,若是給盒子設置width
和height
,實際設置的是content
內容區域的寬和高。內邊距padding
和邊框border
加上設置的寬高一塊兒決定了盒子的大小。佈局
在IE盒模型中,若是給盒子設置width
和height
,那麼盒子的大小就是設置的寬高值,若是盒子設置了內邊距padding
和邊框border
,那麼內容的大小其實是盒子的大小減去內邊距和邊框的大小以後的值。spa
假設咱們定義了以下一個盒子翻譯
.box { width:100px; height:100px; margin:25px; padding:20px; border:15px solid #000; }
標準盒模型盒子圖示:
盒子的寬度=width + padding-left + padding-right + border-left + border-right(100+20+20+15+15 = 170)
內容的寬度 = width(100)
IE盒模型圖示:
盒子的寬度=width(100)
內容的寬度 = width - padding-left - padding-right - border-left - border-right(100-20-20-15-15 = 30)
在標準盒模型當中,咱們使用CSS定義盒子的寬度width
和高度height
並非盒子所佔據空間大小。
在IE盒模型當中使用CSS定義盒子的寬度width
和高度height
就是盒子的大小。
在現代瀏覽器當中,幾乎全部的瀏覽器,默認的盒模型都是標準盒模型。若是想要使用IE盒模型,能夠經過設置屬性box-sizing: border-box
來設置。
在早期仍是IE瀏覽器天下的時候,若是HTML文檔缺失DOCTYPE
文檔定義標籤,在IE六、IE七、IE8下默認使用的是IE盒模型。
盒模型沒有好壞優劣之分,根據狀況的差別咱們選擇不一樣的盒模型。
摺疊邊距(邊距重疊)不是一個Bug;以前咱們說過BFC,下面是W3C關於BFC的相關說明原文:
In a block formatting context, boxes are laid out one after the other, vertically, beginning at the top of a containing block. The vertical distance between two sibling boxes is determined by the 'margin' properties. Vertical margins between adjacent block-level boxes in a block formatting context collapse.
翻譯一下就是說:『在BFC當中,盒子是按照垂直方向一個疊一個排列的,垂直方向上兩個盒子的距離是由margin屬性決定的,在BFC垂直方向的塊級盒子之間margin會發生collapse
摺疊』
在W3C關於CSS章節的8.3.1章節詳細說了Collapsing margins
邊距摺疊的特色,在此我簡單總結一下一些(不全),詳細的內容點擊查看
知道了會發生邊距摺疊的緣由,那麼解決方法天然是小菜一碟。
一個完整的盒模型有四部分組成,分別是內容區域content,內邊距padding,邊框border,以及外邊距margin;其中margin不參與計算盒子的大小;盒模型有兩種類型,IE盒模型和標準盒模型;有時候IE盒模型也被成爲怪異盒模型;在現代瀏覽器當中默認是盒子模型,咱們能夠經過CSS的box-sizing:border-box;
來修改盒模型爲IE盒模型;在IE盒模型當中,盒子的寬度是咱們定義的width值,而在標準盒模型當中盒子的寬度是內容的width值加上左右內邊距加上左右邊框的值。
詳解CSS的盒模型(box model) 及 CSS3新增盒模型計算方式box-sizing
前端面試系列其它文章