用CSS3 flexbox來排版忽然間就好像上了天堂, 不一定要用繁雜的grid system(或乾脆自己寫一個), 許多版型很輕鬆的就可以達成。
flexbox可以設定的參數很多, 直接拿例子來玩比較快, 這次我想排一個簡單的三排版型, 頂端有個header bar, 中間就是各式各樣的文章內容, 最下方就是footer, 放置我的版權以及其他輔助資訊這樣。
HTML結構:
<div class="Main">
<div class="Header">Header</div>
<div class="Content">Content</div>
<div class="Footer">Footer</div>
</div>
對應的CSS外觀, 把文字置中, 各個欄位用不用底色標示:
.Header, .Content, .Footer{ text-align: center;}
.Header {background: yellow;}
.Content {background: green;}
.Footer {background: blue;}
結果如下, 每個欄位高度都跟文字高度相同, 螢幕下方則是沒有被這3個區塊涵蓋到:
開始幫我們的CSS, 加入flexbox排版,
首先, 要宣告誰是flex container
(爸爸), 在爸爸裡面的區塊都是這flex container的flex item
(兒子):
.Main {
display: flex;
}
結果變這樣:
原來在flex container裏面兒子的排列方式預設是由左到右橫排(row), 在爸爸這邊我們加上flex-direction
屬性來控制兒子的排列方式:
.Main {
display: flex;
flex-direction: column;
}
flex-direction
有四種屬性值可用: row
(橫排左到右), row-reverse
(橫排右到左), column
(直排由上到下), column-reverse
(直排由下到上)
好,至少排的方向對了:
幫我們的css添上新的內容:
.Content {
flex: 1;
}
這樣是沒有變化的, 把爸爸的高度先改為固定的200px高看看:
.Main {
display: flex;
flex-direction: column;
height: 200px;
}
哇! 接近我們要的樣子了! 不過因為我們是將.Main
設定固定高度, 還是沒有利用到視窗畫面(晚些處理):
flex
是3個屬性的縮寫: flex-grow
, flex-shrink
和 flex-basis
, 預設值是flex: 0 1 auto
。
如果只單寫一個flex:1
就等於flex-grow: 1
。
flex-grow
定義這個flex item長大(應用整個flex container空間)的能力。預設是0,表示不會變動,這個flex item有多長就多長。如果有一個flex item設定flow-grow為1, 那這個flex item就會用到所有flex container所剩下的空間, 如果所有flex item裏面, 有兩個設定flex-grow為1, 那麼他們兩個就會對分flex container所剩下的空間。
flex-shrink
跟flex-grow
相反, 預設值是1。
flex-basis
是以父元素當作比較標準, 預設是auto,就是子元素本身寬度。flex-basis: 50%
就是子元素本身為父元素50%寬度
直接用這個範例來改看看一下就清楚
拿掉.Main的height屬性, 呼叫CSS3 vh, 讓.Main可以用到整個畫面高度:
.Main {
display: flex;
flex-direction: column;
min-height: 100vh;
}
vh
(viewport height) 和 vw
(viewport width)是CSS3所導入的新單位, 我們可以來設定元素相對於viewport的大小, 數值最大就是100, 100vh
就是等於viewport 100%的高度。
搞定!