做的網(wǎng)站在百度搜索不到怎么樣免費(fèi)做網(wǎng)站
個(gè)人主頁:學(xué)習(xí)前端的小z
個(gè)人專欄:HTML5和CSS3悅讀
本專欄旨在分享記錄每日學(xué)習(xí)的前端知識(shí)和學(xué)習(xí)筆記的歸納總結(jié),歡迎大家在評(píng)論區(qū)交流討論!
文章目錄
- Flex布局
- 1 Flex容器和Flex項(xiàng)目
- 2 Flex 容器屬性
- 2.1 主軸的方向
- 2.2 主軸對(duì)齊方式
- 2.3 Flex 項(xiàng)目換行
- 2.4 交叉軸對(duì)齊方式
- 2.4.1 align-items屬性
- 2.4.2 align-content屬性
- 3 Flex 項(xiàng)目屬性
- 3.1 Flex項(xiàng)目排序
- 3.2 Flex 項(xiàng)目交叉軸對(duì)齊方式
- 3.2 放大比例
- 3.3 收縮比例
- 3.4 Flex項(xiàng)目基準(zhǔn)寬度
Flex布局
Flex是Flexible Box的縮寫,意為”彈性(放大、縮小)布局”,用來為盒狀模型提供最大的靈活性。
flex布局是目前主流的布局方式,結(jié)合盒子模型+定位,可以快速實(shí)現(xiàn)頁面各種復(fù)雜布局。
大部分場(chǎng)景下可以代替浮動(dòng)布局,特殊場(chǎng)景下,比如:文字環(huán)繞效果,還得使用浮動(dòng)布局更方便。
學(xué)習(xí)Flex布局搞清楚幾個(gè)重要的概念:
flex container
:flex 容器flex item
:flex 項(xiàng)目,針對(duì)容器的子級(jí)main axis
:主軸,默認(rèn)是水平方向cross axis
:交叉軸,默認(rèn)是垂直方向main start
:主軸和 flex 容器左邊的交叉點(diǎn)main end
:主軸和 flex 容器右邊的交叉點(diǎn)cross start
:交叉軸和 flex 容器上邊的交叉點(diǎn)cross end
:交叉軸和 flex 容器下邊的交叉點(diǎn)main size
:flex 項(xiàng)目占據(jù)的主軸寬度,可伸縮cross size
:flex 項(xiàng)目占據(jù)的交叉軸高度,可伸縮
flex 項(xiàng)目默認(rèn)沿主軸排列
1 Flex容器和Flex項(xiàng)目
指定一個(gè) Flex 容器:
<style>
.box {display: flex;/*display: inline-flex;*/
}
</style>
<div class="box"><div></div><span></span>文字<input type="text">
</div>
Flex 容器的子級(jí)全部變成 Flex 項(xiàng)目,不管你原來是 block,inline-block,inline 都會(huì)設(shè)置為 flex 項(xiàng)目(display: block)一樣對(duì)待。
flex項(xiàng)目變成block,這個(gè)block和之前學(xué)習(xí)position:absolute、fixed以及float:left|right的塊級(jí)類似,雖然計(jì)算屬性display:block,但是表現(xiàn)形式和行內(nèi)塊類似,默認(rèn)都是內(nèi)容的寬度,但是可以設(shè)置寬度、高度、外邊距、內(nèi)邊距、邊框等等
2 Flex 容器屬性
2.1 主軸的方向
flex-direction屬性決定主軸的方向(即項(xiàng)目的排列方向)。
flex-direction: row | row-reverse | column | column-reverse;
- row(默認(rèn)值):主軸為水平方向,起點(diǎn)在左端。
- row-reverse:主軸為水平方向,起點(diǎn)在右端。很少使用
- column:主軸為垂直方向,起點(diǎn)在上沿。交叉軸就變成水平
- column-reverse:主軸為垂直方向,起點(diǎn)在下沿。交叉軸就變成水平。很少使用
2.2 主軸對(duì)齊方式
justify-content屬性定義了項(xiàng)目在主軸上的對(duì)齊方式。
justify-content: flex-start | flex-end | center | space-between | space-around | space-evenly;
它可能取5個(gè)值,具體對(duì)齊方式與軸的方向有關(guān)。下面假設(shè)主軸為從左到右。
- 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)目與邊框的間隔大一倍。
- space-evenly:每個(gè)間隙距離相等. (兼容處理:用 space-between配合before+after使用)
2.3 Flex 項(xiàng)目換行
默認(rèn)情況下,項(xiàng)目都排在一條線(又稱”軸線”)上。flex-wrap屬性定義,如果一條軸線排不下,如何換行。
- Flex容器指定了具體寬度
- 所有的Flex項(xiàng)目總寬度 > Flex容器寬度
flex-wrap: nowrap | wrap | wrap-reverse;
它可能取三個(gè)值。
1、nowrap(默認(rèn)):不換行。Flex寬度700px,每個(gè)Flex項(xiàng)目寬度為100px, 1000px > 700px,只能收縮至70px
2、wrap:換行,第一行在上方。
3、wrap-reverse:換行,第一行在下方。很少使用
flex-flow
flex-flow屬性是flex-direction屬性和flex-wrap屬性的簡(jiǎn)寫形式,默認(rèn)值為row nowrap
。很少使用
flex-flow: <flex-direction> <flex-wrap>;
2.4 交叉軸對(duì)齊方式
2.4.1 align-items屬性
align-items屬性設(shè)置 flex項(xiàng)目在每個(gè) flex 行的交叉軸上的默認(rèn)對(duì)齊方式。
align-items: flex-start | flex-end | center | baseline | stretch;
它可能取5個(gè)值。具體的對(duì)齊方式與交叉軸的方向有關(guān),下面假設(shè)交叉軸從上到下。
- flex-start:交叉軸的起點(diǎn)對(duì)齊。
- flex-end:交叉軸的終點(diǎn)對(duì)齊。
- center:交叉軸的中點(diǎn)對(duì)齊。
- baseline: 項(xiàng)目的第一行文字的基線對(duì)齊。很少使用
- stretch(默認(rèn)值):沒有交換主軸和交叉軸方向的情況下,如果Flex項(xiàng)目未設(shè)置高度或設(shè)為auto,將占滿整個(gè)容器的高度。如果flex項(xiàng)目有高度,則不會(huì)被拉伸占滿,高度也可以會(huì)超過flex容器
【實(shí)踐】利用justify-content和align-items快速實(shí)現(xiàn)水平垂直居中
- 與之前的 position:absolute + margin 水平垂直居中更好,不脫標(biāo),不會(huì)遮蓋等問題
2.4.2 align-content屬性
align-content屬性只適用多行的flex容器(flex 項(xiàng)目不止一行時(shí)該屬性才有效果),它的作用是當(dāng)flex容器在交叉軸上有多余的空間時(shí),將flex 項(xiàng)目作為一個(gè)整體(屬性值為:flex-start、flex-end、center時(shí))進(jìn)行對(duì)齊。
align-content: flex-start | flex-end | center | space-between | space-around | stretch;
未指定 flex-wrap: wrap;
,那么 align-content
屬性是無效的:
翻譯:flex wrappe:nowrap屬性防止align-content產(chǎn)生效果。
嘗試將flex-wrap設(shè)置為nowrap以外的其他內(nèi)容。
說白了nowrap無效,設(shè)置 wrap-reverse 或者 wrap 是可以的,只要換行才可以對(duì)align-content產(chǎn)生效果
只要設(shè)置了flex-wrap: wrap,表示存在多行,那么就用align-content,否則單行總是用align-items即可
該屬性可能取6個(gè)值。
- flex-start:與交叉軸的起點(diǎn)對(duì)齊。
- flex-end:與交叉軸的終點(diǎn)對(duì)齊。
- center:與交叉軸的中點(diǎn)對(duì)齊。
- space-between:與交叉軸兩端對(duì)齊,軸線之間的間隔平均分布。
- space-around:每根軸線兩側(cè)的間隔都相等。所以,軸線之間的間隔比軸線與邊框的間隔大一倍。
- stretch(默認(rèn)值):軸線占滿整個(gè)交叉軸。如果flex項(xiàng)目有高度,則不會(huì)被拉伸占滿,高度也可以會(huì)超過flex容器
3 Flex 項(xiàng)目屬性
3.1 Flex項(xiàng)目排序
order屬性定義項(xiàng)目的排列順序。數(shù)值越小,排列越靠前,默認(rèn)為0。很少使用
order: <integer>;
3.2 Flex 項(xiàng)目交叉軸對(duì)齊方式
align-self屬性允許單個(gè)項(xiàng)目有與其他項(xiàng)目不一樣的對(duì)齊方式,可覆蓋align-items屬性。默認(rèn)值為auto,表示繼承父元素的align-items屬性,如果沒有父元素,則等同于stretch。
.item {align-self: auto | flex-start | flex-end | center | baseline | stretch;
}
該屬性可能取6個(gè)值,除了auto,其他都與align-items屬性完全一致。
該屬性可能取6個(gè)值,除了auto,其他都與align-items屬性完全一致。
auto 表示繼承 Flex 容器的 align-items 屬性的值。
3.2 放大比例
該屬性用來設(shè)置當(dāng)父元素的寬度大于所有子元素的寬度的和時(shí)(即父元素會(huì)有剩余空間),子元素如何分配父元素的剩余空間。 flex-grow 的默認(rèn)值為 0,意思是該元素不索取父元素的剩余空間,如果值大于0,表示索取。值越大,索取的越厲害。
flex-grow: <number>; /* default 0 */
如果所有項(xiàng)目的flex-grow屬性都為1,則它們將等分剩余空間(如果有的話)。如果一個(gè)項(xiàng)目的flex-grow屬性為2,其他項(xiàng)目都為1,則前者占據(jù)的剩余空間將比其他項(xiàng)多一倍。
假如設(shè)置父元素 400px,子元素 A 為100px,子元素 B 為 200px.則剩余空間為 100px
例子一:
A的 flex-grow 為 0,B的 flex-grow 為 0(即A、B不設(shè)置該屬性)
則A、B的實(shí)際寬度為他們本身的寬度,即A的實(shí)際寬度為100px ; B的實(shí)際寬度為200px
例子二:
A的 flex-grow 為1,B的 flex-grow為0(即不設(shè)置該屬性)
則A的實(shí)際寬度為 100px + 100px =200px ; B的實(shí)際寬度為 200px + 0 = 200px
例子三:
A的 flex-grow 為 1,B的 flex-grow 為 2
則 A 的實(shí)際寬度為 100px + 100px * 1/3 = 400/3 px , B的實(shí)際寬度為 200px + 100px * 2/3 = 800/3 px
上面的 總系數(shù)為 1 + 2 = 3 ,然后按照 各元素的 flex-grow 的屬性值進(jìn)行分配 A 1/3 B 2/3
結(jié)論: d = 剩余空間,g1 = flex-grow1,g2 = flex-grow2,A = A寬度,B = B寬度,設(shè) At = A最終分配的寬度,Bt = B最終分配的寬度,當(dāng) d > 0,At = A + d * (g1 / g1 + g2),Bt = B + d * (g1 / g1 + g2)
最終結(jié)果 At + Bt = A + B + d = 父盒子的寬度,達(dá)到擴(kuò)展
3.3 收縮比例
該屬性用來設(shè)置子元素的 縮小比例,當(dāng)父元素的寬度小于所有子元素的寬度的和時(shí)(即子元素會(huì)超出父元素),子元素如何縮小自己的寬度的。 **flex-shrink
**的默認(rèn)值為 1,當(dāng)父元素的寬度小于所有子元素的寬度的和時(shí),子元素的寬度會(huì)減小。值越大,減小的越厲害。如果值為 0,表示不減小。
假如設(shè)置父元素 400px,子元素A為 200px,子元素B為 300px.則超出空間為 100px
例子一:
設(shè)置A的 flex-shrink 為 0,B的 flex-shrink 為 0
則A,B都不減小寬度,A、B的實(shí)際寬度為他們本身的寬度,即A的實(shí)際寬度為 200px ; B的實(shí)際寬度為 300px
例子二:
A的 flex-shrink 為 0,B的 flex-shrink 為 1,則A不減小寬度,B減小
則A的實(shí)際寬度為他本身的寬度= 200px , B的實(shí)際寬度為 300px - 100px(超出的寬度)= 200px
例子三:
如果A,B都減小寬度,A設(shè)置 flex-shirk 為 3,B設(shè)置 flex-shirk 為 2。則最終 A 的大小為 自身寬度 (200px) - A減小的寬度(100px * (200px * 3 / (200px * 3 + 300px * 2))) = 150px
最終 B 的大小為 自身寬度 (300px)- B減小的寬度 (100px * (300px * 2/(200px* 3 + 300px* 2))) = 250px
結(jié)論: d = 超出空間,g1 = flex-shrink1,g2 = flex-shrink2,A = A寬度,B = B寬度,設(shè) At = A最終分配的寬度,Bt = B最終分配的寬度,當(dāng) d > 0,At = A - d * ( A * g1 / (A * g1 + B * g2) ),Bt = B - d * ( B * g2 / (A * g1 + B * g2) )
最終結(jié)果 At + Bt = A + B - d = 父盒子的寬度,達(dá)到收縮
3.4 Flex項(xiàng)目基準(zhǔn)寬度
basis 的中文意思就是 基礎(chǔ)、基準(zhǔn) ,該屬性用來設(shè)置元素的寬度,通常情況下大家使用 width 設(shè)置寬度。但是如果元素上同時(shí)設(shè)置了 width 和 flex-basis ,那么 width 的值就會(huì)被 flex-basis 覆蓋掉。其實(shí)就是flex 項(xiàng)目占據(jù)的主軸寬度(main size),可伸縮
flex-basis: <length> | auto; /* default auto */
放大比例(flex-grow)和收縮比例(flex-shrink)都是更加基準(zhǔn)寬度(flex-basis)來進(jìn)行計(jì)算的,如果沒有基準(zhǔn)寬度(flex-basis),那么就去使用width,如果width也沒有,就會(huì)自動(dòng)計(jì)算。
<style>.father {display: flex;width: 400px;height: 200px;}.box {width: 200px;height: 100px;flex-basis: 300px;background: blue;}
</style>
<div class="father"><div class="box"></div>
</div>
可以看到給父元素添加 display:flex 屬性后讓其變成 flex 布局 ,子元素的 width 設(shè)置成 200 px ,flex-basis 設(shè)置成 300 px,最終顯示為 300px ,width 的值就被 flex-basis 覆蓋掉,這個(gè)屬性比較好理解
flex 屬性
flex屬性是flex-grow, flex-shrink 和 flex-basis的簡(jiǎn)寫,默認(rèn)值為0 1 auto。后兩個(gè)屬性可選。
.item {flex: none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ]
}
該屬性有兩個(gè)快捷值:auto (1 1 auto) 和 none (0 0 auto)。
建議優(yōu)先使用這個(gè)屬性,而不是單獨(dú)寫三個(gè)分離的屬性,因?yàn)闉g覽器會(huì)推算相關(guān)值。