1、概述
html任何一個元素都可以看作一個盒子,這個盒子不可見,但是它存在于頁面的每個角落,也正是由于它不可見、不直覺,很多人在初學CSS的時候不能透徹得了解盒模型的概念,導緻在頁面布局中出現各種各樣的問題。
一個盒子包括了content(實際内容)、border(邊框)、padding(内邊距)和margin(外邊距)。
2、content
盒子的内容,顯示文本和圖像。我們給元素設定的width和height其實是content的寬高,如果指定高度大于顯示内容所需高度,多餘的高度會産生類似内邊距一樣的效果;如果指定高度小于顯示内容所需高度,會出現滾動條。如果元素内容的高度(手動設定content的height時)大于元素邊框的高度,浏覽器的具體行為取決于overflow屬性。
3、border
元素的邊框是圍繞元素内容的内邊距的一條或多條線。邊框由粗細、樣式和顔色三部分組成,如border:1px solid red。
4、padding
content到border之間的空白區域,内邊距是透明的,取值不能為負,受盒子的Background屬性影響,padding是有背景的。
5、margin
在元素外建立額外的空白區域,可了解成元素與元素的間距,這個空白區域通常指不能放其他元素的區域(可用定位的方式在這個空白區域中放元素),而且在這個區域中可以看到父元素的背景(padding能看到本元素的背景)。margin經常取負值實作定位的作用。
外邊距問題:
1.相鄰兄弟元素外邊距合并問題:當兩個垂直外邊距相遇時,它們将進行合并最後形成一個外邊距。合并後的外邊距的高度等于兩個發生合并的外邊距的高度中的較大者。
對于水準相鄰的元素,它們的水準間距是相鄰外邊距之和。
2.父子元素外邊距合并問題:當一個父元素沒有border、padding,且子元素有margin-top時,子元素的margin-top會成為父元素的margin-top,除非為父元素添加border-top或padding-top
margin雖不可見,但是它确實在文檔中占據了空間,我們要區分兩個概念即:盒子所占空間(計入margin)和盒子實際的大小(不計入margin)。
6、兩種盒子模型
盒模型有兩種,分别是ie盒子模型(IE6以下版本浏覽器)和标準w3c盒子模型,差別在于前者content的寬度和高度包括了border和padding。
CSS3中,可用box-sizing屬性為元素設定盒模型。
box-sizing有三個取值:
1.content-box:使元素遵循标準 w3c 盒子模型(預設值)。
元素的實際寬度=width+(padding-left)+(padding-right)+(border-left)+(border-right)
元素的實際高度=height+(padding-top)+(padding-bottom)+(border-top)+(border-bottom)
元素所占空間寬度=元素實際寬度+(margin-left)+(margin-right)
元素所占空間高度=元素實際高度+(margin-top)+(margin-bottom)
在顯式設定了width和height的前提下,padding和border的設定會加大盒子的寬高
2.border-box:使元素遵循ie 盒子模型。
元素的實際寬度=width
元素的實際高度=height
元素所占空間寬度=元素實際寬度+(margin-left)+(margin-right)
元素所占空間高度=元素實際高度+(margin-top)+(margin-bottom)
元素内容的寬度=width-(padding-left)-(padding-right)-(border-left)-(border-right)
元素内容的高度=height-(padding-top)-(padding-bottom)-(border-top)-(border-bottom)
在顯式設定了width和height的前提下,padding和border值的設定會減少元素内容的寬高
不管如何設定padding和border(小于width/2),它隻在盒子裡面伸縮,不影響整體的寬高,但它會影響content,如果padding和border太大,會把内容擠掉。
3.inherit:規定應從父元素繼承 box-sizing 屬性的值。
注意:行内元素的寬高始終為元素内容的寬高
width/height、margin是可以設定為auto的,那麼這個auto到底是多大呢?
假設padding和border為0,以width、margin-left、margin-right為例進行說明。
這3個值加起來往往是父級元素的width值。
如果任意一個為auto,另外2個未固定值,那麼這個auto=父元素width-兩個固定值之和
如果設定margin-left,width為auto,margin-right為固定值,width=父元素width-子元素margin-right margin-left為0
如果設定width,margin-right為auto,margin-left為固定值,width=父元素width-子元素margin-left margin-right為0
如果設定margin-left,margin-right為auto,width為固定值,auto=(父元素width-子元素width)/2 表示将元素居中
如果這3個屬性都設定為auto,子元素的width=父元素width,margin-left、margin-right為0
總結:隻有margin-left和margin-right同時為auto且width為固定值時,margin的auto才有意義,否則margin的auto都為0
7、兩種盒子模型寬高計算示例
假設一個盒子的 margin 為 20px,border 為 2px,padding 為 10px,content 的寬為 200px、高為 50px。
當box-sizing為content-box時:
元素的實際寬高:200+10*2+2*2=224,50+10*2+2*2=74
元素所占空間寬高:224+20*2=264,74+20*2=114
當box-sizing為border-box時:
元素的實際寬高:200,50
元素所占空間寬高:200+20*2=240,50+20*2=90
元素内容寬高:200-10*2-2*2=176,50-10*2-2*2=26