Flexbox是一個強大而靈活的佈局,本篇文章主要對其進行學習瞭解。css
Flexbox佈局(Flexible Box)模塊旨在提供一個更加有效的方式制定、調整和分佈一個容器裏的項目佈局,即便他們的大小是未知或者是動態的。簡單的理解,就是能夠自動調整,計算元素在容器空間中的大小,並進行有效合理的佈局。html
Flexbox佈局中有兩個重要的概念:Flex容器和Flex項目。前端
Flex容器包含多個Flex項目,經過對Flex容器和Flex項目的具體屬性進行設置,能夠達到各類各樣靈活的佈局樣式。css3
Flexbox的使用很是簡單,只須要對Flex容器設置display:flex
或者display:inline-flex
,就能夠具體操做使用Flexbox佈局了。佈局
下面以具體示例演示:學習
html代碼flex
<div class="container">
<div class="wrap">
<div></div>
<div></div>
<div></div>
</div>
</div>
複製代碼
css代碼flexbox
.container {
width: 70%;
height: 500px;
margin:20px auto;
border: 1px solid black;
}
.container .wrap {
display: flex;
border: 3px solid #a448cf;
margin:20px;
width:80%;
height:80%
}
.container .wrap div {
width:150px;
height:150px;
background-color: #c75a5a;
margin:10px;
}
複製代碼
首先介紹下Flex容器的具體屬性以及具體的使用方式。spa
屬性 | 值 | 含義 |
---|---|---|
flex-direction | row || column || row-reverse || column-reverse | 控制Flex項目沿着主軸(Main Axis)的排列方向 |
flex-wrap | wrap || nowrap || wrap-reverse | 控制Flex項目是否換行顯示 |
flex-flow | row wrap|| row nowrap || column wrap || column nowrap 等 | flex-direction和flex-wrap兩個屬性的組合速記屬性 |
justify-content | flex-start || flex-end || center || space-between || space-around | 控制 Flex項目在Main-Axis上的對齊方式 |
align-items | flex-start || flex-end || center || stretch || baseline | 控制Flex項目在Cross-Axis對齊方式 |
align-content | flex-start || flex-end || center || stretch | 用於多行的Flex容器,控制Flex項目在Cross-Axis對齊方式 |
flex-direction
屬性控制Flex項目沿着主軸(Main Axis)的排列方向,能夠是行(水平)、列(垂直)或者行和列的反向。3d
默認狀況下flex-direction
的屬性值是row
,具體排列方式以下:
可是當flex-direction
的屬性值是column
,對應的主軸就應該垂直向下。
具體應用示例以下:
flex-wrap
屬性控制Flex項目是否換行。默認狀況下,Flex容器會在一行內容納全部的Flex項目,由於flex-wrap
屬性的默認值是nowrap
,也就是不換行。
具體應用示例以下:
其中wrap-reverse
表示Flex項目在容器中多行排列,只是方向是反的。
flex-flow
是flex-direction
和flex-wrap
兩個屬性的速記屬性。
具體再也不解釋,看下面示例便可:
justify-content
屬性,控制Flex項目在整個Main-Axis上的對齊方式。
justify-content
的默認屬性值是flex-start
。
space-between
讓flex項目兩端對齊。
space-around
讓每一個flex項目具備相同的空間
align-items
控制Flex項目在Cross-Axis對齊方式。
align-items
的默認值是stretch
,讓全部的Flex項目高度和Flex容器高度同樣,鋪展開。
baseline
讓全部flex項目在Cross-Axis上沿着他們本身的基線對齊。
其中stretch
和baseline
在不設置具體高度值,纔會如上表現,不然會顯示固定的高度。
align-content
屬性與align-items
做用相同,不過該屬性只針對多行,對單行無效。
接下來繼續介紹Flex項目的具體屬性及使用方法。
屬性 | 值 | 含義 |
---|---|---|
order | 數值 | 根據order 值從新排序。從底到高。 |
flex-grow | 0 || positive number | 控制Flex項目在容器有多餘的空間如何放大 |
flex-shrink | 0 || positive number | 控制Flex項目在容器 沒有額外空間又如何縮小 |
flex-basis | auto || % || em || rem || px | 指定Flex項目的初始大小 |
align-self | auto || flex-start || flex-end || center || baseline || stretch | 控制單個Flex項目在Cross-Axis對齊方式 |
order
容許Flex項目在一個Flex容器中從新排序,屬性默認值是0。
依據order
值的大小進行排序,按照值從低到高依次排序。
默認狀況下,排序以下:
當將方塊1設置order:1
後,排序以下:
若是,多個Flex項目具備相同的order
值,Flex項目從新排序是基於HTML源文件的位置進行排序。
以下所示,將方塊1和方塊2都設置爲order:1
。
flex-grow
和flex-shrink
屬性控制Flex項目在容器有多餘的空間如何放大(擴展),在沒有額外空間又如何縮小。
flex-grow
和flex-shrink
的值能夠爲 0或者大於0的任何正數。
默認狀況下,flex-grow
屬性值設置爲0
,表示Flex項目不會增加,填充Flex容器可用空間。
默認狀況下,flex-shrink
屬性值設置爲1,表示Flex項目會縮小,適應屏幕寬度。
若是把flex-grow
的值設置爲1
,以下所示:
當多個flex項目在一行內,即不換行時,設置不一樣的flex-grow
和flex-shrink
值,對應的空間分配也不一樣。
flex-grow
將每個item所設置的 grow 所有加起來,得到可用空間,而後除以總的grow值,獲得單位分配空間。
根據每個item 設置的 grow 來算,若是一個item 的grow 爲 6,那麼 這個 item 在主軸上的尺寸就須要延伸 6*單位分配空間的大小。
flex-shrink
先將全部項目 按照 flex-shrink * item-size
的方式加起來 獲得一個加權和,而後計算出 每一份 item 的 shrink比例: shrink比例 = flex-shrink * item-size / 以前的總和。最後每個item 減去這個 shrink比例 * 負可用空間
。
在flex項目有min-width(height)
和max-width(height)
時,對應的項目要考慮上下限值,把剩餘的伸縮值分配給其餘項目。
flex-basis
指定了 flex 元素在主軸方向上的初始大小,即決定了 flex項目內容的寬或者高(取決於主軸的方向)的尺寸大小。
默認狀況,Flex項目的初始寬度由flex-basis
的默認值決定,即:flex-basis: auto
。Flex項目寬度的計算是基於內容的多少來自動計算。
flex-basis
和width/height
有必定的優先級,具體規則以下:
align-self
控制單個項目沿着Cross-Axis的對其方式。
除了auto
以外,上述示例中flex容器設置了align-itmes:center
。
auto
是將目標flex項目的值設置爲父元素的 align-items
值,或者若是該元素沒有父元素的話,就設置爲 stretch
。上述示例中align-items:stretch
。
以上是對flexbox的總體介紹,能夠看出其強大與靈活。除此以外,flexbox還有不少其餘的特性以及問題,這裏就再也不介紹,建議看如下兩篇文章,寫的很好,本文也主要參考了這兩篇文章。
若是想實踐一下對flexbox的掌握,能夠試着作百度前端技術學院中的這個做業。