flex項目深入分析

FFC (flex formatting context)

  • Flexbox 布局新定義了格式化上下文,類似 BFC(block formatting context)
  • 注意 : 我所指的Flexbox 是指設置了 display: flex; 或 display: inline-flex;的盒子。不是指單單設置了 display: flex; 的盒子。
  • 例如,設置了 display: flex; 或 display: inline-flex的元素,和BFC一樣,不會被浮動的元素遮蓋,不會垂直外邊距坍塌等等。

與BFC的細微區別

但需要注意的是以下幾點細節,Flexbox 布局 和 Block 布局是有細微區別的

Flex box(父元素)

  1. Flexbox 不支持 ::first-line 和 ::first-letter 這兩種偽元素
  2. vertical-align 對 Flexbox 中的子元素 是沒有效果的
  3. float 和 clear 屬性對 Flexbox 中的子元素是沒有效果的,也不會使子元素脫離文檔流(但是對Flexbox 是有效果的!)

flex item(flex 子元素)

  1. 多欄布局(column-*) 在 Flexbox 中也是失效的,就是說我們不能使用多欄布局在Flexbox 排列其下的子元素(魚和熊掌不可得兼嘛)
  2. Flexbox 下的子元素不會繼承父級容器的寬

flex項目盒子介紹

  1. CSS解析器會把 定義了 display: flex; 和 display: inline-flex; 的 Flexbox 下的子元素外部裝進一個看不見的盒子里,我們通過排列這些盒子來達到排序、布局、 伸縮的目的。
  • 規范中把這種盒子 稱為 flex item,而子元素中包括了 標簽節點 以及 文本節點。標簽節點很容易理解,需要注意的是文本節點。
  • 默認情況下,flex 會將 連續的文本節點 裝進 flex-item 之中,使文本可以和標簽節點一起排序和定位。
  • 值得注意的是,空格也是文本節點,所以 white-space 會影響Flexbox 中的布局,比如設置了white-space: pre 的Flexbox

flex-item-size 如何計算的

item-size(尺寸)為主軸方向上item的 content 再加上自身的margin 、 border 和 padding 就是這個 item 的尺寸。

位置

  1. flexbox 下設置了absolute的子元素的位置受3個方面的影響:
  • justify-content | align-items > top、left、right、bottom=margin(優先級排序)
  • 對于 Flexbox 來說,設置了position: absolute;并不會對其下的子元素產生任何影響。
image.png
  • 1、2、3、5受topleftbottomright影響,4受justify-content、align-items和margin影響,6、7、8、9只受justify-content、align-items

寬或高

三種情況

  1. flex-basis > width[height]: 非auto(沒有元素默認值和內容); (優先級)
  2. width:auto、width:非auto和flex-basic(優先級比較)
    • width:auto < flex-basis值
    • width:auto < flex-basis(優先級)
    • width:auto > flex-basis值
    • width:auto > flex-basis(優先級)
    • width:非auto < flex-basis(優先級)
  3. min-width[height]、max-width[height]、flex-basis和flex container(父元素容器尺寸)(優先級比較)
    min-width[min-height]
    • flex-basis > min-width[min-height] 值
    • flex-basis > min-width[min-height](優先級)
    • flex-basis < min-width[min-height] 值
    • flex-basis < min-width[min-height](優先級)
flex container
  • min-width[min-height] > flex container 值
  • min-width[min-height] > flex container(優先級)
max-width[height]
  • Flex-basis < max-width[height] 值
  • Flex-basis < max-width[height](優先級)--通過flex-grow伸展開。
總結:
  1. width:auto、width:非auto、flex、min-width[min-height]、max-width[height]和flex-basis兩兩比較時取最大值
  2. width:非auto 和 flex-basis(優先級)同時設置時,width:非auto < flex-basis(優先級)

伸展和坍塌

這要分兩種情況,換行或者不換行。

1. 如果 flex-wrap: nowrap; 即不換行。
1. Flex-item總和 < flex-box時
  • flex-grow計算流程是:
  • 可用空間 = flexbox-content - 每個item-size的總和
  • 單位分配空間 = 可用空間 / grow
  • 每個item延伸的尺寸 = 單位分配空間 * 對應的item grow
  注意:flex-shrink 的計算流程和flex-grow的計算流程不同。
2. Flex-item總和 > flex-box時
  • flex-shrink計算流程是:
  • 加權和(flex-shrink) = flex-shrink * item-size
  • 每個item的shrink比例 = 每個item的flex-shrink * item-size / 加權和
  • 超出空間 = Flex-item(所有子項目之和) - flex-box(flex盒子尺寸)
  • 每個item坍塌后的尺寸 = flex-basis - 超出空間 * 每個item的shrink比例
1. flex-wrap: wrap[wrap-reverse]; 即換行
items 都會先在主軸方向上的多條線上排列,每條線之間互不干擾
1. grow、max-width[height] 情況下 flex-grow 的計算流程
  • 第一次分配
  • 剩余空間 = flex-box - 統計帶max-width[height]屬性的item-size之和
  • 有剩余空間則再分配
  • 每個item最終尺寸 = item的flex-basis + 剩余空間*每個item的flex-grow / 所以的item的flex-grow之和
2. min-width[height] 情況下 flex-shrink 的計算流程
  • 第一次坍塌
  • 按正常的flex-shrink 的計算流程,計算出每個item坍塌后的尺寸
  • item沒有坍塌的尺寸 = 帶min-width[height]屬性的item-size - item坍塌后的尺寸
  • item最終尺寸 = 每個沒有帶min-width[height]屬性的item坍塌后的尺寸 - 每個item的flex-shrink(item沒有坍塌的尺寸 / item的flex-shrink之和)

隱藏屬性對 items-size 的影響

display: none、visibility: hidden、visibility: collapse和transform: scale;
  • visibility: hidden; | visibility: collapse; | transform: scale;的flex-item content 依然被算進主軸尺寸
  • display: none; CSS解析器不會對該item的空間進行計算
參考

深入理解 flex 布局以及計算

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,983評論 6 537
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,772評論 3 422
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,947評論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,201評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,960評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,350評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,406評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,549評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,104評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,914評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,089評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,647評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,340評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,753評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,007評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,834評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,106評論 2 375

推薦閱讀更多精彩內容

  • 移動開發基本知識點 一.使用rem作為單位 html { font-size: 100px; } @media(m...
    橫沖直撞666閱讀 3,501評論 0 6
  • H5移動端知識點總結 閱讀目錄 移動開發基本知識點 calc基本用法 box-sizing的理解及使用 理解dis...
    Mx勇閱讀 4,593評論 0 26
  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標簽默認的外補...
    _Yfling閱讀 13,777評論 1 92
  • 閱讀目錄移動開發基本知識點 calc基本用法box-sizing的理解及使用理解display:box的布局理解f...
    張憲宇閱讀 1,551評論 0 1
  • 人生路漫漫,每個人總會遇到很多不如意的事情,例如生老病死,例如生離死別,例如求而不得,例如得而復失。總之,人...
    墨如玉閱讀 8,238評論 3 2