1、什麼是 flex 佈局?css
flex 佈局意爲"彈性佈局",用來爲盒狀模型提供最大的靈活性。html
主要思想:給容器控制項目的寬度高度的能力,使用 flex 項目能夠自動填滿容器的可用空間。Flex 容器(父元素)使用 Flex 項目(子元素)能夠自動放大與收縮,用來填補可用的空閒空間。ide
上圖展現的是水平方向的 flex 容器,若 flex-direction 屬性爲豎直方向,則 main axis 的方向爲豎直方向。佈局
flex-direction
屬性。width
或height
屬性,由哪個對着主軸方向決定。width
或height
屬性,由哪個對着側軸方向決定。2、容器的屬性flex
Flex容器不是塊容器,所以有些設計用來控制塊佈局的屬片在Flexbox佈局中不適用。特別是:多列組中全部column-*
屬性、float
、clear
屬性和vertical-align
屬性在Flex容器上沒有做用。spa
一、display:定義一個 flex 容器,決定其爲內聯仍是塊設計
取值:flex(塊) | inline-flex(內聯)code
若是元素 display 的值指定爲 inline-flex,並且元素是一個浮動元素或絕對定位元素,則 display 的計算值是 flex。htm
二、flex-direction:建立方向軸,定義 flex 項目在 flex 容器中放置的方向。blog
取值:row(默認值):主軸爲水平方向,起點在左端
row-reverse:主軸爲水平方向,起點在右端
column:主軸爲垂直方向,起點在上沿
column-reverse:主軸爲垂直方向,起點在下沿
三、flex-wrap:讓 flex 項目多行顯示
取值:nowrap(默認值):單行顯示
wrap:多行顯示,第一行在上方
wrap-reverse:多行顯示,第一行在下方
四、flex-flow:屬性 flex-direction 和 flex-wrap 屬性的簡寫
五、justify-content:定義項目在主軸上的對齊方式
取值:flex-start(默認值):左對齊
flex-end:右對齊
center:居中
space-between:兩端對齊,項目之間的間隔都相等
space-around:每一個項目兩側的間隔相等。因此,項目之間的間隔比項目與邊框的間隔大一倍。
六、align-items:定義項目在交叉軸上的對齊方式
取值:flex-start:交叉軸的起點對齊
flex-end:交叉軸的終點對齊
center:交叉軸的中點對齊
baseline:項目的第一行文字的基線對齊
stretch(默認值):若是項目未設置高度或設爲 auto,將佔滿整個容器的高度。
七、align-content:定義多跟軸線的對齊方式。若只有一根軸線,則該屬性不起做用。
取值:flex-start:與交叉軸的起點對齊
flex-end:與交叉軸的終點對齊
center:與交叉軸的中點對齊
space-between:與交叉軸兩端對齊,軸線之間的間隔平均分佈
space-around
:每根軸線兩側的間隔都相等。因此,軸線之間的間隔比軸線與邊框的間隔大一倍
stretch
(默認值):軸線佔滿整個交叉軸
3、項目的屬性
一、order:定義項目的排列順序,數值越小排列越靠前,默認爲0
二、flex-grow:定義項目的放大比例,默認爲0
,即若是存在剩餘空間,也不放大
三、flex-shrink:定義項目的縮小比例,默認爲1,即若是空間不足,該項目縮小
四、flex-basis:定義 flex 項目在分配多餘空間以前的一個默認尺寸。默認值是 auto,即項目原本的大小。
五、flex:是 flex-grow
,flex-shrink
和 flex-basis
三個屬性的縮寫。第二個和第三個參數( flex-shrink
和 flex-basis
)是可選值。其默認值是 0 1 auto
。
六、align-self:容許單個項目與其餘項目有不同的對齊方式。可覆蓋align-items
屬性。默認值爲auto
,表示繼承父元素的align-items
屬性,若是沒有父元素,則等同於stretch
。
取值:auto | flex-start | flex-end | center | baseline | stretch;
4、實例
1 <!DOCTYPE html> 2 <html lang="en"> 3 4 <head> 5 <meta charset="UTF-8"> 6 <title>Flex 佈局</title> 7 <style> 8 /* basic style sheet */ 9 * { 10 box-sizing: border-box; 11 } 12 html, body { 13 height: 100%; 14 } 15 body { 16 display: flex; 17 align-items: center; 18 justify-content: center; 19 vertical-align: center; 20 flex-wrap: wrap; 21 align-content: center; 22 font-family: 'Open Sans', sans-serif; 23 background: linear-gradient(top, #222, #333); 24 } 25 [class^=box] { 26 margin: 16px; 27 padding: 4px; 28 background-color: #e7e7e7; 29 width: 104px; 30 height: 104px; 31 object-fit: contain; 32 box-shadow: inset 0 5px white, 33 inset 0 -5px #bbb, 34 inset 5px 0 #d7d7d7, 35 inset -5px 0 #d7d7d7; 36 border-radius: 10%; 37 } 38 .item { 39 display: block; 40 width: 24px; 41 height: 24px; 42 border-radius: 50%; 43 margin: 4px; 44 background-color: #333; 45 box-shadow: inset 0 3px #111, inset 0 -3px #555; 46 } 47 [class^=box] { 48 display: flex; 49 } 50 .box-1 { 51 justify-content: center; /* 項目在主軸上的對齊方式,此例中爲水平方向對齊方式 */ 52 align-items: center; /* 項目在交叉軸上的對齊方式,此例中爲豎直方向對齊方式 */ 53 } 54 .box-2 { 55 justify-content: space-between; 56 } 57 /* :nth-of-type(N) 選擇器匹配屬於父元素的特定類型的第 N 個子元素的每一個元素 */ 58 .box-2 .item:nth-of-type(2) { 59 align-self: flex-end; /* 定義單個項目與其餘項目具備不同的對齊方式 */ 60 } 61 .box-3 { 62 } 63 .box-3 .item:nth-of-type(2) { 64 justify-content: center; 65 align-self: center; 66 } 67 .box-3 .item:nth-of-type(3) { 68 align-self: flex-end; 69 } 70 .box-4, .box-6 { 71 justify-content: space-between; 72 } 73 .column { 74 display: flex; 75 flex-direction: column; /* 建立方向軸,column表示主軸爲垂直方向,起點在上沿 */ 76 justify-content: space-between; /* 項目在主軸上的對齊方式,space-between 表示兩端對齊 */ 77 } 78 .box-5 { 79 justify-content: space-between; 80 } 81 .box-5 .column:nth-of-type(2), .box-7 .column:nth-of-type(2) { 82 justify-content: center; 83 } 84 .box-8 .column:nth-of-type(2) { 85 justify-content: space-around; 86 } 87 </style> 88 </head> 89 90 <body> 91 <div class="box-1"> 92 <span class="item"></span> 93 </div> 94 95 <div class="box-2"> 96 <span class="item"></span> 97 <span class="item"></span> 98 </div> 99 100 <div class="box-3"> 101 <span class="item"></span> 102 <span class="item"></span> 103 <span class="item"></span> 104 </div> 105 106 <div class="box-4"> 107 <div class="column"> 108 <span class="item"></span> 109 <span class="item"></span> 110 </div> 111 <div class="column"> 112 <span class="item"></span> 113 <span class="item"></span> 114 </div> 115 </div> 116 117 <div class="box-5"> 118 <div class="column"> 119 <span class="item"></span> 120 <span class="item"></span> 121 </div> 122 <div class="column"> 123 <span class="item"></span> 124 </div> 125 <div class="column"> 126 <span class="item"></span> 127 <span class="item"></span> 128 </div> 129 </div> 130 131 <div class="box-6"> 132 <div class="column"> 133 <span class="item"></span> 134 <span class="item"></span> 135 <span class="item"></span> 136 </div> 137 <div class="column"> 138 <span class="item"></span> 139 <span class="item"></span> 140 <span class="item"></span> 141 </div> 142 </div> 143 144 <div class="box-7"> 145 <div class="column"> 146 <span class="item"></span> 147 <span class="item"></span> 148 <span class="item"></span> 149 </div> 150 <div class="column"> 151 <span class="item"></span> 152 </div> 153 <div class="column"> 154 <span class="item"></span> 155 <span class="item"></span> 156 <span class="item"></span> 157 </div> 158 </div> 159 160 <div class="box-8"> 161 <div class="column"> 162 <span class="item"></span> 163 <span class="item"></span> 164 <span class="item"></span> 165 </div> 166 <div class="column"> 167 <span class="item"></span> 168 <span class="item"></span> 169 </div> 170 <div class="column"> 171 <span class="item"></span> 172 <span class="item"></span> 173 <span class="item"></span> 174 </div> 175 </div> 176 177 <div class="box-9"> 178 <div class="column"> 179 <span class="item"></span> 180 <span class="item"></span> 181 <span class="item"></span> 182 </div> 183 <div class="column"> 184 <span class="item"></span> 185 <span class="item"></span> 186 <span class="item"></span> 187 </div> 188 <div class="column"> 189 <span class="item"></span> 190 <span class="item"></span> 191 <span class="item"></span> 192 </div> 193 </div> 194 </body> 195 196 </html>