Flex布局基礎(chǔ)+實(shí)例

阮一峰Flex布局文檔貼在這了,講的已經(jīng)非常詳細(xì)了,本文主要是總結(jié)下,便于自己今后快速回顧适刀。

Flex布局是什么

Flex 是 Flexible Box 的縮寫秤朗,意為"彈性盒子"煤蹭,用來(lái)為盒狀模型提供最大的靈活性。Flex布局即彈性布局取视。
任何容器都可以指定為flex布局.box{display:flex;}
行內(nèi)元素使用flex布局:.box{display: inline-flex;}
注意:使用Flex布局之后硝皂,里面的float、clear作谭、vertical-align屬性將失效稽物。

基本概念

容器默認(rèn)存在兩根軸:水平的主軸(main axis)和垂直的交叉軸(cross axis)。主軸的開始位置(與邊框的交叉點(diǎn))叫做main start折欠,結(jié)束位置叫做main end贝或;交叉軸的開始位置叫做cross start,結(jié)束位置叫做cross end锐秦。

容器的屬性

  1. flex-direction決定主軸的方向
  2. flex-wrap 設(shè)置項(xiàng)目是否在一條線上
  3. flex-flow 屬性是flex-direction屬性和flex-wrap屬性的簡(jiǎn)寫形式咪奖,默認(rèn)值為row nowrap
  4. justify-content 屬性定義項(xiàng)目在主軸上的對(duì)齊方式
  5. align-items 屬性定義項(xiàng)目在縱軸上的對(duì)齊方式
  6. align-content 屬性定義了多根軸線的對(duì)齊方式

flex-direction屬性決定主軸的方向(主軸為水平方向還是為垂直方向)/設(shè)置項(xiàng)目的排列方向,默認(rèn)為row

  • column-reverse:主軸為垂直方向酱床,起點(diǎn)在下沿羊赵。
  • column:主軸為垂直方向,起點(diǎn)在上沿扇谣。
  • row(默認(rèn)值):主軸為水平方向昧捷,起點(diǎn)在左端闲昭。
  • row-reverse:主軸為水平方向,起點(diǎn)在右端靡挥。
    對(duì)應(yīng)的效果如下:


    image.png

flex-wrap設(shè)置項(xiàng)目是否在一條線上序矩,默認(rèn)項(xiàng)目都排在一條線上為nowrap

  • flex-wrap: wrap 換行,第一行在上方
  • flex-wrap: nowrap (默認(rèn))不換行
  • flex-wrap: wrap-reverse換行跋破,第一行在下方

flex-flow 屬性是flex-direction屬性和flex-wrap屬性的簡(jiǎn)寫形式贮泞,默認(rèn)值為row nowrap

justify-content屬性定義項(xiàng)目在主軸上的對(duì)齊方式,默認(rèn)值為flex-start

  • 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)目與邊框的間隔大一倍令蛉。


    image.png

align-items屬性定義項(xiàng)目在縱軸上的對(duì)齊方式,默認(rèn)值為stretch狡恬,適用于項(xiàng)目在縱軸上高度不一樣的情況珠叔,為了更好的看到效果,我為項(xiàng)目添加了一些樣式

  • flex-start:交叉軸的起點(diǎn)對(duì)齊弟劲。
  • flex-end:交叉軸的終點(diǎn)對(duì)齊祷安。
  • center:交叉軸的中點(diǎn)對(duì)齊。
  • baseline: 項(xiàng)目的第一行文字的基線對(duì)齊兔乞。
  • stretch(默認(rèn)值):如果項(xiàng)目未設(shè)置高度或設(shè)為auto汇鞭,將占滿整個(gè)容器的高度。


    image.png

align-content屬性定義了多根軸線的對(duì)齊方式庸追。如果項(xiàng)目只有一根軸線霍骄,該屬性不起作用。(即需要設(shè)置容器的flex-wrap屬性值為wrap)(為了讓效更加明顯淡溯,我設(shè)置了容器的高度)

  • flex-start:與交叉軸的起點(diǎn)對(duì)齊读整。
  • flex-end:與交叉軸的終點(diǎn)對(duì)齊。
  • center:與交叉軸的中點(diǎn)對(duì)齊咱娶。
  • space-between:與交叉軸兩端對(duì)齊米间,軸線之間的間隔平均分布。
  • space-around:每根軸線兩側(cè)的間隔都相等膘侮。所以屈糊,軸線之間的間隔比軸線與邊框的間隔大一倍。
  • stretch(默認(rèn)值):軸線占滿整個(gè)交叉軸喻喳。


    image.png

項(xiàng)目的屬性

  • order 屬性定義項(xiàng)目的排列順序另玖。數(shù)值越小,排列越靠前,默認(rèn)為0谦去。
  • flex-grow 屬性定義項(xiàng)目的放大比例慷丽,默認(rèn)為0,即如果存在剩余空間鳄哭,也不放大要糊。
  • flex-shrink 屬性定義了項(xiàng)目的縮小比例,默認(rèn)為1妆丘,即如果空間不足锄俄,該項(xiàng)目將縮小。
  • flex-basis 屬性定義了在分配多余空間之前勺拣,項(xiàng)目占據(jù)的主軸空間(main size)奶赠。瀏覽器根據(jù)這個(gè)屬性,計(jì)算主軸是否有多余空間药有。它的默認(rèn)值為auto毅戈,即項(xiàng)目的本來(lái)大小。
  • flex 屬性是flex-grow, flex-shrink 和 flex-basis的簡(jiǎn)寫愤惰,默認(rèn)值為0 1 auto苇经。后兩個(gè)屬性可選。
  • align-self 屬性允許單個(gè)項(xiàng)目有與其他項(xiàng)目不一樣的對(duì)齊方式宦言,可覆蓋align-items屬性扇单。默認(rèn)值為auto,表示繼承父元素的align-items屬性奠旺,如果沒(méi)有父元素蜘澜,則等同于stretch。

實(shí)例

骰子的布局

image.png

網(wǎng)格布局

最簡(jiǎn)單的網(wǎng)格布局凉倚,就是平均分布兼都。在容器里面平均分配空間,跟上面的骰子布局很像稽寒,但是需要設(shè)置項(xiàng)目的自動(dòng)縮放。


image.png
<div class="Grid">
    <div class="Grid-cell">...</div>
    <div class="Grid-cell">...</div>
    <div class="Grid-cell">...</div>
</div>
.Grid {
  display: flex;
}
.Grid-cell {
  flex: 1;
}

百分比布局

某個(gè)網(wǎng)格的寬度為固定的百分比趟章,其余網(wǎng)格平均分配剩余的空間杏糙。

image.png
<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%;
}

圣杯布局

圣杯布局(Holy Grail Layout)指的是一種最常見(jiàn)的網(wǎng)站布局。頁(yè)面從上到下蚓土,分成三個(gè)部分:頭部(header)宏侍,軀干(body),尾部(footer)蜀漆。其中軀干又水平分成三欄谅河,從左到右為:導(dǎo)航、主欄、副欄绷耍。


image.png
<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>
.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;
  }
}

輸入框的布局

我們常常需要在輸入框的前方添加提示褂始,后方添加按鈕诸典。


image.png
<div class="InputAddOn">
    <span class="InputAddOn-item">...</span>
    <input class="InputAddOn-field">
    <button class="InputAddOn-item">...</button>
</div>
.InputAddOn {
  display: flex;
}

.InputAddOn-field {
  flex: 1;
}

懸掛式布局

有時(shí),主欄的左側(cè)或右側(cè)崎苗,需要添加一個(gè)圖片欄狐粱。

image.png
<div class="Media">
    <img class="Media-figure" src="" alt="">
    <p class="Media-body">...</p>
</div>
.Media {
  display: flex;
  align-items: flex-start;
}

.Media-figure {
  margin-right: 1em;
}

.Media-body {
  flex: 1;
}

固定的底欄

image.png
<body class="Site">
    <header>...</header>
    <main class="Site-content">...</main>
    <footer>...</footer>
</body>
.Site {
  display: flex;
  min-height: 100vh;
  flex-direction: column;
}

.Site-content {
  flex: 1;
}

流式布局

每行的項(xiàng)目數(shù)固定,會(huì)自動(dòng)分行胆数。

image.png
.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;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末肌蜻,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子必尼,更是在濱河造成了極大的恐慌宋欺,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件胰伍,死亡現(xiàn)場(chǎng)離奇詭異齿诞,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)骂租,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門祷杈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人渗饮,你說(shuō)我怎么就攤上這事但汞。” “怎么了互站?”我有些...
    開封第一講書人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵私蕾,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我胡桃,道長(zhǎng)踩叭,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任翠胰,我火速辦了婚禮容贝,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘之景。我一直安慰自己斤富,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開白布锻狗。 她就那樣靜靜地躺著满力,像睡著了一般焕参。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上油额,一...
    開封第一講書人閱讀 51,365評(píng)論 1 302
  • 那天叠纷,我揣著相機(jī)與錄音,去河邊找鬼悔耘。 笑死讲岁,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的衬以。 我是一名探鬼主播缓艳,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼看峻!你這毒婦竟也來(lái)了阶淘?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤互妓,失蹤者是張志新(化名)和其女友劉穎溪窒,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體冯勉,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡澈蚌,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了灼狰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宛瞄。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖交胚,靈堂內(nèi)的尸體忽然破棺而出份汗,到底是詐尸還是另有隱情,我是刑警寧澤蝴簇,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布杯活,位于F島的核電站,受9級(jí)特大地震影響熬词,放射性物質(zhì)發(fā)生泄漏旁钧。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一荡澎、第九天 我趴在偏房一處隱蔽的房頂上張望均践。 院中可真熱鬧,春花似錦摩幔、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)焦影。三九已至,卻和暖如春封断,著一層夾襖步出監(jiān)牢的瞬間斯辰,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工坡疼, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留彬呻,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓柄瑰,卻偏偏與公主長(zhǎng)得像闸氮,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子教沾,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354