基本的布局方法——Flex布局

4.2 基本的布局方法——Flex布局

如果之前你接觸過(guò)網(wǎng)頁(yè)開(kāi)發(fā)中的flexbox布局悄晃,基本上你可以略過(guò)這節(jié)。但有一點(diǎn)需要注意的是,你的小程序要求兼容到iOS8以下版本饶火,需要開(kāi)啟樣式自動(dòng)補(bǔ)全。開(kāi)啟樣式自動(dòng)補(bǔ)全致扯,在“設(shè)置”—“項(xiàng)目設(shè)置”—勾選“上傳代碼時(shí)樣式自動(dòng)補(bǔ)全”肤寝。

image.png

? 圖4-2 開(kāi)發(fā)者工具開(kāi)啟樣式自動(dòng)補(bǔ)全

在小程序開(kāi)發(fā)中,我們需要考慮各種尺寸終端設(shè)備上的適配抖僵。在傳統(tǒng)網(wǎng)頁(yè)開(kāi)發(fā)鲤看,我們用的是盒模型,通過(guò)display:inline | block | inline-block裆针、 position刨摩、float來(lái)實(shí)現(xiàn)布局,缺乏靈活性且有些適配效果難以實(shí)現(xiàn)世吨。比如像下面這種常見(jiàn)的信息列表澡刹,要求內(nèi)容高度不確定下保持垂直居中:

圖4-3 常見(jiàn)的信息列表排版方式

? 圖4-3 常見(jiàn)的信息列表排版方式

這種情況下,我們更建議用flex布局耘婚。

在開(kāi)始介紹flex之前罢浇,為了表述方便,我們約定以下術(shù)語(yǔ):采用flex布局的元素,簡(jiǎn)稱(chēng)為“容器”嚷闭,在代碼示例中以container表示容器的類(lèi)名攒岛。容器內(nèi)的元素簡(jiǎn)稱(chēng)為“項(xiàng)目”,在代碼示例中以item表示項(xiàng)目的類(lèi)名胞锰。

圖4-4 container容器和item項(xiàng)目

4.2.1 基本概念

flex的概念最早是在2009年被提出灾锯,目的是提供一種更靈活的布局模型,使容器能通過(guò)改變里面項(xiàng)目的高寬嗅榕、順序顺饮,來(lái)對(duì)可用空間實(shí)現(xiàn)最佳的填充,方便適配不同大小的內(nèi)容區(qū)域凌那。

在不固定高度信息的例子中兼雄,我們只需要在容器中設(shè)置以下兩個(gè)屬性即可實(shí)現(xiàn)內(nèi)容不確定下的垂直居中。

.container{

  display: flex;

  flex-direction: column;

  justify-content: center;

}

flex不單是一個(gè)屬性帽蝶,它包含了一套新的屬性集赦肋。屬性集包括用于設(shè)置容器,和用于設(shè)置項(xiàng)目?jī)刹糠帧?/p>

設(shè)置容器的屬性有:

display:flex;

flex-direction:row(默認(rèn)值) | row-reverse | column |column-reverse

flex-wrap:nowrap(默認(rèn)值) | wrap | wrap-reverse

justify-content:flex-start(默認(rèn)值) | flex-end | center |space-between | space-around | space-evenly

align-items:stretch(默認(rèn)值) | center  | flex-end | baseline | flex-start

align-content:stretch(默認(rèn)值) | flex-start | center |flex-end | space-between | space-around | space-evenly

設(shè)置項(xiàng)目的屬性有:

order:0(默認(rèn)值) | <integer>

flex-shrink:1(默認(rèn)值) | <number>

flex-grow:0(默認(rèn)值) | <number>

flex-basis:auto(默認(rèn)值) | <length>

flex:none | auto | @flex-grow @flex-shrink @flex-basis

align-self:auto(默認(rèn)值) | flex-start | flex-end |center | baseline| stretch

在開(kāi)始介紹各個(gè)屬性之前励稳,我們需要先明確一個(gè)坐標(biāo)軸佃乘。默認(rèn)的情況下,水平方向的是主軸(main axis)麦锯,垂直方向的是交叉軸(cross axis)恕稠。

圖4-5 默認(rèn)情況下的主軸與交叉軸

項(xiàng)目是在主軸上排列,排滿后在交叉軸方向換行扶欣。需要注意的是鹅巍,交叉軸垂直于主軸,它的方向取決于主軸方向料祠。

?圖4-6 項(xiàng)目是在主軸上排列骆捧,排滿后在交叉軸方向換行

接下來(lái)的例子如無(wú)特殊聲明柑土,我們都以默認(rèn)情況下的坐標(biāo)軸為例振亮。

4.2.2 容器屬性

設(shè)置容器芒珠,用于統(tǒng)一管理容器內(nèi)項(xiàng)目布局沧烈,也就是管理項(xiàng)目的排列方式和對(duì)齊方式。

flex-direction 屬性

通過(guò)設(shè)置坐標(biāo)軸伍掀,來(lái)設(shè)置項(xiàng)目排列方向偎快。

.container{
  flex-direction: row(默認(rèn)值) | row-reverse | column | column-reverse
}

row(默認(rèn)值):主軸橫向囊咏,方向?yàn)閺淖笾赶蛴抑瓴琛m?xiàng)目沿主軸排列来涨,從左到右排列。

row-reverse:row的反方向启盛。主軸橫向蹦掐,方向?yàn)閺挠抑赶蜃蠹几帷m?xiàng)目沿主軸排列,從右到左排列卧抗。

column:主軸縱向藤滥,方向從上指向下。項(xiàng)目沿主軸排列社裆,從上到下排列拙绊。

column-reverse:column的反方向。主軸縱向浦马,方向從下指向上时呀。項(xiàng)目沿主軸排列,從下到上排列晶默。

圖4-7 flex-direction

flex-wrap 屬性

設(shè)置是否允許項(xiàng)目多行排列,以及多行排列時(shí)換行的方向航攒。

.container{
  flex-wrap: nowrap(默認(rèn)值) | wrap | wrap-reverse
}

nowrap(默認(rèn)值):不換行磺陡。如果單行內(nèi)容過(guò)多,則溢出容器漠畜。
wrap:容器單行容不下所有項(xiàng)目時(shí)币他,換行排列。
wrap-reverse:容器單行容不下所有項(xiàng)目時(shí)憔狞,換行排列蝴悉。換行方向?yàn)閣rap時(shí)的反方向。

?
圖4-8 flex-wrap

justify-content 屬性

設(shè)置項(xiàng)目在主軸方向上對(duì)齊方式瘾敢,以及分配項(xiàng)目之間及其周?chē)嘤嗟目臻g拍冠。

.container{

  justify-content: flex-start(默認(rèn)值) | flex-end | center | space-between | space-around| space-evenly

}

flex-start(默認(rèn)值):項(xiàng)目對(duì)齊主軸起點(diǎn),項(xiàng)目間不留空隙簇抵。

center:項(xiàng)目在主軸上居中排列庆杜,項(xiàng)目間不留空隙。主軸上第一個(gè)項(xiàng)目離主軸起點(diǎn)距離等于最后一個(gè)項(xiàng)目離主軸終點(diǎn)距離碟摆。

flex-end:項(xiàng)目對(duì)齊主軸終點(diǎn)晃财,項(xiàng)目間不留空隙。
space-between:項(xiàng)目間間距相等典蜕,第一個(gè)項(xiàng)目離主軸起點(diǎn)和最后一個(gè)項(xiàng)目離主軸終點(diǎn)距離為0断盛。
space-around:與space-between相似。不同點(diǎn)為愉舔,第一個(gè)項(xiàng)目離主軸起點(diǎn)和最后一個(gè)項(xiàng)目離主軸終點(diǎn)距離為中間項(xiàng)目間間距的一半钢猛。

space-evenly:項(xiàng)目間間距、第一個(gè)項(xiàng)目離主軸起點(diǎn)和最后一個(gè)項(xiàng)目離主軸終點(diǎn)距離等于項(xiàng)目間間距屑宠。

圖4-9 justify-content

align-items 屬性

設(shè)置項(xiàng)目在行中的對(duì)齊方式厢洞。

.container{

  align-items:stretch(默認(rèn)值) | flex-start | center | flex-end | baseline

}

stretch(默認(rèn)值):項(xiàng)目拉伸至填滿行高。
flex-start:項(xiàng)目頂部與行起點(diǎn)對(duì)齊。
center:項(xiàng)目在行中居中對(duì)齊躺翻。
flex-end:項(xiàng)目底部與行終點(diǎn)對(duì)齊丧叽。
baseline:項(xiàng)目的第一行文字的基線對(duì)齊。公你。

圖4-10 align-items

align-content 屬性

多行排列時(shí)踊淳,設(shè)置行在交叉軸方向上的對(duì)齊方式,以及分配行之間及其周?chē)嘤嗟目臻g陕靠。

.container{

  align-content: stretch(默認(rèn)值) | flex-start | center | flex-end | space-between |space-around | space-evenly

}

stretch(默認(rèn)值):當(dāng)未設(shè)置項(xiàng)目尺寸迂尝,將各行中的項(xiàng)目拉伸至填滿交叉軸。當(dāng)設(shè)置了項(xiàng)目尺寸剪芥,項(xiàng)目尺寸不變垄开,項(xiàng)目行拉伸至填滿交叉軸。

flex-start:首行在交叉軸起點(diǎn)開(kāi)始排列税肪,行間不留間距溉躲。

center:行在交叉軸中點(diǎn)排列,行間不留間距益兄,首行離交叉軸起點(diǎn)和尾行離交叉軸終點(diǎn)距離相等锻梳。

flex-end:尾行在交叉軸終點(diǎn)開(kāi)始排列,行間不留間距净捅。
space-between:行與行間距相等疑枯,首行離交叉軸起點(diǎn)和尾行離交叉軸終點(diǎn)距離為0。
space-around:行與行間距相等蛔六,首行離交叉軸起點(diǎn)和尾行離交叉軸終點(diǎn)距離為行與行間間距的一半荆永。

space-evenly:行間間距、以及首行離交叉軸起點(diǎn)和尾行離交叉軸終點(diǎn)距離相等古今。



圖4-11 align-content

4.2.3 項(xiàng)目屬性

設(shè)置項(xiàng)目屁魏,用于設(shè)置項(xiàng)目的尺寸、位置捉腥,以及對(duì)項(xiàng)目的對(duì)齊方式做特殊設(shè)置氓拼。

order 屬性

設(shè)置項(xiàng)目沿主軸方向上的排列順序,數(shù)值越小抵碟,排列越靠前桃漾。屬性值為整數(shù)。

.item{

  order: 0(默認(rèn)值) | <integer>

}

圖4-12 order

?

flex-shrink 屬性

當(dāng)項(xiàng)目在主軸方向上溢出時(shí)拟逮,通過(guò)設(shè)置項(xiàng)目收縮因子來(lái)壓縮項(xiàng)目適應(yīng)容器撬统。屬性值為項(xiàng)目的收縮因子,屬性值取非負(fù)數(shù)敦迄。

.item{

  flex-shrink: 1(默認(rèn)值) | <number>

}

.item1{

  width: 120px;

  flex-shrink: 2;

}

.item2{

  width: 150px;

  flex-shrink: 3;

}

.item3{// 項(xiàng)目3未設(shè)置flex-shrink恋追,默認(rèn)flex-shrink值為1

  width: 180px;

}

為了加深理解凭迹,我們舉個(gè)例子:

一個(gè)寬度為400px的容器,里面的三個(gè)項(xiàng)目width分別為120px苦囱,150px嗅绸,180px。分別對(duì)這項(xiàng)目1和項(xiàng)目2設(shè)置flex-shrink值為2和3撕彤。

.container{

  display: flex;

  width: 400px; // 容器寬度為400px

}

在這個(gè)例子中鱼鸠,項(xiàng)目溢出 400 - (120 + 150 + 180) = -50px。計(jì)算壓縮量時(shí)總權(quán)重為各個(gè)項(xiàng)目的寬度乘以flex-shrink的總和羹铅,這個(gè)例子壓縮總權(quán)重為120 * 2 + 150 * 3+ 180 * 1 = 870蚀狰。各個(gè)項(xiàng)目壓縮空間大小為總溢出空間乘以項(xiàng)目寬度乘以flex-shrink除以總權(quán)重:

item1的最終寬度為:120 - 50 * 120 * 2 / 870 ≈ 106px

item2的最終寬度為:150 - 50 * 150 * 3 / 870 ≈ 124px

item3的最終寬度為:180 - 50 * 180 * 1 / 870 ≈ 169px

其中計(jì)算時(shí)候值如果為小數(shù),則向下取整职员。

圖4-13 flex-shrink

?

需要注意一點(diǎn)麻蹋,當(dāng)項(xiàng)目的壓縮因子相加小于1時(shí),參與計(jì)算的溢出空間不等于完整的溢出空間焊切。在上面例子的基礎(chǔ)上哥蔚,我們改變各個(gè)項(xiàng)目的flex-shrink。

.container{

  display: flex;

  width: 400px; // 容器寬度為400px

}

.item1{

  width: 120px;

  flex-shrink: 0.1;

}

.item2{

  width: 150px;

  flex-shrink: 0.2;

}

.item3{

  width: 180px;

  flex-shrink: 0.3;

}

總權(quán)重為:120 * 0.1 + 150 * 0.2 + 180 * 0.3 = 96蛛蒙。參與計(jì)算的溢出空間不再是50px,而是50 * (0.1 + 0.2 + 0.3) / 1 =30:

item1的最終寬度為:120 - 30 * 120 * 0.1 / 96 ≈ 116px

item2的最終寬度為:150 - 30 * 150 * 0.2 / 96 ≈ 140px

item3的最終寬度為:180 - 30 * 180 * 0.3 / 96 ≈ 163px

flex-grow 屬性

當(dāng)項(xiàng)目在主軸方向上還有剩余空間時(shí)渤愁,通過(guò)設(shè)置項(xiàng)目擴(kuò)張因子進(jìn)行剩余空間的分配牵祟。屬性值為項(xiàng)目的擴(kuò)張因子,屬性值取非負(fù)數(shù)抖格。

.item{

  flex-grow: 0(默認(rèn)值) | <number>

}

為了加深理解诺苹,我們舉個(gè)例子:

一個(gè)寬度為400px的容器,里面的三個(gè)項(xiàng)目width分別為80px雹拄,120px收奔,140px。分別對(duì)這項(xiàng)目1和項(xiàng)目2設(shè)置flex-grow值為3和1滓玖。

.container{

  display: flex;

  width: 400px; // 容器寬度為400px

}

.item1{

  width: 80px;

  flex-grow: 3;

}

.item2{

  width: 120px;

  flex-grow: 1;

}

.item3{// 項(xiàng)目3未設(shè)置flex-grow坪哄,默認(rèn)flex-grow值為0

  width: 140px;

}

在這個(gè)例子中,容器的剩余空間為 400 - (80 + 120 + 140) = 60px势篡。剩余空間按 60 / (3 + 1 + 0) = 15px進(jìn)行分配:

item1的最終寬度為:80+ (15 * 3) = 125px

item2的最終寬度為:120 + (15 * 1) = 135px

item3的最終寬度為:140 + (15 * 0) =140px

圖4-14 flex-grow

?

需要注意一點(diǎn)翩肌,當(dāng)項(xiàng)目的擴(kuò)張因子相加小于1時(shí),剩余空間按除以1進(jìn)行分配禁悠。在上面例子的基礎(chǔ)上念祭,我們改變各個(gè)項(xiàng)目的flex-grow。

.container{

  display: flex;

  width: 400px; // 容器寬度為400px

}

.item1{

  width: 50px;

  flex-grow: 0.1;

}

.item2{

  width: 80px;

  flex-grow: 0.3;

}

.item3{

  width: 110px;

  flex-grow: 0.2;

}

在這個(gè)例子中碍侦,容器的剩余空間為 400 - (50 + 80 + 110) = 160px粱坤。由于項(xiàng)目的flex-grow相加0.1 + 0.3 + 0.2 = 0.6小于1隶糕,剩余空間按 160 / 1 = 160px劃分。例子中的項(xiàng)目寬度分別為:

item1的最終寬度為:50 + (160 * 0.1) = 66px

item2的最終寬度為:80 + (160 * 0.3) = 128px

item3的最終寬度為:110 + (160 * 0.2) = 142px

flex-basis 屬性

當(dāng)容器設(shè)置flex-direction為row或row-reverse時(shí)站玄,flex-basis和width同時(shí)存在枚驻,flex-basis優(yōu)先級(jí)高于width,也就是此時(shí)flex-basis代替項(xiàng)目的width屬性蜒什。

當(dāng)容器設(shè)置flex-direction為column或column-reverse時(shí)测秸,flex-basis和height同時(shí)存在,flex-basis優(yōu)先級(jí)高于height灾常,也就是此時(shí)flex-basis代替項(xiàng)目的height屬性霎冯。

需要注意的是,當(dāng)flex-basis和width(或height)钞瀑,其中一個(gè)屬性值為auto時(shí)沈撞,非auto的優(yōu)先級(jí)更高。

.item{

  flex-basis: auto(默認(rèn)值) | <number>px

}

圖4-15 flex-basis

flex 屬性

是flex-grow雕什,flex-shrink缠俺,flex-basis的簡(jiǎn)寫(xiě)方式。值設(shè)置為none贷岸,等價(jià)于00 auto壹士。值設(shè)置為auto,等價(jià)于1 1 auto偿警。

.item{

  flex: none | auto | @flex-grow @flex-shrink@flex-basis

}

align-self 屬性

設(shè)置項(xiàng)目在行中交叉軸方向上的對(duì)齊方式躏救,用于覆蓋容器的align-items,這么做可以對(duì)項(xiàng)目的對(duì)齊方式做特殊處理螟蒸。默認(rèn)屬性值為auto盒使,繼承容器的align-items值,當(dāng)容器沒(méi)有設(shè)置align-items時(shí)七嫌,屬性值為stretch少办。

.item{

  align-self: auto(默認(rèn)值) | flex-start | center | flex-end | baseline |stretch

}

圖4-16 align-self

?

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市诵原,隨后出現(xiàn)的幾起案子英妓,更是在濱河造成了極大的恐慌,老刑警劉巖皮假,帶你破解...
    沈念sama閱讀 216,843評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鞋拟,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡惹资,警方通過(guò)查閱死者的電腦和手機(jī)贺纲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,538評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)褪测,“玉大人猴誊,你說(shuō)我怎么就攤上這事潦刃。” “怎么了懈叹?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,187評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵乖杠,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我澄成,道長(zhǎng)胧洒,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,264評(píng)論 1 292
  • 正文 為了忘掉前任墨状,我火速辦了婚禮卫漫,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘肾砂。我一直安慰自己列赎,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,289評(píng)論 6 390
  • 文/花漫 我一把揭開(kāi)白布镐确。 她就那樣靜靜地躺著包吝,像睡著了一般。 火紅的嫁衣襯著肌膚如雪源葫。 梳的紋絲不亂的頭發(fā)上诗越,一...
    開(kāi)封第一講書(shū)人閱讀 51,231評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音息堂,去河邊找鬼掺喻。 笑死,一個(gè)胖子當(dāng)著我的面吹牛储矩,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播褂乍,決...
    沈念sama閱讀 40,116評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼持隧,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了逃片?” 一聲冷哼從身側(cè)響起屡拨,我...
    開(kāi)封第一講書(shū)人閱讀 38,945評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎褥实,沒(méi)想到半個(gè)月后呀狼,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,367評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡损离,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,581評(píng)論 2 333
  • 正文 我和宋清朗相戀三年哥艇,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片僻澎。...
    茶點(diǎn)故事閱讀 39,754評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡貌踏,死狀恐怖十饥,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情祖乳,我是刑警寧澤逗堵,帶...
    沈念sama閱讀 35,458評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站眷昆,受9級(jí)特大地震影響蜒秤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜亚斋,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,068評(píng)論 3 327
  • 文/蒙蒙 一作媚、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧伞访,春花似錦掂骏、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,692評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至冒黑,卻和暖如春田绑,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背抡爹。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,842評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工掩驱, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人冬竟。 一個(gè)月前我還...
    沈念sama閱讀 47,797評(píng)論 2 369
  • 正文 我出身青樓欧穴,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親泵殴。 傳聞我的和親對(duì)象是個(gè)殘疾皇子涮帘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,654評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容