說到 CSS 佈局這塊的內容,首當其衝的就是咱們的盒模型寬度計算問題,在開始咱們的問題以前,咱們首先要搞懂這些概念:css
content
): 也就是實實在在要展示的內容,好比 P 標籤裏面的文字。在沒有設置box-sizing: border-box
以前咱們能夠把它的寬度理解爲就是width
的值,不包括padding
和border
padding
): 是內容與邊框內部之間的距離border
): 邊框也能夠設置寬度margin
): 盒模型的邊框外部與其餘盒模型邊框外部之間的距離瞭解了這些,咱們再來看下面的幾個進階概念:html
offsetWidth
: 指的是盒模型的邊框(border
) + 內邊距(padding
) + 內容的寬度(width
)clientWidth
: 指的是盒模型的內邊距(padding
) + 內容的寬度(width
)scrollWidth
: 若是內容超出邊框,須要有滾動條,那麼scrollWidth
獲取的是整個文檔的內容(而clientWidth
獲取的只是可見部分的寬度)OK,咱們來看一道簡單的計算題瀏覽器
<style> #main { width: 100px; border: 1px solid #ccc; padding: 10px } </style> //offsetWidth => 122px
很明顯,咱們想要的結果offsetWidth
就等於 100+20+2=122px。那麼,咱們若是想要offsetWidth
=100px,代碼該怎麼寫呢?很簡單,加入一句box-sizing: border-box
就能夠了。app
咱們先來看一段代碼:佈局
/*css*/ p{ margin-top: 10px; margin-bottom: 15px; } /*HTML*/ <p>小宏</p> <p></p> <p></p> <p></p> <p>小宏</p>
運行出來的效果是這樣的:字體
很明顯,並無像咱們想象中的,兩者之間應該會有很大的距離。因此咱們不可貴出:相鄰元素的margin-top
和margin-bottom
是會重疊的,以數值大的爲主。空白內容的塊級標籤也是會重疊的,只不過他們的margin
咱們能夠忽略不計。flex
咱們直接把知識點擺出來:spa
margin-top
、margin-left
設置負值,元素會分別向上、向左移動相應的長度margin-right
設置負值,當前元素的右側元素左移相應的長度,自身不受影響。若是右邊沒有元素,自身也不會受到影響margin-bottom
設置負值,當前元素的下側元素上移相應的長度,自身不受影響。若是下邊沒有元素,自身也不會受到影響咱們來看看效果:3d
何謂 BFC 呢?大部分都將其解析爲塊級格式化上下文,是 Web 頁面中盒模型佈局的 CSS 渲染模式,指一個獨立的渲染區域或者說是一個隔離的獨立容器。其內部元素的渲染不會影響到邊界之外的元素。咱們主要從如下幾個方面來理解它。code
阻止元素被浮動元素覆蓋
兩欄佈局,左邊固定寬度,右邊不設寬,隨瀏覽器自適應
/*html*/ <div class="column"></div> <div class="column"></div> /*css*/ .column:nth-of-type(1) { float: left; width: 200px; height: 300px; margin-right: 10px; background-color: red; } .column:nth-of-type(2) { overflow: hidden;/*建立BFC */ height: 300px; background-color: purple; }
阻止相鄰元素的 margin 合併
咱們在 margin 負值的問題中提到過合併問題。咱們能夠經過設置 BFC 來解決:
/*html*/ <div class="container"> <div class="box1"></div> <div class="box2"></div>//會出現合併的狀況 <div class="wrapper"> <div class="box1"></div>//讓兩者其一處於另外一個BFC中 </div> <div class="box2"></div> </div> /*css*/ .container { overflow: hidden; width: 100px; height: 100px; background-color: red; } .wrapper { overflow: hidden;//設置BFC } .box1 { height: 20px; margin: 10px 0; background-color: green; } .box2 { height: 20px; margin: 20px 0;//未設置BFC,以大的爲準,兩者距離本爲20px background-color: green; }
阻止字體環繞
很簡單,給咱們的 p 標籤設置 BFC 就行了
float 是咱們 CSS 中很是經常使用的屬性了,咱們在開發中常常用它來實現三欄佈局。主要特色是:
1.中間一欄最早加載和渲染 2.兩側內容固定,中間內容隨寬度自適應 3.主要用於 PC
聖盃佈局
聖盃佈局的方法實現主要是針對容器 div 的padding
這塊來下手的,咱們整理一下實現步驟:
padding-left
設置爲 left 欄的寬度,padding-right
設置爲 right 欄的寬度float:left
屬性width:100%
position:relative
;right:[自身寬度]
;margin-left:-100%
margin-right:-[自身寬度]
; 6.注意:要給body
設置min-width
屬性,且值要大於或等於2*left的width+1*right的width
,否則中間會被擠上去這是 HTML 方面的代碼
<div class="container"> <div class="center">中間</div> <div class="left">左</div> <div class="right">右</div> </div>
雙飛翼佈局
雙飛翼佈局的方法實現主要是針對margin
這塊來下手的,相比於聖盃佈局,理解起來也方便一些,只是在 HTML 代碼方面咱們要與聖盃佈局的稍做區別:
<div class="main-container col"> <div class="main">中間(將中間包裹在div中,方便留白)</div> </div> <div class="left col">左</div> <div class="right col">右</div>
咱們整理一下實現步驟:
float: left
屬性,即上面的col
main-container
處留白。給main
框設置margin: 0 left的寬度 0 right的寬度
。left
框設置margin-left: -100%
right
框設置margin-left: -[自身寬度]
body
設置min-width
屬性,且值要大於或等於left的width+right的width
,否則中間會被擠上去回到咱們的聖盃佈局,咱們總以爲好像缺點什麼要素。沒錯,這三欄就像咱們的網頁中主要內容,咱們還應該要有咱們的頭部和尾部佈局。因而咱們理所固然的把上面的 HTML 代碼改爲了下面這樣:
<div class="header">頭部內容</div> <div class="container"> <div class="center">中間</div> <div class="left">左</div> <div class="right">右</div> </div> <div class="footer">底部內容</div>
可渲染出的效果,並非很理想
能夠看到,咱們的底部內容跑到了右邊,而且被 container 框壓住了,這是由於有 float 的緣由。固然,咱們給 footer 一個clear:both
就可讓他下去了,這裏呢,咱們不許備操做 footer,咱們嘗試着本身寫一個 clearFix 來實現這個功能。
/*html*/ <div class="container clearFix"> <div class="center">中間</div> <div class="left">左</div> <div class="right">右</div> </div> /*css*/ .clearFix:after { content: ''; display: table; clear: both; }
flexBox 佈局,指的是在display: flex
下的佈局操做。首先呢,咱們要記住一些咱們常見的有關 flex 的 css 屬性:
flex-direction
定義容器要在哪一個方向上堆疊 flex 項目。有四個屬性值,分別爲:
column
[設置垂直堆疊 flex 項目(從上到下)]column-reverse
[垂直堆疊 flex 項目(從下到上)]row
[水平堆疊 flex 項目(從左到右)]row-reverse
[水平堆疊 flex 項目(從右到左)]justify-content
用於對齊 flex 項目。有五個屬性值,分別爲:
center
[將 flex 項目在容器的中心對齊]flex-start
[將 flex 項目在容器的開頭對齊(默認)]flex-end
[將 flex 項目在容器的末尾對齊]space-around
[顯示行以前、之間和以後帶有空格的 flex 項目]space-between
[顯示行之間帶有空格的 flex 項目]align-items
用於垂直對齊 flex 項目。也有五個屬性值,分別爲:
center
[將 flex 項目在容器的中心對齊]flex-start
[將 flex 項目在容器的頂部對齊]flex-end
[將 flex 項目在容器的底部對齊]stretch
[拉伸 flex 項目填充容器]space-between
[使 flex 項目基線對齊]flex-wrap
規定是否應該對 flex 項目換行.有三個屬性值,分別爲:
wrap
[規定 flex 項目將在必要時進行換行]nowrap
[規定 flex 項目不要換行(默認)]wrap-reverse
[規定 flex 項目將在必要時以相反的順序進行換行]align-self
這個屬性其實是重寫了align-items
,咱們主要來用它實現居中對齊,所以,咱們記住center
這一經常使用屬性值就行了,其餘的屬性值和align-items
差很少。也能夠理解爲align-self: center;
=justify-content: center;align-items: center;
ok,咱們來一個簡單的案例:色子。爲了方便你們看,咱們只實現點數爲3的這一面
/*主要代碼*/ .container{ display: flex; justify-content: space-between;/*容器*/ } .item:nth-child(2){ align-self: center;/*第二個點*/ } .item:nth-child(3){ align-self: flex-end;/*第三個點*/ }
以上就是css常考的一些重要知識點,我也會在後面作出適當的更新補充。下次見!