display:flex弹性布局
一、背景
前段時(shí)間幫公司運(yùn)維小姑娘調(diào)整她自己寫(xiě)的頁(yè)面樣式時(shí)發(fā)現(xiàn)她用了display: flex,我這個(gè)后端老古董還不太懂flex,自愧不如啊,所以寫(xiě)篇博客記錄學(xué)習(xí)下。
現(xiàn)在寫(xiě)的前端頁(yè)面還停留在依賴(lài)?display?屬性 +?position屬性 +?float屬性的布局方式,這種布局對(duì)一些特殊布局非常不方便,比如,垂直居中等等。
2009年,W3C 提出了一種新的方案----Flex 布局,可以簡(jiǎn)便、完整、響應(yīng)式地實(shí)現(xiàn)各種頁(yè)面布局。目前,它已經(jīng)得到了所有瀏覽器的支持,這意味著,現(xiàn)在就能很安全地使用這項(xiàng)功能。
二、概念
Flex 是 Flexible Box 的縮寫(xiě),意為"彈性布局",用來(lái)為盒狀模型提供最大的靈活性。任何一個(gè)容器都可以指定為 Flex 布局(包括塊狀和行內(nèi)元素)。在設(shè)置Flex布局后,子元素的float、clear和vertical-align屬性將失效。
采用 Flex 布局的元素,稱(chēng)為 Flex 容器(flex container),簡(jiǎn)稱(chēng)"容器"。它的所有子元素自動(dòng)成為容器成員,稱(chēng)為 Flex 項(xiàng)目(flex item),簡(jiǎn)稱(chēng)"項(xiàng)目"。
容器默認(rèn)存在兩根軸:水平的主軸(main axis)和垂直的交叉軸(cross axis)。主軸的開(kāi)始位置(與邊框的交叉點(diǎn))叫做main start,結(jié)束位置叫做main end;交叉軸的開(kāi)始位置叫做cross start,結(jié)束位置叫做cross end。
項(xiàng)目默認(rèn)沿主軸排列。單個(gè)項(xiàng)目占據(jù)的主軸空間叫做main size,占據(jù)的交叉軸空間叫做cross size。
三、基本屬性
以下容器的6個(gè)屬性設(shè)置:
3.1、flex-direction 容器內(nèi)項(xiàng)目的排序方式,屬性值如下:
row//默認(rèn)值,沿水平主軸由左向右排列 row-reverse//沿水平主軸由右向左排列 column//沿垂直的交叉軸由上向下排列 column-reverse //沿垂直的交叉軸由下向上排列3.2、flex-wrap 容器內(nèi)項(xiàng)目的換行方式,值如下:
nowrap //(默認(rèn)):不換行。 wrap://換行,第一行在上方。 wrap-reverse://換行,第一行在下方?!??
3.3、flex-flow 以上兩種屬性的簡(jiǎn)寫(xiě) 寫(xiě)法:
div{flex-flow: <flex-direction> || <flex-wrap>; }3.4、justify-content 項(xiàng)目在主軸上的對(duì)齊方式
flex-start//(默認(rèn)值):左對(duì)齊 flex-end//右對(duì)齊 center//居中 space-between//兩端對(duì)齊,項(xiàng)目之間的間隔都相等。 space-around//每個(gè)項(xiàng)目?jī)蓚?cè)的間隔相等。所以,項(xiàng)目之間的間隔比項(xiàng)目與邊框的間隔大一倍。
3.5、align-item 項(xiàng)目在垂直交叉軸上的對(duì)齊方式
flex-start//交叉軸的起點(diǎn)對(duì)齊。 flex-end//交叉軸的終點(diǎn)對(duì)齊。 center//交叉軸的中點(diǎn)對(duì)齊。 baseline//項(xiàng)目的第一行文字的基線(xiàn)對(duì)齊。 stretch//(默認(rèn)值):如果項(xiàng)目未設(shè)置高度或設(shè)為auto,將占滿(mǎn)整個(gè)容器的高度。3.6、align-content 在多根軸線(xiàn)的情況下的對(duì)齊方式,一根軸線(xiàn)下不起作用
flex-start//與交叉軸的起點(diǎn)對(duì)齊。 flex-end//與交叉軸的終點(diǎn)對(duì)齊。 center//與交叉軸的中點(diǎn)對(duì)齊。 space-between//與交叉軸兩端對(duì)齊,軸線(xiàn)之間的間隔平均分布。 space-around//每根軸線(xiàn)兩側(cè)的間隔都相等。所以,軸線(xiàn)之間的間隔比軸線(xiàn)與邊框的間隔大一倍。 stretch(默認(rèn)值)//軸線(xiàn)占滿(mǎn)整個(gè)交叉軸。四、項(xiàng)目的屬性
4.1、order?屬性定義項(xiàng)目的排列順序。數(shù)值越小,排列越靠前,默認(rèn)為0
?
4.2、flex-grow屬性定義項(xiàng)目的放大比例,默認(rèn)為0,即如果存在剩余空間,也不放大。
如果所有項(xiàng)目的flex-grow屬性都為1,則它們將等分剩余空間(如果有的話(huà))。如果一個(gè)項(xiàng)目的flex-grow屬性為2,其他項(xiàng)目都為1,則前者占據(jù)的剩余空間將比其他項(xiàng)多一倍。
4.3、flex-shrink屬性定義了項(xiàng)目的縮小比例,默認(rèn)為1,即如果空間不足,該項(xiàng)目將縮小
如果所有項(xiàng)目的flex-shrink屬性都為1,當(dāng)空間不足時(shí),都將等比例縮小。如果一個(gè)項(xiàng)目的flex-shrink屬性為0,其他項(xiàng)目都為1,則空間不足時(shí),前者不縮小。
?
4.4、flex-basis屬性定義了在分配多余空間之前,項(xiàng)目占據(jù)的主軸空間(main size)。
瀏覽器根據(jù)這個(gè)屬性,計(jì)算主軸是否有多余空間。它的默認(rèn)值為auto,即項(xiàng)目的本來(lái)大小。它可以設(shè)為跟width或height屬性一樣的值(比如350px),則項(xiàng)目將占據(jù)固定空間。
4.5、flex屬性是flex-grow,?flex-shrink?和?flex-basis的簡(jiǎn)寫(xiě),默認(rèn)值為0 1 auto。后兩個(gè)屬性可選。
該屬性有兩個(gè)快捷值:auto?(1 1 auto) 和 none (0 0 auto)。
建議優(yōu)先使用這個(gè)屬性,而不是單獨(dú)寫(xiě)三個(gè)分離的屬性,因?yàn)闉g覽器會(huì)推算相關(guān)值
4.6、align-self屬性允許單個(gè)項(xiàng)目有與其他項(xiàng)目不一樣的對(duì)齊方式。
可覆蓋align-items屬性。默認(rèn)值為auto,表示繼承父元素的align-items屬性,如果沒(méi)有父元素,則等同于stretch。
該屬性可能取6個(gè)值,除了auto,其他都與align-items屬性完全一致。
?
五、常用布局
5.1網(wǎng)格布局
5.11 基本網(wǎng)格布局
最簡(jiǎn)單的網(wǎng)格布局,就是平均分布。在容器里面平均分配空間,需要設(shè)置項(xiàng)目的自動(dòng)縮放。
HTML代碼如下:
<div class="Grid"><div class="Grid-cell">...</div><div class="Grid-cell">...</div><div class="Grid-cell">...</div> </div>CSS代碼如下:
.Grid {display: flex; }.Grid-cell {flex: 1; }5.12 百分比布局
某個(gè)網(wǎng)格的寬度為固定的百分比,其余網(wǎng)格平均分配剩余的空間。
HTML代碼如下。
<div class="Grid"><div class="Grid-cell u-1of4">...</div><div class="Grid-cell">...</div><div class="Grid-cell u-1of3">...</div> </div> .Grid {display: flex; }.Grid-cell {flex: 1; }.Grid-cell.u-full {flex: 0 0 100%; }.Grid-cell.u-1of2 {flex: 0 0 50%; }.Grid-cell.u-1of3 {flex: 0 0 33.3333%; }.Grid-cell.u-1of4 {flex: 0 0 25%; }5.2、圣杯布局
圣杯布局(Holy Grail Layout)指的是一種最常見(jiàn)的網(wǎng)站布局。頁(yè)面從上到下,分成三個(gè)部分:頭部(header),軀干(body),尾部(footer)。其中軀干又水平分成三欄,從左到右為:導(dǎo)航、主欄、副欄。
HTML代碼如下:
<body class="HolyGrail"><header>...</header><div class="HolyGrail-body"><main class="HolyGrail-content">...</main><nav class="HolyGrail-nav">...</nav><aside class="HolyGrail-ads">...</aside></div><footer>...</footer> </body>
CSS代碼如下:
.HolyGrail {display: flex;min-height: 100vh;flex-direction: column; }header, footer {flex: 1; }.HolyGrail-body {display: flex;flex: 1; }.HolyGrail-content {flex: 1; }.HolyGrail-nav, .HolyGrail-ads {/* 兩個(gè)邊欄的寬度設(shè)為12em */flex: 0 0 12em; }.HolyGrail-nav {/* 導(dǎo)航放到最左邊 */order: -1; }如果是小屏幕,軀干的三欄自動(dòng)變?yōu)榇怪悲B加。
@media (max-width: 768px) {.HolyGrail-body {flex-direction: column;flex: 1;}.HolyGrail-nav,.HolyGrail-ads,.HolyGrail-content {flex: auto;} }
5.3、輸入框的布局
我們常常需要在輸入框的前方添加提示,后方添加按鈕。
HTML代碼如下。
<div class="InputAddOn"><span class="InputAddOn-item">...</span><input class="InputAddOn-field"><button class="InputAddOn-item">...</button> </div>
CSS代碼如下。
.InputAddOn {display: flex; }.InputAddOn-field {flex: 1; }
5.4、懸掛式布局
有時(shí),主欄的左側(cè)或右側(cè),需要添加一個(gè)圖片欄。
HTML代碼如下。
<div class="Media"><img class="Media-figure" src="" alt=""><p class="Media-body">...</p> </div>
CSS代碼如下。
.Media {display: flex;align-items: flex-start; }.Media-figure {margin-right: 1em; }.Media-body {flex: 1; }
5.5、固定的底欄
有時(shí),頁(yè)面內(nèi)容太少,無(wú)法占滿(mǎn)一屏的高度,底欄就會(huì)抬高到頁(yè)面的中間。這時(shí)可以采用Flex布局,讓底欄總是出現(xiàn)在頁(yè)面的底部。
HTML代碼如下。
<body class="Site"><header>...</header><main class="Site-content">...</main><footer>...</footer> </body>
CSS代碼如下。
.Site {display: flex;min-height: 100vh;flex-direction: column; }.Site-content {flex: 1; }
5.6、流式布局
每行的項(xiàng)目數(shù)固定,會(huì)自動(dòng)分行。
CSS的寫(xiě)法。
.parent {width: 200px;height: 150px;background-color: black;display: flex;flex-flow: row wrap;align-content: flex-start; }.child {box-sizing: border-box;background-color: white;flex: 0 0 25%;height: 50px;border: 1px solid red; }
以上文章主要摘自阮一峰的《Flex 布局教程》,鏈接:http://www.ruanyifeng.com/blog/2015/07/flex-grammar.html?utm_source=tuicool
轉(zhuǎn)載于:https://www.cnblogs.com/qingxuit/p/10136739.html
總結(jié)
以上是生活随笔為你收集整理的display:flex弹性布局的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: TEA算法解析
- 下一篇: 初识单点登录及JWT实现