網頁佈局(layout)是CSS的一個重點應用。
Flex英文爲 flexiable box,翻譯爲彈性盒子,Flex佈局即彈性佈局。
安全
Flex佈局爲盒子模型提供了很大的靈活性,任何一個容器均可以指定爲Flex佈局,設置方法爲:bash
.box{
display: flex;
}複製代碼
行內元素也可使用Flex佈局。ide
.box{
display: inline-flex;
}複製代碼
Webkit內核的瀏覽器,必須加上-webkit前綴。佈局
.box{
display: -webkit-flex; /* Safari */
display: flex;
}複製代碼
注意,設爲Flex佈局之後,子元素的float、clear和vertical-align屬性將失效,(並且能夠嵌套使用。)flex
採用Flex佈局的元素,稱爲Flex容器(flex container),簡稱」容器」。它的全部子元素自動成爲容器成員,稱爲Flex項目(flex item),簡稱」項目」。ui
容器默認存在兩根軸:水平的主軸(main axis)和垂直的交叉軸(cross axis)。主軸的開始位置(與邊框的交叉點)叫作main start,結束位置叫作main end;交叉軸的開始位置叫作cross start,結束位置叫作cross end。spa
項目默認沿主軸排列。單個項目佔據的主軸空間叫作main size,佔據的交叉軸空間叫作cross size。
flex-direction;
flex-wrap;
flex-flow;
justify-content;
align-items;
align-content;複製代碼
flex-direction屬性決定主軸的方向(即項目的排列方向)。它可能有四個值:
.box {
flex-direction: row | row-reverse | column | column-reverse;
}複製代碼
flex-direction : row-reverse,主軸爲水平方向,起點在右端。效果:
flex-direction : column,主軸爲垂直方向,起點在上沿。效果:
flex-direction : column-reverse,主軸爲垂直方向,起點在下沿。效果:
完整代碼 :
HTML 部 分:
<div class="box">
<span>love1</span>
<span>love2</span>
<span>love3</span>
<span>love4</span></div>
CSS 部分:
<style>
.box{
display: flex;
display: -webkit-flex;
/*水平方向,左端對齊*/
flex-direction: row;
/*水平方向,右端對齊*/
/* flex-direction: row-reverse; */
/*垂直方向,頂部對齊*/
/* flex-direction: column; */
/*垂直方向,底部對齊*/
/* flex-direction: column-reverse; */
background: #999;
width: 100%;
}
.box span{
margin: 10px 10px;
padding: 10px;
background: #ff0;
width: 50px;
}
</style>
複製代碼
默認狀況下,項目都排在一條線(又稱」軸線」)上。flex-wrap屬性定義,若是一條軸線排不下,如何換行。它可能取三個值。
.box{
flex-wrap: nowrap | wrap | wrap-reverse;
}複製代碼
(1)當設置爲 flex-wrap : nowrap(默認),效果(不換行,默認會縮放):
(2)flex-wrap : wrap,換行,第一行在上方。
(3)flex-wrap : wrap-reverse,換行,第一行在下方。
完整代碼:
<style>
.box{
display: flex;
display: -webkit-flex;
/*不換行,默認*/
/* flex-wrap: nowrap; */
/*換行*/
/* flex-wrap: wrap; */
/*換行,第一行在下方*/
/* flex-wrap: wrap-reverse; */
background: #999;
width: 100%;
}
.box span{
margin: 10px 10px;
padding: 10px;
background: #ff0;
width: 50px;
}
</style>
HTML 代碼:
<div class="box">
<span>love1</span>
<span>love2</span>
<span>love3</span>
<span>love4</span>
<span>love5</span>
<span>love6</span>
<span>love7</span>
<span>love8</span>
</div>
複製代碼
flex-flow 屬性是 flex-direction 屬性和 flex-wrap 屬性的簡寫形式,默認值爲 row nowrap。
.box {
flex-flow: <flex-direction> <flex-wrap>;
}複製代碼
justify-content屬性定義了項目在主軸上的對齊方式。
.box {
justify-content: flex-start | flex-end | center | space-between | space-around;
}複製代碼
它可能取5個值,具體對齊方式與軸的方向有關。下面假設主軸爲從左到右。
完整代碼:
CSS代碼:
<style>
.box{
display: flex;
display: -webkit-flex;
/*默認,項目左對齊*/
/* justify-content: flex-start; */
/*項目右對齊*/
/* justify-content: flex-end; */
/*項目居中對齊*/
/* justify-content: center; */
/*項目兩端對齊*/
/* justify-content: space-between; */
/*每一個項目兩側的間隔相等*/
justify-content: space-around;
background: #999;
width: 100%; }
.box span{
margin: 10px 10px;
padding: 10px;
background: #ff0;
width: 50px;
}
</style>
HTML代碼:
<div class="box">
<span>love1</span>
<span>love2</span>
<span>love3</span>
<span>love4</span>
<span>love5</span>
<span>love6</span>
<span>love7</span>
<span>love8</span>
</div>
複製代碼
align-items屬性定義項目在交叉軸上如何對齊。
.box {
align-items: flex-start | flex-end | center | baseline | stretch;
}複製代碼
它可能取5個值。具體的對齊方式與交叉軸的方向有關,下面假設交叉軸從上到下。
完整代碼:
<style type="text/css">
.box{
display: flex;
display: -webkit-flex;
/*縱軸的頂部對齊*/
/*align-items: flex-start;*/
/*縱軸的底部對齊*/
/*align-items: flex-end;*/
/*縱軸的中點對齊*/
/*align-items: center;*/
/*項目的第一行文字的基線對齊*/
/*align-items: baseline;*/
/*默認對齊方式,若是項目未設置高度或設爲auto,將佔滿整個容器的高度*/
align-items: stretch;
background: #999;
width: 100%;
}
.box span{
margin: 10px 10px;
padding: 10px;
background: #ff0;
width: 50px;
}
.box span:nth-of-type(2n){
height: 80px;
padding-top: 20px;
}
</style>
<div class="box">
<span>love1</span>
<span>love2</span>
<span>love3</span>
<span>love4</span>
<span>love5</span>
<span>love6</span>
<span>love7</span>
<span>love8</span>
</div>複製代碼
align-content 屬性定義了多根軸線的對齊方式。若是項目只有一根軸線,該屬性不起做用 (即須要設置容器的 flex-wrap 屬性值爲 wrap )(爲了讓效更加明顯,我設置了容器的高度)
.box {
align-content: flex-start | flex-end | center | space-between | space-around | stretch;
}複製代碼
該屬性可能取6個值。
完整代碼:
CSS 代碼:
<style>
.box{
display: flex;
display: -webkit-flex;
//若是項目只有一根軸線,該屬性不起做用 (即須要設置容器的 flex-wrap 屬性值爲 wrap )
flex-wrap: wrap;
/*與縱軸的頂部對齊*/
/*align-content: flex-start;*/
/*與縱軸的底部對齊*/
/*align-content: flex-end;*/
/*與縱軸的中點對齊*/
/*align-content: center;*/
/*與縱軸兩端對齊*/
/*align-content: space-between;*/
/*每根軸線兩側的間隔都相等*/
align-content: space-around;
/*默認值,軸線佔滿整個交叉軸默認值,*/
/* align-content: stretch; */
background: #999;
width: 600px;
height: 300px;
}
.box span{
margin: 10px 10px;
padding: 10px;
background: #ff0;
width: 50px;
}
</style>
HTML 代碼:
<div class="box">
<span>love1</span>
<span>love2</span>
<span>love3</span>
<span>love4</span>
<span>love5</span>
<span>love6</span>
<span>love7</span>
<span>love8</span>
</div>複製代碼
如下6個屬性設置在項目上。
order屬性定義項目的排列順序。數值越小,排列越靠前,默認爲0。
.item {
order: <integer>;
}複製代碼
以下爲第1個設置order屬性爲10,第2個設置order屬性爲-1,第5個設置order屬性爲-10,效果以下
代碼:
CSS:
<style>
.box{
display: flex;
display: -webkit-flex;
background: #999;
}
.box span{
margin: 10px 10px;
padding: 10px;
background: #ff0;
}
.box span:nth-of-type(1){
order: 10;
}
.box span:nth-of-type(2){
order: -1;
}
.box span:nth-of-type(5){
order: -10;
}
</style>
HTML 代碼:
<div class="box">
<span>love1</span>
<span>love2</span>
<span>love3</span>
<span>love4</span>
<span>love5</span>
</div>
複製代碼
flex-grow屬性定義項目的放大比例,主要在父元素的寬度大於子元素的寬度之和時候起做用,它定義子元素如何分配父元素的剩餘寬度,默認爲0,這個時候不索取父元素的寬度。
.item {
flex-grow: <number>; /* default 0 */
}複製代碼
以下,給第1個子元素設置 flex-grow 屬性值爲1,第2個子元素設置 flex-grow 屬性值爲2,則父元素的剩餘寬度會被分紅三等分,分別添加給第1個第2個子元素,效果以下:
代碼:
CSS 代碼:
<style>
.box{
display: flex;
display: -webkit-flex;
background: #999;
}
.box span{
margin: 10px 10px;
padding: 10px;
background: #ff0;
width: 50px;
}
.box span:nth-of-type(1){
flex-grow: 1;
}
.box span:nth-of-type(2){
flex-grow: 2;
}
</style>
HTML 代碼:
<div class="box">
<span>love1</span>
<span>love2</span>
<span>love3</span>
<span>love4</span>
<span>love5</span>
</div>
複製代碼
例如:以上面的爲例子,假設父元素的寬度爲 1000px ,每一個子元素的寬度爲100px,則還剩餘500px 的寬度,第1個子元素 flex-grow 值爲 1,第2個子元素 flex-grow 值爲 2,則會把500px分紅三等分,第1個子元素增長500乘以1/3px的寬度,第2個子元素增長500乘以2/3px的寬度
flex-shrink 屬性定義了項目的縮小比例,默認爲1,即若是空間不足,該項目將縮小。
.item {
flex-shrink: <number>; /* default 1 */
}複製代碼
若是全部項目的flex-shrink屬性都爲1,當空間不足時,都將等比例縮小。若是一個項目的flex-shrink屬性爲0,其餘項目都爲1,則空間不足時,前者不縮小。
負值對該屬性無效。
flex-basis屬性定義了在分配多餘空間以前,項目佔據的主軸空間(main size)。瀏覽器根據這個屬性,計算主軸是否有多餘空間。它的默認值爲auto,即項目的原本大小。
.item {
flex-basis: <length> | auto; /* default auto */
}複製代碼
它能夠設爲跟width或height屬性同樣的值(好比350px),則項目將佔據固定空間。
flex屬性是flex-grow, flex-shrink 和 flex-basis的簡寫,默認值爲0 1 auto。後兩個屬性可選。
.item {
flex: none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ]
}複製代碼
該屬性有兩個快捷值:auto (1 1 auto) 和 none (0 0 auto)。
建議優先使用這個屬性,而不是單獨寫三個分離的屬性,由於瀏覽器會推算相關值。
align-self屬性容許單個項目有與其餘項目不同的對齊方式,可覆蓋align-items屬性。默認值爲auto,表示繼承父元素的align-items屬性,若是沒有父元素,則等同於stretch。
.item {
align-self: auto | flex-start | flex-end | center | baseline | stretch;
}複製代碼
該屬性可能取6個值,除了auto,其餘都與align-items屬性徹底一致。
代碼:
CSS 代碼:
<style>
.box{
display: flex;
display: -webkit-flex;
background: #999;
height: 300px;
align-items: flex-start;
}
.box span{
margin: 10px 10px;
padding: 10px;
background: #ff0;
}
.box span:nth-of-type(3){
align-self: flex-end;
}
</style>
HTML 代碼:
<div class="box">
<span>love1</span>
<span>love2</span>
<span>love3</span>
<span>love4</span>
<span>love5</span>
</div>複製代碼