先來點顧名思義,Flex,摺疊;box,盒子。可以摺疊的盒子,也稱作彈性盒子,就是可以根據可用的空間進行縮放的網頁元素。

既然是盒子,那麼肯定有容器,又有容器內部的元素。

那麼具體怎麼縮放呢?我們通過幾個例子來看看 Flex 的基本用法……

伸展、收縮和基準

Flex 的縮放,影響的是容器內部的元素。

要用 Flex,首先得把容器設置為 Flex。

可以通過設置容器 display: flex; 輕易做到這一點。

好了,現在容器變成彈性盒子了,裏面的元素會如何佈局呢?

讓我們看看下面的示例:

<div class="container">
  <div class="content">This is an item</div>
  <div class="content">This is an item</div>
  <div class="content">This is an item</div>
</div>

我們還沒有增加任何 CSS,這時候,網頁元素按照上一篇裏面説的正常佈局流顯示,也就是從上到下。

給萌新的Flexbox簡易入門教程 - 葡萄城技術團隊博客 -_html

正常佈局

那麼我們先把它變成彈性盒子試試:

.container{
  display: flex;
}
.content{
  border: 1px solid red;
}

是的,現在它們變成了橫向堆疊。(方向的問題之後再解釋)

給萌新的Flexbox簡易入門教程 - 葡萄城技術團隊博客 -_#前端_02

橫向堆疊

現在,我們嘗試把可視範圍壓縮下,當橫向沒有空間時,會發生什麼?

給萌新的Flexbox簡易入門教程 - 葡萄城技術團隊博客 -_html_03

讓我們摺疊!

可以看到,當橫向空間不足,整個元素自動橫向收縮。由於字必須顯示,因此換行到了第二行。只有一行只有一個單詞的時候,才會溢出(因為不能截斷單詞)

這種行為由 flex 屬性控制,它是以下三個屬性的縮寫:

  • • flex-grow(控制放大)
  • • flex-shrink(控制收縮)
  • • flex-basis(控制元素的基礎大小)

默認情況下,設置為 flex: 0 1 auto

也就是説,上面的代碼,與下面都是等效的。

.content{
border: 1px solid red;
flex: 01 auto;
}
/* 或者,和下面也是等效的 */
.content{
border: 1px solid red;
flex-grow: 0;
flex-shrink: 1;
flex-basis: auto;
}

我知道你很急,但你先別急。接下來我們就來看看這三個屬性。

flex-grow/shrink

這個元素控制了元素是否伸展,以及不同元素之間的伸展比例。

試一試,把上面值從 0 改成 1。

給萌新的Flexbox簡易入門教程 - 葡萄城技術團隊博客 -_#前端_04

伸展的元素

發現了嗎?現在,元素自動佔滿了整個空間。也就是説,設定為 0,就是不伸展,非 0,就是允許伸展。

為什麼説非 0 呢?

因為這個數字表示比例。

也就是説,如果你給不同元素設定不同數字,那麼它們就會按照不同的比例進行縮放。

比如……

.content1{
  flex-grow: 1;
}
.content2{
  flex-grow: 2;
}
.content3{
  flex-grow: 3;
}

自己試一試,你會發現它們按照 1:2:3 進行放大。

也就是説,設定為 100:100 和 1:1 的效果是完全一致的。

收縮也同理啦。0 不允許收縮。其它數字就是收縮比例。

flex-basis

你有沒有發現,我們上面都在討論縮放

當我們談到縮放時,是對原先就有的東西,進行縮小和放大。

而 flex-basis,就是定義這個“縮放基準”。默認情況下,會根據你的文字長度自動決定,也就是 auto。

現在我們先把放大關掉,然後嘗試改變窗口大小:

.content{
  border: 1px solid red;
  flex: 0 1 200px;
}

給萌新的Flexbox簡易入門教程 - 葡萄城技術團隊博客 -_縮放_05

定義縮放基準

看到了嗎?當達到 200px 的時候,不再放大,因為不允許放大。200px 為一個基準。

實際上,使用 width 也可以達到同樣的效果。但是,flex-basis 的優先級更高,並且方向會隨着 flex 方向改變。

下面,我們就來聊聊 flex 的方向。

flex 的軸

看完了放縮,是時候看看 flex 佈局元素的方向了!

flex 有兩根軸,分別稱作主軸和交叉軸。

在默認情況下,它們如下排列:

給萌新的Flexbox簡易入門教程 - 葡萄城技術團隊博客 -_縮放_06

水平堆疊示意圖

元素沿着主軸堆疊。

但是,你也可以手動更改。

用到的屬性是 flex-direction。寫在容器裏面。上面的默認值為 row。現在我們改成 column 試試。

.container{
  display: flex;
  flex-direction: column;
}
.content{
  border: 1px solid red;
}

給萌新的Flexbox簡易入門教程 - 葡萄城技術團隊博客 -_html_07

垂直堆疊

是的,它變成了垂直堆疊。

現在,變成這樣:

給萌新的Flexbox簡易入門教程 - 葡萄城技術團隊博客 -_#前端_08

垂直堆疊示意圖

還記得上面我們提到的 flex-basis 嗎?

它表示元素在主軸上面的基準,也就是説,如果再次加上上面的基準……

.content{
  border: 1px solid red;
  flex: 0 1 200px;
}

給萌新的Flexbox簡易入門教程 - 葡萄城技術團隊博客 -_自動換行_09

設置基準

沒錯,基準的方向是主軸!

注意了,在設置為 column 時,即使 flex-grow 為 1,也不會自動放大佔滿屏幕哦。這是因為,你並沒有指定容器的高度,因此不會自動拉長。

你也許注意到了,上面的例子裏面,水平方向是佔滿的。沒錯,水平方向是會自動佔滿屏幕的。這和 html 有關,元素默認就有寬度。

調整元素佈局

要想調整元素的佈局,有 3 個重要屬性,一定要記住。

justify-content

這個屬性,指定了容器該如何在主軸上面排列元素。

可選的常用值有:

  • • space-between,容器內子元素間均分空隙,但是元素和兩邊沒有空隙
  • • space-around,上面的+元素兩邊也有空隙
  • • center,元素居中緊密排列
  • • flex-start,元素排列在主軸開頭
  • • flex-end,元素排列在主軸末尾
    速通一下:
.container1,.container2,.container3{
display: flex;
margin: 20px0px;
}
.content{
border: 1px solid red;
flex: 01100px;
}
.container1{
justify-content: flex-end;
}
.container2{
justify-content: space-between;
}
.container3{
justify-content: space-around;
}

給萌新的Flexbox簡易入門教程 - 葡萄城技術團隊博客 -_縮放_10

示例

其它的幾個,請自行探索~

另外注意,可以設置 gap 屬性,控制元素間的距離哦。請自行嘗試~

align-item

控制子元素在交叉軸上面的排列。

可選值:

  • • flex-start/end 同上
  • • center 同上
  • • stretch 拉伸佔滿空間

再來個速通例子:

.container1,.container2,.container3{
display: flex;
margin: 20px0px;
justify-content: center;
}
.content{
border: 1px solid red;
flex: 01100px;
}
.container1{
align-items: flex-start;
}
.container2{
align-items: center;
}
.container3{
align-items: flex-end;
}

html 部分有所改動:

<div class="content" style="height: 50px;">This is an item</div>
  <div class="content" style="height: 30px;">This is an item</div>
  <div class="content" style="height: 20px;">This is an item</div>

給加上了高度限定。

效果:

給萌新的Flexbox簡易入門教程 - 葡萄城技術團隊博客 -_自動換行_11

align-items

很好理解,這裏不再贅述。

最重要的是,這個 stretch。

去掉每個元素的死高度限制,改下代碼:

.container1{
  display: flex;
  margin: 20px 0px;
  justify-content: center;
  align-items: stretch;
  height: 100px;
}

給萌新的Flexbox簡易入門教程 - 葡萄城技術團隊博客 -_自動換行_12

示例拉伸

看到了嗎,它拉伸了。

另外,你也可以對於單個元素設置 align-self,改變它在交叉軸上的排列方式。這裏不再演示,自己試試就好啦。

自動換行

如果主軸上顯示不下,你可以設置自動換行。自動換行會根據 flex-basis 進行計算。

設定 flex-warp 即可換行。

.container1{
display: flex;
margin: 20px0px;
justify-content: center;
flex-wrap: wrap;
}
.content{
border: 1px solid red;
flex: 11200px;
}

當元素達到 200px 時,換行標準滿足,此時不再收縮,而是直接換行。直到換行仍然無法顯示,再進行收縮。也就是説,flex-basis 像是一種建議,瀏覽器會盡力滿足這種建議:

給萌新的Flexbox簡易入門教程 - 葡萄城技術團隊博客 -_縮放_13

自動換行

注意了,換行後,我們就存在了多根主軸。

既然 align-items 在交叉軸上對齊元素,那麼主軸的對齊怎麼辦?

此時就有了新的屬性。

align-content

排列組合

改下代碼,指定一個容器高度:

.container1{
display: flex;
margin: 20px0px;
justify-content: center;
align-items: center;
flex-wrap: wrap;
align-content: center;/* 把多個主軸在交叉軸上居中在容器內 */
height: 200px;
}

換行後,效果是這樣的(注意這個截圖不完整,實際上是佈局在 200px 正中間的):

給萌新的Flexbox簡易入門教程 - 葡萄城技術團隊博客 -_自動換行_14

center

但是,如果我們改成 space-between。

給萌新的Flexbox簡易入門教程 - 葡萄城技術團隊博客 -_html_15

space-between

是的,和前面兩個的邏輯完全一樣,只不過是改變了對象,涉及主軸的排列罷了。

給萌新的Flexbox簡易入門教程 - 葡萄城技術團隊博客 -_縮放_16

直接上示意圖!

結語

flexbox 為我們的網頁佈局提供了非常多的可能性,允許我們創建可縮放的網頁。搞清楚這些屬性之後,flex 也就不難了。

基礎 css 講完了,下一篇我們將涉及 javascript,同樣是簡明易懂的奶奶級教程,敬請期待哦。