Flexbox 彈性盒子,讓CSS區塊布局能更容易更具有彈性, 目前主流瀏覽器都已經有良好的支援,雖然許多功能仍在草案階段,但該項目已受到廣泛支持,在未來勢必成為主流標準之一。

Flex 排版能更優雅的處理不同螢幕尺寸及設備布局,接下來將直接進入他的功能介紹,逐步來了解這裏面的特性及用法

flex 階層關係

在討論功能之前,先要了解 flex主要框架設計理念,

通常,會在最外圍設定一個主要的 flex,在他內部可以包含0到多個區塊。

在外層的這個主要的 flex,就可以用一些參數來控制內部的區塊排版,包括排列方向、總體尺寸等等…

設定 flexbox

因此,先將要設定的主要區塊調設定為 flexbox 例如,這裡用display:flex 來設定一個 div 為 flexbox

div{
	/* flexbox setup */
	display: flex;
}

flex

flex 可以用來設定同一個主元素底下,內部元素的長度分配。

flex 包括了 flex-grow, flex-shrink, flex-basic 這三種屬性

  • flex-grow : 內部元素數量未撐爆外層元素
  • flex-shrink : 內部元素數量多到撐爆外層元素時
  • flex-basic : 內部元素的預設初始寬度

這裡則是型態、範圍及預設

  • flex-grow : 數值 (需>0),預設為1
  • flex-shrink : 數值 (需>0),預設為1
  • flex-basic : 需附加單位(%, px or em..),預設為0

可以直接設定為 flex: auto; flex: initial; flex: none; 其中,設定為none就相對於 0 0 auto;

這張圖可以說明單一設定值的情況

這裡我們先看一些正常情況的相對應關係

div{

	/* one values: flex-grow */
	flex: 1;
	/* two values: flex-grow | flex-shrink */
	flex: 1 2;
	/* Three values: flex-grow | flex-shrink | flex-basis */
	flex: 1 2 10px
}

接下來是幾種設定及相對應關係 當有出現單位時,就會自動設定為 flex-basis 值

div{
	/* Two values: flex-grow | flex-basis */
  flex: 1 30px;
  /* One value, width/height: flex-basis */
  flex: 10em;
  /* Three values: flex-grow | flex-shrink | flex-basis */
  flex: 2 2 10%;
  /* Two values: flex-grow | flex-shrink */
  flex: 2 2;
}

flex-direction 控制排版方向

這裡,我們由外部主要 flexbox ,可以設定這個flexbox的寬及高,再透過 flex-direction 來定內部排列方式

flex-direction 一共有四組參數

div{
        /* flexbox setup */
        display: flex;
        /* flexbox direction*/
        flex-direction: row; //常見水平排列,由左至右,由上而下
        flex-direction: row-reverse; //水平反向排列 
        flex-direction: column; //欄位由上而下,由左至右
        flex-direction: column-reverse; //欄位反向由下而上
}

See the Pen YEOLBO by Adam Ou-Yang (@adon988) on CodePen.

justify-content 水平排列對齊設定

justify-content 這個屬性可以讓我們設定元件在水平軸(main axis)的 space 分布狀況,這裡僅列出幾個作為參考

div{
        /* flexbox setup */
        display: flex;
        /* flexbox justify */
        justify-content: start;
        justify-content: center;
        justify-content: flex-end;
        justify-content: space-between; //元件之間保持空間距離
        justify-content: space-around; //左右保持一點空間,且元件間保持空間距離
        justify-content: space-evenly; //元件在整體空間保持一樣的空間距離
}

See the Pen wPExYj by Adam Ou-Yang (@adon988) on CodePen.

詳細各種參數可以直接參考這裡,底下這張圖列出目前可以使用的相關參數及示意:

align-items 垂直排列對齊設定

針對同一行的元素進行對齊排列處理,跟justify-content很像,但是操作的是垂直軸(cross-axis)的 space 分布狀況

div{
        /* flexbox setup */
        display: flex;
        /* flexbox justify */
        align-items:flex-start; 
        align-items:flex-end;
        align-items: center;
        align-items:stretch;
        align-items: baseline;
}

See the Pen align-items by Adam Ou-Yang (@adon988) on CodePen.

詳細各種參數可以直接參考這裡,其他更多align-items 可以參考下圖

align-self

從字面上來看,大概就能猜出這個是用在單一元素 在外層flexbox,如果設定了align-items,在內部的個別元素就能透過 align-self 來複寫外層的設定。 如果這當中有 cross-axis 的元素 margin 設定為 0 auto,所設定的 align-self 就會被忽略掉。

在需要的時候,可以直接在這裡查詢相關參數,此部分將不作範例解釋

其他細部操作

接下來介紹的是偏向於較為細節的操作,例如換行、排序…

flex-wrap 自動換行

當我們將外層定義為 flex ,內部元素如果以行的方式排列,超過一定數量就會撐爆外層, 這時就要透過 flex-wrap 來定義,自動換行 這裡列出相關設定值

div{
    flex-wrap: nowrap; //不換行
    flex-wrap: wrap; //自動換行
    flex-wrap: wrap-reverse; //反向+換行
}

See the Pen flex-wrap by Adam Ou-Yang (@adon988) on CodePen.

Order 排序

flexbox 支援在子元素CSS裡面添加 order 來指定排序

See the Pen Order by Adam Ou-Yang (@adon988) on CodePen.

flex-flow = flex-direction + flex-wrap

flex-flow 包含了flew-direction 及 flew-wrap 兩種特性。

在設定時,可以個別或同時設定方向及換行

例如,同時設定

flex-flow: row nowrap;
flex-flow: column wrap;
flex-flow: column-reverse wrap-reverse;

例如,僅設定方向或換行

flex-flow: row;
flex-flow: wrap;

參考: https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Flexible_Box_Layout