Flex-彈性佈局

Precipice君發表於2019-04-02

概述

佈局的傳統解決方案是基於盒模型,依賴 display + position+ float 方式來實現,靈活性較差。2009年,W3C提出了一種新的方案-Flex,Flex是Flexible Box的縮寫,意為“彈性佈局”。

常見應用

  • 居中佈局
justify-content:center;//水平居中
align-items:center;//垂直居中
複製程式碼
  • 兩列布局
.left{
    width:200px;
}
.right{
    flex-grow:1;//右邊自適應
}
複製程式碼
  • 三列布局
.left{
    width:200px;
}
.middle{
    flex-grow:1;//中間自適應
}
.right{
    width:200px;
}
複製程式碼

基本概念

Flex-彈性佈局
採用 Flex 佈局的元素,稱為 Flex 容器(flex container),簡稱"容器"。它的所有子元素自動成為容器成員,稱為 Flex 專案(flex item),簡稱"專案"。

Flex-彈性佈局

定義flex容器

通過宣告 display 屬性為 flex或者 inline-flex 來將此元素定義為彈性容器

  • 任何一個容器都可以指定為Flex佈局。
.box {
  display: flex;
複製程式碼
  • 行內元素也可以使用Flex佈局。
.box {
  display: inline-flex;
}
複製程式碼

設為Flex佈局以後,子元素的floatclearvertical-align屬性將失效。

容器屬性

flex-direction屬性

flex-direction 主軸的方向(即專案的排列方向)

.box {
    flex-direction: row | row-reverse | column | column-reverse;
}
    //row(預設值):主軸為水平方向,起點在左端。
    //row-reverse:主軸為水平方向,起點在右端。
    //column:主軸為垂直方向,起點在上沿。
    //column-reverse:主軸為垂直方向,起點在下沿。
複製程式碼

Flex-彈性佈局

flex-wrap屬性

預設情況下,專案都排在一條線(又稱”軸線”)上。 flex-wrap 定義如果排不下,如何換行

.box {
    flex-wrap: nowrap | wrap | wrap-reverse;
}
    //nowrap(預設):不換行
    //wrap:換行,第一行在上方
    //wrap-reverse:換行,第一行在下方
複製程式碼

Flex-彈性佈局

flex-flow屬性

flex-flowflex-directionflex-wrap 的簡寫方式, 預設值為:row nowrap

.box {
    flex-flow: <‘flex-direction’> || <‘flex-wrap’>
}
複製程式碼

justify-content屬性

justify-content 定義彈性專案在主軸上的對齊方式及額外空間的分配方式

.box  {
    justify-content: flex-start | flex-end | center | space-between | space-around | space-evenly;
}
    //對齊方式與軸的方向有關
    //flex-start(預設值):主叉軸的起點對齊,通常為左對齊
    //flex-end:主軸的終點對齊,通常為右對齊
    //center: 居中
    //space-between:兩端對齊,專案之間的間隔都相等。
    //space-around:每個專案兩側的間隔相等。所以,專案之間的間隔比專案與邊框的間隔大一倍。
複製程式碼

Flex-彈性佈局

align-items屬性

align-items 定義彈性專案在交叉軸上如何對齊。

.box {
 align-items: stretch | flex-start | flex-end | center | baseline;
}
 //flex-start:交叉軸的起點對齊。
 //flex-end:交叉軸的終點對齊。
 //center:居中對齊。
 //baseline: 專案的第一行文字的基線對齊。
 //stretch(預設值):如果專案未設定高度或設為auto,將佔滿整個容器的高度。
複製程式碼

Flex-彈性佈局

align-content屬性

align-content 定義多行在側軸的對齊方式及額外空間分配,當只有一行時,不起作用

.box {
    align-content: stretch | flex-start | flex-end | center | space-between | space-around ;
}
    //stretch(預設值):軸線佔滿整個交叉軸。
    //flex-start:與交叉軸的起點對齊。
    //flex-end:與交叉軸的終點對齊。
    //center:與交叉軸的中點對齊。
    //space-between:與交叉軸兩端對齊,軸線之間的間隔平均分佈。
    //space-around:每根軸線兩側的間隔都相等。所以,軸線之間的間隔比軸線與邊框的間隔大一倍。
複製程式碼

Flex-彈性佈局

專案屬性

order屬性

order 定義專案排列順序,數字越小越靠前。

.item {
  order: <integer>; /* 預設 0 */
}
複製程式碼

Flex-彈性佈局

flex-grow屬性

flex-grow 定義專案的放大比例,預設為0,即如果存在剩餘空間,也不放大。

.item {
  flex-grow: <number>; /* 預設 0 */
}
複製程式碼

規則

  • 總可用空間 = 容器大小 - 所有專案flex-basis之和
  • 可擴充套件空間 = 總可用空間/所有專案flex-grow之和
  • 每項空間 = 該項flex-basis + 可擴充套件空間 * 該項flex-grow

flex-shrink屬性

flex-shrink 定義彈性專案縮小比例,預設為1,即如果空間不足,該專案將縮小。

.item {
  flex-shrink: <number>; /* 預設 1 */
}
複製程式碼

規則

只有在flex-wrap: nowrap的情況下,收縮因子才發揮作用。由於新版flex不會將專案無限縮小為0,因此flex-shrink規則相比flex-grow更加複雜。

  • 計算所有專案flex-shrink * flex-basis之和
  • 計算每項收縮因數
    • 收縮因數=(flex-shrink * flex-basis)/第一步計算總和
  • 移除空間的計算
    • 每項移除空間= 該項收縮因數 * 總溢位的空間

flex-basis屬性

flex-basis 定義了在分配多餘空間之前,專案佔據的主軸空間(main size)。瀏覽器根據這個屬性,計算主軸是否有多餘空間。它的預設值為auto,即專案的本來大小。

.item {
  flex-basis: <length> | auto; /* 預設 auto */
}
複製程式碼

flex屬性

flexflex-grow flex-shrink flex-basis 的簡寫,預設值為 0 1 auto。後兩個屬性可選

.item {
  flex: none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ]
}
複製程式碼

快捷值:

  • flex:auto (1 1 auto)
  • flex:none (0 0 auto)
  • flex:1(1 1 0%):等分佈局

align-self屬性

align-self 屬性允許單個專案有與其他專案不一樣的對齊方式,可覆蓋align-items屬性。預設值為auto,表示繼承父元素的align-items屬性,如果沒有父元素,則等同於stretch

.item {
  align-self: auto | flex-start | flex-end | center | baseline | stretch;
}
//auto:(預設)繼承父元素的align-items屬性
//其他五個和align-items屬性一致
複製程式碼

參考:

Flex佈局語法教程

【基礎知識】Flex-彈性佈局原來如此簡單!!

相關文章