深入理解flex-grow脯燃、flex-basis、flex-shrink

布局的傳統(tǒng)解決方案基于 盒模型 辕棚,依賴 display + position + float 邓厕,flex 為布局帶來了新的時代,我們再也不用局限于 float 和 position 详恼,特別是在移動端,我們可以利用 flex 輕松實現(xiàn)以往 float 和 psition 很難實現(xiàn)的布局挽铁。 本文主要講解flex的三個子屬性:flex-grow敞掘、flex-basis叽掘、flex-shrink

如果你對 flex 還沒有接觸過玖雁,或者概念模糊,推薦阮老師的 flex 布局教程

flex 布局發(fā)生在父容器和子容器之間

采用 flex 布局的元素浓镜,稱為 flex 容器(flex container)劲厌。它的所有子元素自動成為容器成員。成員根據(jù) flex 的規(guī)則瓜分容器的剩余空間脊僚。

什么是剩余空間遵绰?

具備 flex 環(huán)境的父容器增淹,通常是有一條水平的主軸和一條垂直的交叉軸。剩余空間就是父容器在主軸的方向上還有多少可用的空間虑润。比如看下面這段html結(jié)構(gòu):

<style>
.container {
  width: 500px;
  display: flex;
  display: -webkit-flex;
}
</style>
<div class="container">
  <span class="B1"></span>
  <span class="B2"></span>
  <span class="B3"></span>
</div>

container 就是父容器,B1 B2 B3 就是子容器哭当。剩余空間就是:500px - B1.width - B2.width - B3.width冗澈。嗯就是這么簡單!

flex-grow

知道了剩余空間的概念亚亲,首先來看一下 flex-grow。上面那個例子肛响,現(xiàn)在我們再假設(shè) B1、B2特笋、B3 的 width 是100px巾兆,那么剩余空間就是 500-100*3=200px。 知道了剩余空間有什么用呢臼寄?這個時候 flex-grow 就該出場了,假如我們這個時候?qū)?B1 設(shè)置 flex-grow: 1;质帅,那么我們會發(fā)現(xiàn)留攒,B1 把 B2 和 B3 都擠到右邊了煤惩,也就是說剩余的200px空間都被 B1 占據(jù)了炼邀,所以此時 B1 的 width 比實際設(shè)置的值要大。

所以這里 flex-grow 的意思已經(jīng)很明顯了洛退,就是索取父容器的剩余空間,默認(rèn)值是0兵怯,就是三個子容器都不索取剩余空間。

但是當(dāng) B1 設(shè)置了 flex-grow: 1; 的時候驼仪,剩余空間就會被分成一份,然后都給了 B1袜漩。 如果此時B2設(shè)置了 flex-grow: 2;,那么說明 B2 也參與到瓜分剩余空間中來宙攻,并且他是占據(jù)了剩余空間中的2份,那么此時父容器就會把剩余空間分為3份仇味,然后1份給到B1雹顺,2份給到B2廊遍。

flex-basis

flex-basis 的作用也就是 width 的替代品嬉愧。 如果子容器設(shè)置了 flex-basis 或者 width,那么在分配空間之前没酣,他們會先跟父容器預(yù)約這么多的空間卵迂,然后剩下的才是歸入到剩余空間,然后父容器再把剩余空間分配給設(shè)置了flex-grow 的容器见咒。 如果同時設(shè)置 flex-basis 和 width,flex-basis 的優(yōu)先級比 width 高下翎。有一點需要注意宝当,如果flex-basis 和 width 其中有一個是 auto视事,那么另外一個非 auto 的屬性優(yōu)先級會更高。

flex-shrink

該屬性來設(shè)置當(dāng)父元素的寬度小于所有子元素的寬度的和時(即子元素會超出父元素)俐东,子元素如何縮小自己的寬度。
flex-shrink 的默認(rèn)值為1虏辫,當(dāng)父元素的寬度小于所有子元素的寬度的和時,子元素的寬度會減小套利。值越大鹤耍,減小的越厲害。如果值為0稿黄,表示始終不減小。

如上面的例子 B1族购、B2、B3的 width 都為 200px 時寝杖,子元素的寬度和超過父元素的 500px互纯,如果 B1 設(shè)置了 flex-shrink: 0; ,則 B1 的大小為 200px留潦,B2 設(shè)置 flex-shrink: 3;,B3 設(shè)置 flex-shrink: 2;殖卑,則 B2坊萝、B3的縮小比例為 3:2。下面就是求解方程的過程了屹堰,我們可以設(shè)置 B2 的縮小比為 3a,B3 的縮小比為 2a扯键,則有等式 200px * (1 - 3a) + 200px * (1- 2a) = 500px - 200px ,計算得到 a = 0.1馅笙,所以 B2 的 width 為 140px,B3 的width 為 160px董习。

總結(jié)

  1. 如果父容器空間不夠,就使用壓縮 flex-shrink 招刹,否則使用擴張 flex-grow
  2. 如果你不希望某個容器在任何時候都不被壓縮窝趣,那設(shè)置 flex-shrink: 0
  3. 如果子容器的的 flex-basis 設(shè)置為0,那么計算剩余空間的時候?qū)⒉粫樽尤萜黝A(yù)留空間
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末妇拯,一起剝皮案震驚了整個濱河市洗鸵,隨后出現(xiàn)的幾起案子越锈,更是在濱河造成了極大的恐慌膘滨,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件对蒲,死亡現(xiàn)場離奇詭異贡翘,居然都是意外死亡砰逻,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進店門踊东,熙熙樓的掌柜王于貴愁眉苦臉地迎上來刚操,“玉大人,你說我怎么就攤上這事菊霜。” “怎么了鉴逞?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長液南。 經(jīng)常有香客問我,道長统扳,這世上最難降的妖魔是什么畅姊? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮涡匀,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘腕够。我一直安慰自己舌劳,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布甚淡。 她就那樣靜靜地躺著,像睡著了一般资柔。 火紅的嫁衣襯著肌膚如雪撵割。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天羹与,我揣著相機與錄音庶灿,去河邊找鬼纵搁。 笑死往踢,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的妄辩。 我是一名探鬼主播惑灵,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼英支,長吁一口氣:“原來是場噩夢啊……” “哼哮伟!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起楞黄,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎肿仑,沒想到半個月后碎税,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡雷蹂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年匪煌,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片萎庭。...
    茶點故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖支子,靈堂內(nèi)的尸體忽然破棺而出达舒,到底是詐尸還是另有隱情叹侄,我是刑警寧澤巩搏,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布贯底,位于F島的核電站,受9級特大地震影響禽捆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜胚想,卻給世界環(huán)境...
    茶點故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望统屈。 院中可真熱鬧牙躺,春花似錦、人聲如沸孽拷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至激蹲,卻和暖如春江掩,著一層夾襖步出監(jiān)牢的瞬間学辱,已是汗流浹背环形。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工抬吟, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留萨咕,地道東北人火本。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像茫陆,于是被迫代替她去往敵國和親擎析。 傳聞我的和親對象是個殘疾皇子簿盅,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,515評論 2 359

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

  • 建議大家看完阮一峰老師的Flex 布局教程:語法篇再看這篇文章桨醋;另:本文中的思維導(dǎo)圖使用新建標(biāo)簽頁的方式打開才能看...
    該帳號已被查封_才怪閱讀 5,975評論 2 51
  • 移動開發(fā)基本知識點 一.使用rem作為單位 html { font-size: 100px; } @media(m...
    橫沖直撞666閱讀 3,482評論 0 6
  • H5移動端知識點總結(jié) 閱讀目錄 移動開發(fā)基本知識點 calc基本用法 box-sizing的理解及使用 理解dis...
    Mx勇閱讀 4,523評論 0 26
  • 前言 FlexBox是css3的一種新的布局方式喜最,天生為解決布局問題而存在的它,比起傳統(tǒng)的布局方式禀苦,我們使用Fle...
    zevei閱讀 1,422評論 23 3
  • Invoke() 方法是 Unity3D的一種委托機制如: Invoke("SendMsg", 5); 它的意...
    zcwfeng閱讀 689評論 0 1