彈性(Flex)佈局的使用

最近我參與實施的兩個項目中,一個頁面交互複雜,而另一個相對傳統,兩個項目相比之下凸顯出了頁面佈局樣式的時間佔比不可忽視,使用了彈性佈局代碼量精簡了不少。

雖說如此,彈性佈局往往會有些潛在的問題,且改動後,要立即查看頁面也需要不少時間,因此我把項目中使用彈性佈局過程中遇到的問題稍作整理,爲大家以後使用時,可以有效規避這些麻煩。

 

使用場景

前端開發中,網頁佈局是很重要的一部分。之前傳統佈局方案中,基本依賴display + position + float實現,雖然能實現垂直居中,等比排布等,但有時會不夠準確並且使css語句過多。

彈性佈局最大的優點就是彈性,雖然使用百分比或者媒體查詢也可以實現響應佈局,但我認爲以下幾種情況下,flex佈局是比較好的選擇:

  • 視口中的特定塊按照比例進行縮放
  • 一些以基準線對齊的佈局
  • 模塊垂直居中,水平居中
  • 左中右彈性佈局

 

常用屬性

1、Flex佈局概念

flex全稱是flexbox(flexible Box),即彈性盒子。這一模塊提供更加有效的的方式制定、調整和分佈一個容器裏的項目佈局,即使他們的大小是未知或者是動態的即彈性的。

包圍在外面的即容器,內部的即爲項目,也就是說採用Flex佈局的元素就是flex容器(display:flex或inline-flex),它的所有子元素稱爲flex項目。容器默認存在兩根軸線,一根主軸(main axis),一根交叉軸(cross axis),項目默認沿主軸排列。

 

2、常用屬性

flex-box(容器)和flex-item(項目)各自都有不同的屬性,通過對它們進行不同的設置來對整體佈局進行調整以達到想要的效果。主要屬性包括:

 

flex-direction:

默認情況下,元素排布從左至右,從上至下。但有時在實際應用中,並不按照默認情況進行排布。默認的是row(從左至右),可以設置成column(從上至下)。如果需要設置成反向,則在後面加上“-reverse”。

 

justify-content:

規定元素在主軸上的對齊方式。默認的是flex-start(左對齊),可以設置成flex-end(右對齊)和center(居中),也可以設置成space-between(兩端對齊,且讓剩餘空間均勻的分佈在每兩個元素之間)或是flex-around(剩餘空間均勻包裹每一個元素,每兩個元素之間的間距是邊框距盒內元素距離的二倍)。

 

align-items:

規定元素在交叉軸上的對齊方式。默認是stretch,即元素在豎直方向上充滿整個空間,可以設置成flex-start(起點對齊)、flex-end(終點對齊)和center(居中),除此之外,可以使用baseline對齊,即元素內部第一行文字的基線對齊。

 

align-content:

當flex盒內元素具有多條軸的時候可以使用。默認的是stretch,即軸線佔滿整個交叉軸。可以設置爲flex-start(與交叉軸的起點對齊),flex-end(與交叉軸的終點對齊),center(豎直居中),和space-between以及space-around。

 

flex:

可以將flex-grow, flex-shrink, flex-basis進行連寫。flex-grow屬性定義項目的放大比例,默認爲0,即如果存在剩餘空間,也不放大。flex-shrink屬性定義了項目的縮小比例,默認爲1,即如果空間不足,該項目將縮小。flex-basis屬性定義了在分配多餘空間之前,項目佔據的主軸空間。

瀏覽器根據這個屬性,計算主軸是否有多餘空間。它的默認值爲auto,即項目的本來大小。flex屬性是flex-grow, flex-shrink 和 flex-basis的簡寫,默認值爲flex: 0 1 auto。簡寫還包括:

  • flex: 1; -->> flex: 1 1 0%; flex: none; -->> flex: 0 0 auto
  • flex: auto; -->> flex: 1 1 auto; flex: 0 auto
  • flex: initial -->> flex: 0 1 auto; 即flex的初始值

 

開發中遇到的問題

1、子元素被壓縮

問題:當設置子容器的長度flex爲1時,其他的子容器的長度會被壓縮。

解決方法:設置其他子容器的flex-shrink屬性爲0,這樣就不會被壓縮。

 

2、圖片使用flex會有間隙

問題:因爲有基線的存在,圖片會有一些間隙。

解決方法:設置圖片的display爲block就可以解決。

 

3、超出隱藏,overflow失效

問題:

text-overflow: ellipsis;不生效,省略號沒有出現,而且過長的文字把子容器撐開,沒有按預設的超出隱藏。

解決方法:

設子容器width:0;可能出在於子容器沒有設置寬度,省略符可能需要對父元素設置寬度,設置爲100%無效,當設置爲0的時候,子容器恢復到設定的寬度,省略號也出現了。

 

4、flex導致設置的子元素寬高失效

問題:

父級設置display:flex後,子級設置的heigth:50px失效,只是被子元素撐開了高度。

解決方法:

flex-grow:0;flex-shrink:0;flex-grow屬性爲是否自動增長空間,flex-shrink屬性爲是否自動縮小空間,默認值爲1,即自動增長/縮小。設置爲0時,不會自動增長/縮小,防止固定大小的元素寬度發生變化。

 

5、flex佈局滾動,子元素無法全部顯示

問題:

父級使用flex佈局,列表頁設置flex:1;佔滿空閒空間,但是所有的列沒有完全顯示出來,滾動條也沒有出現。

解決方法:

列表外部使用div或其他盒子包裹,使用flex佈局,每個子元素設置最小寬度或實際寬度,或者設width: 0。

使用注意

  1. 彈性佈局下每一個item默認是沒有間隔的。
  2. 彈性佈局默認不改變項目的寬度,但是它默認改變項目的高度,align-self屬性可以改變這種行爲,默認值是stretch。
  3. flex只是比例,但不會換行,可以設置子容器的寬度的百分比,來達到換行的效果,或者使用flex-wrap進行換行。
  4. flex基本可以完全取代float,所以如果使用Flex佈局,就儘量用flex的屬性取代浮動效果。
  5. flex的佈局會使子容器的float、clear和vertical-align屬性失效。

 

作者:霍俊麗

 

優質文章

運維轉型 | 運維人不再只是“救火英雄”

企業上雲如何優化性能?

醫療行業研發效率與運維管理技術沙龍圓滿落幕

jmeter集羣下腳本日誌和報告處理

企業應用運維自動化應該如何設計?

發佈了93 篇原創文章 · 獲贊 26 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章