如今咱們已經熟悉了HTML和CSS。瞭解了它的基礎。如今咱們來更深刻的瞭解元素在頁面中的呈現和大小。css
在這節課中,咱們將會討論什麼是盒子模型,它的工做模式是怎樣的。咱們也會在課程中學習一些新的CSS屬性,而且將介紹三種長度單位。html
在瞭解盒子模型以前,咱們先來了解一下元素是如何顯示的。在第二節課中,咱們學習了塊狀元素和內聯元素的差別。快速回顧一下,塊狀元素會另起一行,並佔據全部可用的寬度,無論內容有沒有。而內聯元素會並排顯示,寬度緊隨內容變化而變化。塊狀元素一般用在大塊的內容上,例如標題,結構元素。內聯元素用在小塊的內容上,好比將幾句話加粗或斜體顯示。web
元素如何顯示——例如塊狀元素,內聯元素和其餘元素——都由顯示屬性display
決定。每一個元素都有一個默認的display
屬性值。和其餘屬性值同樣,這個屬性值是能夠被覆蓋的。display
值有不少,其中最經常使用的是block
,inline
,line-block
和none
。segmentfault
咱們能夠經過CSS選中元素並改變和從新聲明元素的display
屬性值。 若值爲block
可使元素成爲塊狀元素顯示。瀏覽器
p { display: block; }
將值設置爲inline
,能夠將元素轉化爲內聯元素。session
p { display: inline; }
inline-block
比較有意思,它可使元素的全部塊狀元素的屬性生效。但元素又按照內聯元素顯示,不會另起一行。工具
p { display: inline-block; }
inline-block
內嵌塊元素有個重要的點,就是它們並不是是首尾相接的。兩個內嵌塊元素之間存在小空隙。這個空隙雖然很惱人,但這是正常現象。咱們會討論爲何這個空隙存在,以及怎麼消除。性能
最後是none
屬性值,會徹底隱藏元素,頁面渲染的時候會當它不存在。任何被包裹在這個屬性值元素內的元素都會被隱藏。學習
div { display: none; }
瞭解元素如何顯示,以及怎麼修改display
屬性很是重要,由於它會影響盒子模型的呈現效果。討論盒子模型的時候,咱們會知道他們之間的差異,意義和影響。
根據盒子模型的概念,每一個在頁面上的元素都是一個擁有寬,高,內邊距,邊框和外邊距的長方形盒子。
頁面上每一個元素都符合盒子模型的定義,因此它很是重要。咱們使用一些新的CSS屬性來來熟悉它。
每一個元素都是一個長方形盒子,有幾個屬性能肯定這個盒子的大小。盒子的核心屬性是元素的寬高,這兩個值多是由元素的display
屬性、元素的內容或具體的width
,height
屬性值生成的。內邊距padding
和邊框border
拓展了元素的高寬。最後是咱們定義的在邊框外的外邊距margin
。
盒子模型對應的CSS屬性爲:width
,height
,padding
,border
,margin
。
咱們來看例子:
div { border: 6px solid #949599; height: 100px; margin: 20px; padding: 20px; width: 400px; }
根據盒子模型,元素的總寬度計算以下:
margin-right + border-right + padding-right + width + padding-left + border-left + margin-left
使用上述公式,就能算出示例中的高寬值
毫無疑問盒子模型是HTML和CSS很容易混淆的部分之一。
咱們將width
的值設置爲400
像素,但元素的實際寬度爲492
像素。默認狀況下,盒子模型是加法。所以想要肯定盒子的實際大小,咱們須要考慮將四面的內邊距,邊框,外邊距都考慮進去。寬度不只僅是width
屬性的值,也要加上左右兩側的內邊距,邊框和外邊距。
到目前爲止,上述屬性看着沒什麼實際意義。由於這只是爲了澄清全部造成盒子模型的屬性:width
,height
,padding
,border
和 margin
。
每一個元素都有默認的高度和寬度。雖然寬度和高度都有多是0
像素,但默認狀況下,瀏覽器會渲染每一個元素的大小。元素的默認寬度和高度依賴於元素是怎麼顯示的。若是元素是頁面佈局的關鍵元素。那麼它就須要設置具體的width
和height
屬性值。這種狀況下,只能指定非內聯元素的屬性值。
寬度
元素的默認寬度依賴於它display
屬性的值。塊狀元素的默認寬度爲100%
,佔據整行空間。內聯元素和內嵌塊元素的寬度都隨着元素的內容變化而變化。內聯元素不具有固定的大小,因此width
和height
屬性只有在非內聯元素上才能生效。以下是爲非內聯元素設置寬度的例子:
div { width: 400px; }
高度
元素的默認高度取決於它的內容。元素根據內容須要進行垂直擴展或收縮。咱們可使用height
屬性爲非內聯元素設置高度:
div { height: 100px; }
調整內聯元素
請記住內聯元素不支持width
和height
屬性和與其相關的值。塊狀元素和內嵌塊元素支持width
和height
屬性和與其對應的值。
瀏覽器會根據元素設置其默認的外邊距和內邊距,使其更清晰易讀。咱們使用基於文本的元素來看一下這個現象。不一樣瀏覽器和不一樣元素之間的默認外邊距和內邊距可能存在差別。咱們在第一課中有討論過CSS重置,將這些差異調低,或使其爲零。這樣咱們就能夠從頭開始定義咱們須要的樣式。
外邊距
margin
屬性設置一個元素的周圍空間大小。外邊距在元素邊框外而且是徹底透明的。外邊距能夠幫助咱們將元素定位在頁面的特定位置,而且能夠與其餘元素保持距離。 示例以下:
div { margin: 20px; }
margin
有一個特殊的現象,就是在內聯元素中垂直外邊距margin-top
和margin-bottom
不生效,在塊狀元素和內嵌塊元素中有效。
內邊距
padding
屬性和margin
屬性類似,只不過它在邊框內部,padding
是爲元素提供內部空間。示例以下:
div { padding: 20px; }
padding
屬性和margin
屬性不一致的地方是垂直內邊距在內聯元素中一樣有效;雖然垂直內邊距顯示在元素基準線之上或之下,可是它確實是存在的。
內聯元素的外邊距和內邊距
內聯元素對內邊距和外邊距的實現和塊狀元素與內嵌塊元素不一樣。外邊距只有橫向margin-left
和margin-right
有效。內邊距在內聯元素中徹底生效,可是垂直內邊距padding-top
和padding-bottom
在元素基準線上面或下面顯示(譯者注:內聯元素加上垂直內邊距以後,元素內部的內容部分在視覺上沒有產生偏移)。
塊狀元素和內嵌塊元素的外邊距和內邊距的顯示是正常的。
外邊距和內邊距的聲明方式
在CSS中,不少屬性都有多種聲明方法。普通的寫法,就是一個屬性一個值,一個個地列出來。但咱們也可使用簡寫,一個屬性包含多個值。不是全部的屬性都有簡寫,因此咱們必須確保寫出的屬性和值的結構是正確的。
margin
和padding
有普通和簡寫兩種書寫方式。當元素四面設置相同的外邊距時,可使用margin
屬性,並只指定一個值:
div { margin: 20px; }
若是上下外邊距的值一致,左右外邊距的值一致,咱們能夠輸入兩個值。 設置上下外邊距的值在前面。如下例子將上下外邊距設置爲10
像素,將左右外邊距設置爲20
像素:
div { margin: 10px 20px; }
若是四個值都不一致,那麼咱們按照 上右下左 的順序輸入值。例如,咱們爲div
設置10
像素的頂部外邊距,20
像素的右側外邊距,0
像素的底部外邊距,以及15
像素的左側外邊距:
div { margin: 10px 20px 0 15px; }
若咱們要設置多個值,優先考慮用margin
和padding
。但咱們也能夠用普通寫法,輸入一一對應的屬性和值。每一個屬性名(該例子中是外邊距和內邊距)後跟隨一個破折號-
以及要設置值的盒子的方向:top
,bottom
,right
和left
。
例如,padding-left
屬性只接受一個值,設置元素的左側內邊距;margin-top
只接受一個值,設置元素的頂部外邊距。
div { margin-top: 10px; padding-left: 6px; }
當咱們只想設置單邊的margin
和padding
值時,這種普通寫法是最好的選擇。保持代碼的精確性能夠防止出現混淆。例如,咱們是否只想將元素的上右左三側的外邊距設爲0
,是否只想將底部外邊距設爲10
像素?
普通寫法輸入屬性和值可讓目標更明確。當處理三個或以上的值時,縮寫更有幫助。
外邊距和內邊距的顏色margin
和padding
屬性是徹底透明的,不能夠設置顏色。但由於是透明的,因此透出了相關元素的背景色。元素外邊距部分看到的顏色爲它父級元素的背景色。元素內邊距部分看到的顏色爲該元素的背景色。
邊框在內邊距和外邊距之間,畫出了元素輪廓。border
屬性要求三個值:寬度,樣式,顏色。邊框屬性簡寫時值的順序爲:寬度,樣式,顏色。普通書寫方式下,邊框的三個屬性名爲:border-width
,border-style
和border-color
。普通書寫方式由於是單個值,更容易修改和複寫。
邊框的寬度和顏色能分別使用第三節課中討論過的長度單位和色值。
邊框有不少不一樣樣式。最經常使用的樣式值爲solid
,dashed
,dotted
和none
,但你能夠在列表中看到不少其餘的樣式。
如下是邊框設置示例:
div { border: 6px solid #949599; }
單側邊框
和margin
,padding
屬性同樣,也能夠一次只設置元素一個方向的邊框。使用屬性名:border-top
, border-right
,border-bottom
和border-left
。它們的屬性值和border
的屬性值同樣有三個:寬度,樣式和顏色。以下所示:
div { border-bottom: 6px solid #949599; }
另外,單側邊框的樣式也能夠被細分,以下所示:
div { border-bottom-width: 12px; }
這些高度細分的邊框屬性名都由連字符分隔,由border單詞開頭,隨後是邊框的方向:top
,right
,bottom
,left
,最後是要設置的樣式:width
,style
,color
。
border-radius
border-radius
可使元素的邊角變圓。
border-radius
接受多種長度單位,如百分比,像素,肯定元素邊角變圓的半徑。單個值表示四個角的弧度一直,兩個值按分別表示top-left
/bottom-right
和top-right
/bottom-left
,輸入四個值按順序分別表示:top-left
,top-right
,bottom-right
和bottom-left
。
思考border-radius
多個值的順序時(包括margin
和padding
),記住它們是從左上角開始(margin
和padding
從上側開始)按順時針方向排序的。
div { border-radius: 5px; }
border-radius
屬性也容許咱們使用普通方法書寫單個屬性值。這些普通的屬性以border
單詞開通,跟着是邊角的垂直位置(top
或bottom
),再是邊角的橫向位置(left
或right
),最後是半徑radius
。例如,要設置<div>
右上角的邊角半徑,可使用border-top-right-radius
屬性:
div { border-top-right-radius: 5px; }
如今,在盒子模型中有一個附加屬性。若是你設置了元素的width
爲400
像素,並將padding
設置爲20
像素,將border
設置爲10
像素,那麼實際的盒子寬度爲460
像素。記住,盒子的寬度是width
,padding
和border
相加得到的。
可是在CSS3中,盒子模型有了一個不同的計算方式。CSS3推出了box-sizing
屬性,徹底改變了盒子模型的運做模式和元素大小的計算方式。這個屬性有三個主要值——content-box
,padding-box
和 border-box
——每一個值對盒子模型大小的計算稍微有些不同。
content-box
content-box
這個屬性值是默認值。這個默認值和元素不加box-sizing
屬性時的效果是一致的。元素從width
和height
屬性的值開始計算,加上padding
,border
和margin
屬性值得到盒子的實際尺寸。
div { -webkit-box-sizing: content-box; -moz-box-sizing: content-box; box-sizing: content-box; }
上例中box-sizing
屬性前的連字符和字母是什麼?
CSS3的推出後,瀏覽器逐步開始以加前綴的方式支持新屬性和值,包括box-sizing
屬性。隨着部分CSS規範被瀏覽器普遍支持以及瀏覽器版本的更新,前綴的做用也愈來愈小,隨着時間的發展將再也不是一個問題。但在老版本瀏覽器中仍是不可或缺的。
屬性名和屬性值均可以添加前綴。例如,上例中的box-sizing
屬性名加了前綴。瀏覽器能夠選擇何時加前綴何時不加前綴,所以有些屬性須要帶有某瀏覽器的前綴,有些屬性不須要。
接下來的課程中,若某個屬性或值須要前綴,只會在介紹那個屬性時添加使用(這有利於保持代碼的簡潔)。不過大家在實際寫代碼的時候不要忘記添加前綴。
最多見的幾個瀏覽器前綴歸納以下:
-moz-
-ms-
-webkit-
padding-box
屬性值padding-box
時,元素將padding
屬性值計算入width
和height
屬性值內,改變了盒子模型計算模式。例如,元素的width
設置爲400
像素,padding
值設爲20
像素,最終元素實際的寬度仍是400
像素。隨着內邊距的擴大,元素的內容區域會隨着縮小,可是盒子實際大小並未發生改變。
若是咱們增長border
或margin
,那麼盒子的大小就是這些屬性值加上width
和height
的值。例如,咱們將元素的的width
設置爲400
像素,每一個方向的border
都設置爲10
像素,padding
設置爲20
像素,那麼元素的實際寬度就爲420
像素。
div { box-sizing: padding-box; }
隨着CSS規範的更新,box-sizing
的值padding-box
已被棄用,咱們不該再使用它。
Border Box
最後一個屬性值是border-box
,它將border
和padding
都算在元素的width
和height
屬性值內。例如,一個元素的width
爲400
像素,每邊的padding
爲20
像素,border
爲10
像素,最終元素的實際寬度仍然爲400
像素。
若咱們還增長了margin
屬性,在獲取盒子總大小時它的值須要作加法計算。無論box-sizing
的屬性值是什麼, 計算盒子總大小時任何margin
的值都須要作加法計入。
div { box-sizing: border-box; }
使用box-sizing屬性
一般來講,box-sizing
最佳屬性值爲border-box
,這個屬性值更易計算。若是咱們將一個元素的width
爲400
像素,那麼無論你增長了邊框仍是內邊距,它的大小都仍是400
像素。
另外,咱們也能夠輕鬆的相對值。若是咱們設置一個元素的寬度爲40%
,元素每邊的padding
值爲20
像素,border
值爲10
像素。那麼儘管有地方設置了像素值,元素盒子的實際大小仍然爲40%
。
惟一遺憾的是box-sizing
是CSS3的屬性,並非全部瀏覽器都支持,尤爲是老版本瀏覽器。所幸隨着瀏覽器版本更新,影響會愈來愈小。咱們使用box-sizing
的時候,須要留意哪些瀏覽器會出現兼容問題。
大多數瀏覽器都有開發者工具。咱們可使用這些工具查看頁面上的元素、這些元素的HTML結構
和CSS屬性及它們值。它們大部分都有盒子模型圖解。
在Chrome瀏覽器中打開菜單欄,找到「更多工具」選項中的「開發者工具」選項並點擊它,瀏覽器窗口的底部會顯示出一個視窗,其中提供了一些代碼檢查工具。
懸停或點擊視窗中的元素節點,能夠查看這個元素的信息。
選中一個元素後,在視窗右側選中「Computed」選項,咱們就能夠看到咱們選中的元素的盒子模型。
Chrome, Firefox,Safari以及其餘瀏覽器中都有開發者工具。查看源代碼能夠學到不少東西。我在編寫HTML和CSS的時候一般都會打開開發者工具,也經常用它查看分析其餘網站的源代碼。
如今咱們回到以前作的「樣式討論會」網站,並未它添加更多的內容。
main.css
文件中添加一個box-sizing
屬性,值設置爲border-box
,這樣可使咱們的元素更容易控制。在文件的頁面重置樣式下,添加一條註釋,有助於網站佈局。把它放在樣式重置代碼之下,是使其放在正確的層疊關係上。*
,後面跟隨帶僞元素的選擇器*:before
和*:after
,這樣就能夠選中頁面中全部的元素,將其box-sizing
值設置爲border-box
。請記住,box-sizing
是有前綴的,由於它是一個較新的屬性。/* ======================================== Grid ======================================== */ *, *:before, *:after { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; }
width
,padding
屬性,並將元素居中。 在咱們通配符選擇器下,建立一個新的class選擇器名爲container
。在選擇器中將width
設置爲960
像素,padding-left
和padding-right
設置爲30
像素,上下外邊距設置爲0
,左右外邊距設爲auto
。container
告訴瀏覽器全部使用了這選擇器的元素的寬度。左右外邊距值設爲auto
,再加之設好的寬度值,可讓瀏覽器自動計算出左右相等的外邊距,元素就相對於頁面居中了。最後設置左右內邊距,使內容不緊貼元於素的邊緣,爲內容提供一點喘息的空間。.container { margin: 0 auto; padding-left: 30px; padding-right: 30px; width: 960px; }
container
已經可使用,咱們把它添加到全部頁面的<header>
和<footer>
元素上,全部頁面包括index.html
,speakers.html
,schedule.html
,venue.html
以及register.html
頁面。<header class="container">...</header> <footer class="container">...</footer>
container
添加到介紹會議的<session>
元素和包含<section>
做爲子元素的`<section>元素上。<section class="container">...</section>
container
添加到其餘頁面中包含有<h1>
元素的<section>
元素上。<section class="container"> <h1>...</h1> </section>
22
像素。咱們將這個排版樣式以及它的註釋放在以前的容器樣式之下。/* ======================================== Typography ======================================== */ h1, h3, h4, h5, p { margin-bottom: 22px; }
<h2>
和<h6>
元素,由於設計中<h2>
不須要外邊距,<h6>
此次咱們不會用到。<section>
的底部放置一個按鈕,併爲其設置邊框和圓角。<a>
元素,並將其的class屬性值設爲btn
和btn-alt
.<a class="btn btn-alt">...</a>
btn
。咱們但願全部的按鈕的border-radius
爲5
像素,display
爲inline-block
,並移除全部外邊距。/* ======================================== Buttons ======================================== */ .btn { border-radius: 5px; display: inline-block; margin: 0; }
btn-alt
爲當前按鈕設置特殊的樣式。咱們增長1像素的灰色邊框,而且設置上下內邊距爲10
像素,左右內邊距爲30
像素.btn-alt { border: 1px solid #dfe2e5; padding: 10px 30px; }
<a>
元素中使用了btn
和btn-alt
,那麼相應的樣式都會渲染上去。<a>
元素的<section>
元素設置padding
樣式。咱們經過在其上添加一個class屬性值hero
來實現。<section class="hero container"> ... </section>
hero
添加padding
屬性。/* ======================================== Home ======================================== */ .hero { padding: 22px 80px 66px 80px; }
如今咱們的網站更加完整了,尤爲是主頁。
在此練習的第一步,咱們提到了通配符選擇器*
,它會選中全部的元素。相比於一一列出全部能想到的單個元素,不如使用它來選中全部的元素。
咱們也在第一步中提到了僞元素:before
和:before
,它們能夠在CSS中動態生成元素。咱們不會當前項目中使用它。不過在通配符選擇器中使用僞元素是很經常使用的作法。
這是練習的源代碼。點擊下載
休息一下咱們再繼續。
將盒子模型全部內容學完並不容易。這些概念雖然只是簡單介紹,卻花了不少時間來掌握它。
這節課所學內容歸納以下:
如今咱們對如何顯示元素和設置尺寸有了更好的瞭解,接下來咱們深刻了解一下元素的定位。