公式:結果 = 目標/上下文 即 元素大小除以元素所在的容器
自從有了flex,float已經能夠說是後孃養的了。css
那麼問題來了,如何實現flex佈局html
<!doctype html> <html> <head> <title></title> <meta charset="utf-8" /> <style type="text/css"> .flex{ display: flex; } </style> </head> <body> <div class="flex"></div> </body> </html>
如上面代碼,元素設置了display: flex
時,就是一個彈性盒子了。佈局
在彈性盒子裏的塊級元素,排成了一行,就如同行內元素同樣,和使用float沒啥區別。flex
但要注意的是父元素設置了flex
後,子元素的float
、clear
、ertical-align
屬性將失效。spa
最後行內元素也能夠設置flex
,不必定要塊級元素。code
<!doctype html> <html> <head> <title></title> <meta charset="utf-8" /> <style type="text/css"> .flex{ display: flex; background: pink; } .flex div{ width: 100px; height: 100px; margin: 10px; background: skyblue; } </style> </head> <body> <div class="flex"> <div></div> <div></div> <div></div> <div></div> <div></div> </div> </body> </html>
結下了咱們稱定義了display: flex
爲flex容器,而其子元素叫作flex項目htm
默認狀況下主軸就是橫軸,屬性是justify-content
,側軸就是縱軸,屬性是align-items
utf-8
看下這兩個屬性的值it
那麼用flex佈局來實現水平垂直居中對齊就很簡單了io
<!doctype html> <html> <head> <title></title> <meta charset="utf-8" /> <style type="text/css"> .flex{ height: 500px; display: flex; background: pink; justify-content: center; align-items: center; } .flex div{ width: 100px; height: 100px; margin: 10px; background: skyblue; } </style> </head> <body> <div class="flex"> <div></div> </div> </body> </html>
注意:橫軸和縱軸這兩個屬性是寫在flex容器裏的,不是寫在flex項目的。
能夠試着改變橫軸和縱軸的屬性值,看子元素的位置變化,能夠更好的瞭解flex佈局
這個是決定哪一個是主軸,以前默認的主軸就是橫軸
試下改變代碼中flex-direction
的屬性值,看子元素的變化
<!doctype html> <html> <head> <title></title> <meta charset="utf-8" /> <style type="text/css"> .flex{ height: 500px; display: flex; background: pink; flex-direction: column; } .flex div{ width: 100px; height: 100px; margin: 10px; } .flex div:nth-child(1){ background: green; } .flex div:nth-child(2){ background: skyblue; } .flex div:nth-child(3){ background: brown; } </style> </head> <body> <div class="flex"> <div></div> <div></div> <div></div> </div> </body> </html>
注意:若是你將主軸設置爲column
或column-reverse
,那麼屬性align-items
表明的就是水平的,而屬性justify-content
是垂直的。其實也就是和默認的主軸反過來了,具體用法和以前主軸爲橫軸是同樣的。
用於設置彈性元素自身在側軸(縱軸)方向上的對齊方式。(容許單個子元素與其餘子元素不同的對齊方式)
以前的例子來看,子元素都是被統一管理,居中就所有都居中,這個屬性就是讓某些元素,可以和其餘元素有不同的對其方式
<!doctype html> <html> <head> <title></title> <meta charset="utf-8" /> <style type="text/css"> .flex{ height: 500px; display: flex; background: pink; justify-content: center; align-items: center; } .flex div{ width: 100px; height: 100px; margin: 10px; } .flex div:nth-child(1){ background: green; } .flex div:nth-child(2){ background: skyblue; } .flex div:nth-child(3){ background: brown; } </style> </head> <body> <div class="flex"> <div></div> <div></div> <div></div> </div> </body> </html>
上面這段代碼,子元素都水平垂直居中了,接下來要讓第一個子元素,在上方。
改變CSS代碼
.flex div:nth-child(1){ background: green; align-self: flex-start; }
項目的排列順序,越小,排列越靠前
<!doctype html> <html> <head> <title></title> <meta charset="utf-8" /> <style type="text/css"> .flex{ height: 500px; display: flex; background: pink; justify-content: center; align-items: center; } .flex div{ width: 100px; height: 100px; margin: 10px; } .flex div:nth-child(1){ background: green; order: 2; } .flex div:nth-child(2){ background: skyblue; order: 3; } .flex div:nth-child(3){ background: brown; order: 1; } </style> </head> <body> <div class="flex"> <div></div> <div></div> <div></div> </div> </body> </html>
flex:int 數值表明該子元素所佔據的比例大小
flex是三個屬性的融合
flex-grow
定義彈性盒子元素的擴展比率。flex-shrink
定義彈性盒子元素的收縮比率。空間不足時flex-basis
定義彈性盒子元素的默認基準值。接下來看這段代碼
<!doctype html> <html> <head> <title></title> <meta charset="utf-8" /> <style type="text/css"> .flex{ height: 500px; display: flex; background: pink; } .flex div{ width: 100px; height: 100px; margin: 10px; background: #000; } .flex div:nth-child(1){ background: green; } .flex div:nth-child(2){ background: skyblue; } .flex div:nth-child(3){ background: brown; } </style> </head> <body> <div class="flex"> <div></div> <div></div> <div></div> </div> </body> </html>
這時候我想讓這三個子元素等比例,佔滿父容器,只要添加flex: 1
便可,這個樣式也能夠寫成flex-grow: 1
改變關鍵CSS代碼
.flex div{ width: 100px; height: 100px; margin: 10px; flex: 1; background: #000; }
以前關於flex的代碼都是寫在父元素上的,這個flex
屬性要寫在子元素裏
接下來再看另外一段代碼
<!doctype html> <html> <head> <title></title> <meta charset="utf-8" /> <style type="text/css"> .flex{ height: 500px; display: flex; background: pink; } .flex div{ width: 100px; height: 100px; margin: 10px; background: #000; } .flex div:nth-child(1){ background: green; } .flex div:nth-child(2){ background: skyblue; } .flex div:nth-child(3){ background: brown; } </style> </head> <body> <div class="flex"> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> </div> </body> </html>
子元素的div變多了,並且寬度被壓縮了,如何讓寬度保持不變,添加flex-shrink
,讓其值爲0
改變CSS代碼
.flex div{ width: 100px; height: 100px; margin: 10px; flex-shrink: 0; background: #000; }
而後發現一個問題,子元素過多,超過了父級元素,溢出了,這時候就要換行。
用於指定彈性盒子的子元素換行方式
nowrap
默認, 彈性容器爲單行。該狀況下彈性子項可能會溢出容器。wrap
彈性容器爲多行。該狀況下彈性子項溢出的部分會被放置到新行,子項內部會發生斷行wrap-reverse
反轉 wrap 排列。那麼這時只要在flex容器設置這個屬性就好了
.flex{ height: 500px; display: flex; background: pink; flex-wrap: wrap; }
用於修改 flex-wrap 屬性的行爲。相似於 align-items, 但它不是設置彈性子元素的對齊,而是設置各個行的對齊。
若是是正常操做,這時候的頁面子元素應該排成兩行了,這個屬性能夠將每一行看作一個flex項目
.flex{ height: 500px; display: flex; background: pink; flex-wrap: wrap; align-content: space-around; }
做用在flex容器的屬性
flex項目的屬性