一維佈局系統--Flexbox:介紹

Lucy’s cornerstone
狐狸的葡萄酒
Published in
10 min readApr 17, 2020

Flexbox是CSS底下的排版設定,若是加上RWD的設定,網頁佈局會更加有彈性。

Photo by Sven Mieke on Unsplash

CSS佈局的進化史

CSS3以前,想要讓網頁元素垂直至中或左右對齊,float positioning是一定會用到的技巧。但是光是一個設定,可能就需要一些繁雜的步驟。

CSS3問世後,我們可以使用Flexbox下一些簡單的指令,讓網頁元素排版達到我們想要的效果。相較於float 和 positioning,操作比較好上手。

現代大多使用Flexbox來操作,但遇到特殊的開發情況時,還是會回頭使用float 和 positioning。

CSS 3推出了 flexbox 和 grid 兩套系統,以下介紹他倆的不同點:

Flexbox:一維佈局排版(one-dimensional layout solution),最先出現的排版方式,單方向性、橫或列排版。若想要組成二維佈局排版,必須從兩種方向下去安排。在簡單的一維佈局中容易維護。

grid:二維佈局排版(two-dimentional layout solution),之後才出現的排版方式,不是用來取代Flexbox,而是方便人們同時進行兩種方向(行+列)的排版。

Flex基本架構

你可以透過以下的CSS設定,來將一個容器宣告為flex container。

display: flex

接著,裡面的元素都會變成 flex item,只要更改flex的屬性, flex item就會隨之垂直、對齊等排版變化。

步驟1:建立flex container

在HTML建立一個flex-container、flex-item的<div>之後,在CSS的.flex-container的display屬性設為flex。

CSS.flex-container{
display:flex
...
...
}

此時,你會發現item原先以"block"做垂直排列,現在變成水平排列(Row),而且item長寬會隨著container的寬度而作微調。

步驟二:設定flex-item的排列方式

記得前面說過,flexbox是一維排列,我們可以讓container中的item做水平排列(Row)或是垂直排列(column),只能二選一。要如何設定呢?

在CSS flex-container加上flex-direction的設定即可。

  • flex-direction: row (item按順序、由左至右、水平排列)
  • flex-direction: column ( item按順序、由左至右、垂直排列)
  • flex-direction: row-reverse ( item反順序、由右至左、水平排列)
  • flex-direction: column-reverse ( item反順序、由右至左、垂直排列)

如果item很多,不想讓item溢出邊界,我們要如何讓它自動換行呢?

在CSS flex-container加上flex-wrap的設定即可。

  • flex-wrap: no-wrap(這是初始設定,會溢出邊界)

如果維持no-wrap設定,你會發現item會隨著container的寬度做改變,讓它們都擠在同一水平面上;但當flex-item的width改為min-width,item就會超出container的框架。

  • flex-wrap: wrap(由左到右自動換行)
  • flex-wrap: wrap-reverse(反順序,由右到左自動換行)

如果想要同時設定排列方向與自動換行,要如何去設定呢?

flex-direction和flex-wrap可以結合成flex-flow屬性。flex-flow第一個值是flex-direction,第二個值是flex-wrap。

.flex-container{
flex-flow:row wrap;
}

步驟三:對齊flex-item

flex-item之間是可以對齊或調整間距的。以flexbox(一維)為例,我可以先使用flex-direction來決定對齊水平軸(main axis)或對齊垂直軸(cross axis),接著再使用justify-content和align-item控制item與item之間的對齊。

.水平軸(main axis):由左而右,適用於justify-content

.垂直軸(cross axis):由上而下,適用於align-item

justify-content的場合

justify-content分成集中對齊分散對齊兩種形式。

集中對齊

  1. flex-start

全部item按順序緊靠水平軸的起點。

justify-content:flex-start

2. flex-end

全部item按順序緊靠水平軸的終點。

justify-content: flex-end

3.center

全部item按順序在水平軸的中間。

justify-content: center

分散對齊

  1. space-between
justify-content:space-between

最兩側的item會緊貼container,其它空間均勻分配。

2.space-around

justify-content:space-around

每個item都有等距的左右間隔,因此item與item間的間隔是2倍寬。

3.space-evenly

justify-content:space-evenly

所有item的間距平均分配,分散於container中。

align-item的場合

為垂直軸上的排列方法。

  1. stretch(預設)
align-items:stretch

一般情況下item會延展填滿空間,但如果item特別有規定width或是height,會優先尊重此配置,例如黃色方塊。

2. flex-start

align-items:flex-start

貼緊垂直軸(cross axis)出發點排列。

3. flex-end

align-items:flex-end

貼緊垂直軸(cross axis)尾端排列。

4. center

align-items:center

item會中央對齊垂直軸(cross axis)。

5. baseline

align-items:baseline

baseline是指文字下緣對齊的基準線。

若item中有文字,設定"align-item:baseline"會根據item中文字的位置,使item框架移動至使文字對齊Baseline。

☆注意:justify-content和align-item可在同一個container中設定。

步驟四:定義flex-item尺寸

接下來會介紹調整item的尺寸與比例的兩種CSS屬性。

flex-basis

以父尺寸--包著item的container尺寸為基礎,調整出比例。

EX:  flex-basis:30%;

這樣item的寬度比例就是container的30%。

flex-grow

如果設定為0,item沒有變化;如果設定為1以上的數字,item就會自動擴大填滿空間。

EX: flex-grow:1;

這樣item就會擴大占滿沒有其餘設定的container空間。

步驟五:設定item排序(order)

如果加上CSS的屬性"order",就可以為item做排序。

所有的item order預設皆為0,故設定order就可按照數字大小排列順序。

例如,item A排在item B的前面,如果item B 在CSS做以下設定:

order:-1;

這樣item B就會跑到item A前面了。

步驟六:結合media queries做響應式網頁

如果想要根據不同螢幕尺寸做排版變化,可以使用之前有提及的media queries來做響應式網頁。

例如,如果我想假設超過600px就改變排版,可以這樣設定:

@media screen and (max-width: 600px) {
//填入CSS設定
....
}
@media screen and (min-width: 600px) {
//填入CSS設定
...
}

記得,最小尺寸的要寫在前面,這樣才會依序做變化。

或是只要寫簡單一點,

//填入CSS設定
....
....
@media screen and (min-width: 600px) {
//填入CSS設定
...
}

這樣就是在超過600px的時候會做變化,跟前面是同樣道理。

步驟七:局部流動 (Mostly fluid)

RWD設計,可以讓我們設計從小螢幕到大螢幕的網頁排版;但是當viewport放到最大時,由於內容(文字、圖片方塊)也會被拉長,造成畫面不美觀。

局部流動提供一種設計,那就是當viewport延展到一定的程度,就不再拉長,使畫面比例維持和諧。

在最外層的div或是container中,CSS加入:

max-width: 800px;

這樣,如果寬度超過800px,畫面就會停止延展。

這樣就完成局部流動了。

步驟八:細微調整

以下是在不同尺寸螢幕下,可調整的CSS數據:

字體大小:
font-size: X em;
行高:
line-height: y em;
段落間距:
margin-bottom: Z em;
左右留白:
padding: R em;
不想讓一行字太多:
max-width是你的好幫手
寬度調整:
width: X %;

☆容易犯的錯誤:

依據版型變化,適當選用flex-flow中的row和column、wrap和nowrap。

以上就是對於flexbox的簡要介紹。

--

--

Lucy’s cornerstone
狐狸的葡萄酒

一位護理師,也是一位多元學習者。目前也在學習多益、股票投資,對很多東西都充滿好奇。