深入解析CSS Flexbox

前段時間手工紀錄了一些flexbox的要點~如圖~


所以想把它整理成電子版,加上更詳盡的解析和說明,便于大家和自己日后學習理解和查閱~

Flexbox 是CSS3 的盒子模型 ( box model ),顧名思義它就是一個靈活的盒子 ( Flexible Box ),為什么最近這個屬性才紅起來呢?最主要也是因為CSS3 的規范終于普及 ( 或 IE 終于沒落 ),加上移動設備的發展促成了響應式布局興起,自適應長寬、彈性相當大的 Flexbox 就趁勢而起了~

我們已經熟悉的網格布局(Grid),已經可以實現響應式布局,但仍需要相當大的代碼量來使其適應不同的屏幕。而Flexbox能夠更加靈活、簡潔、優雅、彈性的實現響應式的布局。

第一步要來看看 Flexbox 的盒子模型,根據W3C 文章所描述,flex 的盒子模型如下圖所呈現,與一般的盒子模型不同的地方,在于 Flexbox 的盒子模型具有水平的起點終點 ( main start、main end ),垂直的起點終點 ( cross start、cross end ),水平軸與垂直軸 ( main axis、cross axis ),然后元素具有水平尺寸與垂直尺寸 ( main
size、cross size ),這些都是相當重要的布局規劃。

再來我們先看看 Flexbox 有哪些屬性,也可參考 W3C css3 flexbox css3-flexbox

  • display

  • flex-direction

  • justify-content

  • align-items

  • align-self

  • align-content

  • flex-wrap

  • order

  • flex

  • display
    display 是我們熟悉的 CSS 屬性,對于 Flexbox 來說,有兩種方式可以設定,默認為「flex」,其布局方式與 block 類似,會強迫換行,但設為 display: flex
    的子元素卻具備了更多彈性的設定,另外一種方式則是「inline-flex」,和 inline-block 類似,后方的元素不會換行。( e.g. css-flexbox-demo1.html )
    CSS:

.flex,
.inline-flex{ 
    width:100px; 
    height:50px;
    border:1px 
    solid #000;
}
.flex{ 
    display:flex;
}
.inline-flex{
     display:inline-flex;
}
  • flex-direction
    flex-direction 表示 Flexbox 內容元素的「排列方向」,分別有下列四種( e.g. css-flexbox-demo2.html )
  • row:默認值,由左到右,從上到下
  • row-reverse:與 row 相反
  • column:從上到下,再由左到右
  • column-reverse:與column 相反

CSS:

.flex-row{ flex-direction:row; } .flex-row-reverse{ flex-direction:row-reverse; } .flex-column{ flex-direction:column; } .flex-column-reverse{ flex-direction:column-reverse; }

  • justify-content
    justify-content 決定了內容元素與整個 Flexbox 的「水平對齊」位置,回想一下最上面講的 Flexbox 盒子模型,具有 main start 和 main end 左右兩個端點,justify-content 就是按照這個方式來設置,而其中的設定值共有下列五個。( e.g. css-flexbox-demo3.htmlW3C 說明 )
  • flex-start:默認值,對齊最左邊的 main start
  • flex-end:對齊最左邊的 main end
  • center:水平居中
  • space-between:平均分配內容元素,左右元素將會與 main - start 和 main end 對齊
  • space-around:平均分配內容元素,間距也是平均分配

CSS:

.flex-start{
     justify-content:flex-start;
}
.flex-end{
     justify-content:flex-end;
}
.center{ 
    justify-content:center;
}
.space-between{ 
    justify-content:space-between;
}
.space-around{
    justify-content:space-around;
}
  • align-items
    align-items 剛好和 justify-content 相反,align-items 決定了內容元素與整個 Flexbox 的「垂直對齊」位置,再回想一下最上面講的 Flexbox 盒子模型,具有 cross start 與 cross end 左右兩個端點,align-items 與 align-self 就是按照這個方式做設定,設定值總共有下列五個。( e.g. css-flexbox-demo4.htmlW3C 說明 )
  • flex-start:默認值,對齊最上面的 cross start
  • flex-end:對齊最下面的 cross end
  • center:垂直居中
  • stretch:將內容元素全部撐開至 Flexbox 的高度
  • baseline:以所有內容元素的基線作為對齊標準

CSS:

.flex-start{ 
    align-items:flex-start;
}
.flex-end{
     align-items:flex-end;
}
.center{ 
    align-items:center;
}
.stretch{
     align-items:stretch;
}
.baseline{
     align-items:baseline;
}
.flex-item{
     width:60px;
     text-align:center;
}
.item1{
    font-size:20px; 
    line-height: 60px; 
    background:#c00;
}
.item2{
     line-height: 30px;
     background:#095;
}
.item3{
    font-size:30px; 
    line-height: 100px;
    background:#059;
}
  • align-self
    align-self 的設定與align-items 相同,但目的不同,align-self 的作用在于重寫已經套用 align-items 的屬性,如果照我們以前所寫,因為 align-items 是針對子元素,所以必須要用 align-self 來進行重寫,我們直接用上一個例子來修改就很清楚了。( e.g. css-flexbox-demo5.htmlW3C 說明 )
    CSS:
.item2{ 
    align-self:baseline;
    line-height: 30px; 
    background: #095;
}
  • align-content
    剛剛談到的 align-items 是針對內容為單行的元素進行處理,如果遇到多行的元素,就要使用 align-content 這個屬性,這個屬性總共有六個設定值。( e.g. css-flexbox-demo6.htmlW3C 說明 )
  • flex-start:默認值,對齊最上面的 cross start
  • flex-end:對齊最下面的 cross end
  • center:垂直居中
  • space-between:將第一行與最后一行分別對齊最上方與最下方
  • space-around:每行平均分配間距
  • stretch:內容元素全部撐開

CSS:

.flex-start,
.flex-end,
.center,
.space-between,
.space-around,
.stretch{ 
    display:inline-flex; 
    flex-wrap:wrap; 
    width:180px; 
    height:160px; 
    margin:5px 5px 40px;
    border:1px solid #000;   
    vertical-align: top;
}
.flex-start{
     align-content:flex-start;
}
.flex-end{
    align-content:flex-end;
}
.center{
    align-content:center;
}
.space-between{
    align-content:space-between;
}
.space-around{
    align-content:space-around;
}
.stretch{
     align-content:stretch;
}
.align-content>div{
    padding:15px;
    margin:2px;
    background:#666;
}
  • flex-wrap
    在剛剛的例子看到一個 flex-wrap 的屬性,這個屬性負責的是讓內容的元素換行,因為當我們把父元素的 display 設定為 flex 或 inline-flex 的時候,子元素就是以單行的方式,彈性撐滿父元素,所以就要利用 flex-wrap 來換行,共有三個設定值。( e.g. css-flexbox-demo7.html)
  • nowrap:默認值,單行
  • wrap:多行
  • wrap-reverse:多行,但內容元素反轉

CSS:

.nowrap,
.wrap,
.wrap-reverse{
    display:inline-flex; 
    flex-wrap:wrap; 
    width:180px; 
    height:80px;
    margin:5px 5px 40px;
    border:1px solid #000; 
    vertical-align: top;
}
.column{ 
    flex-direction:column;
    width:120px; 
    height:180px;
}
.nowrap{
     flex-wrap:nowrap;
}
.wrap{
     flex-wrap:wrap;
}
.wrap-reverse{
     flex-wrap:wrap-reverse;
}
.align-content div{ 
     width:30px;
     height:30px;
     margin:5px;
     background:#069;
}
.column div{
     background:#f50;
}
  • order
    剛剛在 flex-wrap 的屬性里頭看到了可以把元素反轉,order 這個屬性更是可以直接指定一個數字,就可以由小到大的排列順序。( e.g. css-flexbox-demo8.html)
.item{ 
   width:50px;
   height:60px; 
   text-align: center;
   line-height: 50px; 
} 
.order1{ 
    order:1; 
    background:#c00; 
} 
.order2{
   order:2; 
   background:#069; 
}
.order3{ 
    order:3;
    background:#095; 
}
.order4{ 
    order:4; 
    background:#f50; 
} 
.order5{ 
    order:5; 
    background:#777; } 
.order6{ 
    order:6; 
    background:#077; 
}
  • flex
    壓軸的來了,flex 應該是 Flexbox 最重要的屬性了,而 flex 其實是由三個屬性組合而成,依照先后順序分別是「flex-grow」、「flex-shrink」和「flex-basis」,如果 flex 只填了一個數值 ( 無單位 ),那么默認就是以 flex-grow 的方式呈現,至于三個屬性的解釋如下:
  • flex-grow:數字,無單位,當子元素的 flex-basis 長度「」于它自己在父元素分配到的長度,按照數字做相對應的「伸展」比例分配,默認值為 1,設為 0 的話不會進行彈性變化,不可為負值。
  • flex-shrink:數字,無單位,當子元素的 flex-basis 長度「」于它自己在父元素分配到的長度,按照數字做相對應的「壓縮」比例分配,默認值為 1,設為 0 的話不會進行彈性變化,不可為負值。
  • flex-basis:子元素的基本大小,作為父元素的大小比較基準,默認值為 0,也因為默認值為 0,所以沒有設定此屬性的時候,會以直接才用 flex-grow 屬性,flex-basis 也可以設為
    auto,如果設為 auto,就表示子元素以自己的基本大小為單位。

三個屬性可以分開設定,也可以合在一起用一個 flex 統一設定,下面的例子展現出同一個 Flexbox,在不同的寬度,子元素會有不同大小的呈現。( e.g. css-flexbox-demo9.html)

HTML:

<div cl ass="flex flex-300"> 
   <div class="item item1">1</div> 
   <div class="item item2">2</div>
</div>
<div class="flex flex-150">
    <div class="item item1">1</div>
    <div class="item item2">2</div>
</div>

CSS:

.flex{
    display:inline-flex; 
    height:60px;
    margin:5px 5px 40px;
    border:1px solid #000; 
    vertical-align: top;
}
.flex-300{ 
    width:300px;
}
.flex-150{ 
    width:80px;
}
.item{
    height:60px; 
    text-align: center; 
    line-height: 50px;
}
.item1{
     flex:1 2 200px;
     background:#c00;
}
.item2{ 
    flex:2 1 100px; 
    background:#069;
}

如果用動畫來表現,可以看出拉長的時候紅色會變得比藍色長,但壓縮的時候卻是藍色變得比紅色長,如此一來就更能體會 flex 在響應式設計里的關鍵角色啦!


雖然很多老的瀏覽器還無法完全完美兼容,但我們還是應該學習這種優雅前端的方式,相信不久的將來,春天就會來的~

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,606評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,582評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,540評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,028評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,801評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,223評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,294評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,442評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,976評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,800評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,996評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,543評論 5 360
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,233評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,662評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,926評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,702評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,991評論 2 374

推薦閱讀更多精彩內容

  • H5移動端知識點總結 閱讀目錄 移動開發基本知識點 calc基本用法 box-sizing的理解及使用 理解dis...
    Mx勇閱讀 4,590評論 0 26
  • 移動開發基本知識點 一.使用rem作為單位 html { font-size: 100px; } @media(m...
    橫沖直撞666閱讀 3,500評論 0 6
  • 簡書的Markdown貌似不支持插入iframe,所以文章里的JSFiddle示例都改做截圖了,如果有需要可以點擊...
    kangflict閱讀 1,131評論 2 8
  • 選擇qi:是表達式 標簽選擇器 類選擇器 屬性選擇器 繼承屬性: color,font,text-align,li...
    wzhiq896閱讀 1,783評論 0 2
  • title: flex布局date: 2017-07-07 14:13:33tags: css筆記 flexbox...
    Gary23閱讀 1,545評論 0 0