成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Flexbox布局的正確使用姿勢

開發 前端
在項目中,我們還會大量使用到flexbox的新舊屬性,但大多數人一般只會寫新屬性,舊屬性交由autoprefixer處理,但其實完成同樣功能的新舊屬性表現形式卻不盡相同。還有部分人只使用“萬能”的flex:number屬性為伸縮項目分配空間,但有些特殊情景卻無法滿足,此文為此梳理了flexbox的新舊屬性區別和分配空間的原理,為大家用flexbox布局的項目通通渠。

在項目中,我們還會大量使用到flexbox的新舊屬性,但大多數人一般只會寫新屬性,舊屬性交由autoprefixer處理,但其實完成同樣功能的新舊屬性表現形式卻不盡相同。還有部分人只使用“萬能”的flex:number屬性為伸縮項目分配空間,但有些特殊情景卻無法滿足,此文為此梳理了flexbox的新舊屬性區別和分配空間的原理,為大家用flexbox布局的項目通通渠。

Flexbox兼容性

PC端的兼容性 

 

 

 

移動端的兼容性 

 

 

 

如上圖,為了兼容IE10-11和Android4.3-,UC,我們仍需要使用Flexbox的舊屬性。

Flexbox新舊屬性

Flexbox的新屬性提供了很多舊版本沒有的功能,但是目前Android4.x和UC仍有一定市場占有率需要兼容,因此目前只使用新舊屬性都有的功能。

能實現相同功能的Flexbox新舊屬性如下表: 

 

 

 

但想象是美好的,現實是殘酷的,新舊屬性里有那么幾個頑固分子并不能乖乖的表現的一樣,總有那么一點不同。

下面我們來看看是哪些新舊屬性有不同:

flex-direction:row-reverse vs box-orient:horizontal;box-direction:reverse

相同點:改變主軸方向和伸縮項目的排列順序;在ltr下伸縮項目從右到左排列。

不同點:

flex-direction:row-reverse:第一個伸縮項目向主軸起點對齊 

 

 

 

box-orient:horizontal;box-direction:reverse:最后一個伸縮項目向主軸終點對齊 

 

 

 

flex-direction:column-reverse vs box-orient:vertical;box-direction:reverse

相同點:改變主軸方向和伸縮項目的排列順序;在ltr下伸縮項目從下到上排列。

不同點:

flex-direction:column-reverse:第一個伸縮項目向主軸起點對齊。 

 

 

 

box-orient:vertical;box-direction:reverse:最后一個伸縮項目向主軸終點對齊。 

 

 

 

oreder:integer vs box-ordinal-group:integer

相同點:定義伸縮項目顯示順序。

不同點:

oreder:integer:默認值為0;可以為負值。

box-ordinal-group:integer:默認值為1;取值大于1。

flex-grow:number vs box-flex:number

相同點:定義伸縮項目的擴展因素。

不同點:box-flex:number同時定義了伸縮項目的縮小因素。

flex-shrink:number vs box-flex:number

相同點:定義伸縮項目的縮小因素。

不同點:box-flex:number同時定義了伸縮項目的擴展因素。

Flexbox分配空間原理

影響Flexbox布局分配空間的屬性有三個,分別是flex-grow、flex-shrink和flex-basis。

  • flex-grow:當伸縮項目在主軸方向的總寬度
  • flex-shrink:當伸縮項目在主軸方向的總寬度 > 伸縮容器,伸縮項目根據縮小因素分配總寬度超出伸縮容器的空間。
  • flex-basis:伸縮基礎,在進行計算剩余空間或超出空間前,給伸縮項目重新設置一個寬度,然后再計算。

我們先來看看如何計算計算拉伸后的伸縮項目寬度,先簡單明了的給個公式,再通過栗子來驗證。

伸縮項目擴展寬度 = (項目容器寬度 – 項目寬度或項目設置的flex-basis總和) * 對應的flex-grow比例

拉伸后伸縮項目寬度 = 原伸縮項目寬度 + 擴展寬度

  1. .flexbox-wrap{ 
  2.  
  3.     width:550px; 
  4.  
  5.     display: flex; 
  6.  
  7.  
  8. .flexbox-item{ 
  9.  
  10.     &:nth-child(1){ 
  11.  
  12.         width:60px; 
  13.  
  14.     } 
  15.  
  16.     &:nth-child(2){ 
  17.  
  18.         width:70px; 
  19.  
  20.     } 
  21.  
  22.     &:nth-child(3){ 
  23.  
  24.         flex-basis:80px; 
  25.  
  26.     } 
  27.  
  28.     &:nth-child(4){ 
  29.  
  30.         flex-basis:90px; 
  31.  
  32.     } 
  33.  
  34.     &:nth-child(5){ 
  35.  
  36.          flex-basis:100px; 
  37.  
  38.     } 
  39.  
  40.  
  41. @for $i from 1 through 5 { 
  42.  
  43.     .flexbox-item:nth-child(#{$i}){ 
  44.  
  45.         flex-grow: $i; 
  46.  
  47.         background-color: rgba(35 * (6-$i), 20 * $i, 35 * $i,1); 
  48.  
  49.     } 
  50.  
  51.   

 

 

 

我們來計算一下上面栗子中第一個伸縮項目拉伸后的寬度。

對應著公式一步步計算:

  1. // 項目容器寬度 
  2.  
  3. container = 550 
  4.  
  5. // 項目寬度或項目設置的flex-basis總和 
  6.  
  7. itemSum = 60 + 70 + 80 + 90 + 100 = 400 
  8.  
  9. // 第一個伸縮項目對應的flex-grow比例 
  10.  
  11. flexRatio = 1 / ( 1 + 2 + 3 + 4 + 5 ) = 1/15 
  12.  
  13. // 第一個伸縮項目擴展寬度 
  14.  
  15. extendWidth = ( 550 - 400 ) * 1/15 = 10 
  16.  
  17. // 第一個伸縮項目拉伸后的寬度 
  18.  
  19. itemWidth = 60 + 10 = 70  

計算后得到第一個伸縮項目拉伸后的寬度是70px,我們通過chrome上的盒子模型來看看是否正確 

 

 

 

chrome計算的結果和我們計算的結果是一致的。

根據拉伸的計算公式是不是很容易就能推演出壓縮的計算公式呢?

伸縮項目縮小寬度 = (項目寬度或項目設置的flex-basis總和 – 項目容器寬度) * 對應的flex-shrink比例

壓縮后伸縮項目寬度 = 原伸縮項目寬度 – 縮小寬度

繼續用個栗子來驗證公式是否正確

  1. .flexbox-wrap{ 
  2.  
  3.     width:250px; 
  4.  
  5.     display: flex; 
  6.  
  7.  
  8. .flexbox-item{ 
  9.  
  10.     &:nth-child(1){ 
  11.  
  12.         width:60px; 
  13.  
  14.     } 
  15.  
  16.     &:nth-child(2){ 
  17.  
  18.         width:70px; 
  19.  
  20.     } 
  21.  
  22.     &:nth-child(3){ 
  23.  
  24.         flex-basis:80px; 
  25.  
  26.     } 
  27.  
  28.     &:nth-child(4){ 
  29.  
  30.         flex-basis:90px; 
  31.  
  32.     } 
  33.  
  34.     &:nth-child(5){ 
  35.  
  36.          flex-basis:100px; 
  37.  
  38.     } 
  39.  
  40.  
  41. @for $i from 1 through 5 { 
  42.  
  43.     .flexbox-item:nth-child(#{$i}){ 
  44.  
  45.         flex-shrink: $i; 
  46.  
  47.         background-color: rgba(35 * (6-$i), 20 * $i, 35 * $i,1); 
  48.  
  49.     } 
  50.  
  51.  

我們來計算一下上面栗子中第一個伸縮項目壓縮后的寬度。

對應著公式一步步計算:

  1. // 項目容器寬度 
  2.  
  3. container = 250 
  4.  
  5. // 項目寬度或項目設置的flex-basis總和 
  6.  
  7. itemSum = 60 + 70 + 80 + 90 + 100 = 400 
  8.  
  9. // 第一個伸縮項目對應的flex-shrink比例 
  10.  
  11. flexRatio = 1 / ( 1 + 2 + 3 + 4 + 5 ) = 1/15 
  12.  
  13. // 第一個伸縮項目縮小寬度 
  14.  
  15. extendWidth = ( 400 - 250 ) * 1/15 = 10 
  16.  
  17. // 第一個伸縮項目壓縮后的寬度 
  18.  
  19. itemWidth = 60 - 10 = 50  

計算后得到第一個伸縮項目壓縮后的寬度是50px,我們通過chrome上的盒子模型來看看是否正確 

 

 

 

chrome計算的結果和我們計算的結果不一樣。 

 

 

[[196343]] 

伸縮項目壓縮的計算方式和拉伸的不一樣,是因為壓縮會有極端情況,我們把第一個伸縮項目的flex-shrink修改為10,此時縮小寬度為( 400 - 250 ) * ( 10 / 24) = 62.5,縮小的寬度比原寬度要大,計算的壓縮后的寬度變成了負數。

為了避免這種極端情況,計算縮小比例是要考慮伸縮項目的原寬度。

正確的公式是這樣的

伸縮項目縮小寬度 = (項目寬度或項目設置的flex-basis總和 – 項目容器寬度) (對應的flex-shrink 項目寬度或項目設置的flex-basis比例)

壓縮后伸縮項目寬度 = 原伸縮項目寬度 – 縮小寬度

對應著公式一步步計算:

  1. // 項目容器寬度 
  2.  
  3. container = 250 
  4.  
  5. // 項目寬度或項目設置的flex-basis總和 
  6.  
  7. itemSum = 60 + 70 + 80 + 90 + 100 = 400 
  8.  
  9. // 第一個伸縮項目對應的flex-shrink比例 
  10.  
  11. flexRatio = (1*60) / (1*60+2*70+3*80+4*90+5*100) = 6/130 
  12.  
  13. // 第一個伸縮項目縮小寬度 
  14.  
  15. extendWidth = ( 400 - 250 ) * 6/130 ≈ 6.922 
  16.  
  17. // 第一個伸縮項目壓縮后的寬度 
  18.  
  19. itemWidth = 60 - 6.922 = 53.078  

計算后得到第一個伸縮項目壓縮后的寬度是53.078px,和chrome上的盒子模型是一樣的。

Flexbox屬性縮寫陷阱

上面介紹的flex-grow、flex-shrink和flex-basis有一個縮寫的寫法flex。

flex: flex-grow [flex-shrink] [flex-basis]

flex各種縮寫的值

  • flex: initial == flex: 0 1 auto
  • flex: none == flex: 0 0 auto
  • flex: auto == flex: 1 1 auto
  • flex: number == flex: number 1 0%

在實際項目中,會直接寫使用縮寫的flex來給伸縮項目分配空間,但是使用縮寫屬性會留下一些陷阱,導致表現的結果不盡如人意。

分別使用flex和flex-grow來把伸縮項目拉伸填滿容器,看看表現的差異。

首先看看使用flex-grow拉伸伸縮項目的效果

  1. .flexbox-wrap{ 
  2.  
  3.     width:550px; 
  4.  
  5.     display: flex; 
  6.  
  7.  
  8. .flexbox-item{ 
  9.  
  10.     flex-grow:1; 
  11.  
  12.     &:nth-child(1){ 
  13.  
  14.         width:60px; 
  15.  
  16.     } 
  17.  
  18.     &:nth-child(2){ 
  19.  
  20.         width:70px; 
  21.  
  22.     } 
  23.  
  24.     &:nth-child(3){ 
  25.  
  26.         width:80px; 
  27.  
  28.     } 
  29.  
  30.     &:nth-child(4){ 
  31.  
  32.         width:90px; 
  33.  
  34.     } 
  35.  
  36.     &:nth-child(5){ 
  37.  
  38.          width:100px; 
  39.  
  40.     } 
  41.  
  42.  
  43. @for $i from 1 through 5 { 
  44.  
  45.     .flexbox-item:nth-child(#{$i}){ 
  46.  
  47.         background-color: rgba(35 * (6-$i), 20 * $i, 35 * $i,1); 
  48.  
  49.     } 
  50.  
  51.  

每個伸縮項目在原寬度上拉伸相同的寬度 

 

 

 

通過上面的計算拉伸后的伸縮項目寬度,可以計算第一個伸縮項目拉伸后的寬度

  1. // 項目容器寬度 
  2.  
  3. container = 550 
  4.  
  5. // 項目寬度或項目設置的flex-basis總和 
  6.  
  7. itemSum = 60 + 70 + 80 + 90 + 100 = 400 
  8.  
  9. // 第一個伸縮項目對應的flex-grow比例 
  10.  
  11. flexRatio = 1 / ( 1 + 1 + 1 + 1 + 1 ) = 1/5 
  12.  
  13. // 第一個伸縮項目擴展寬度 
  14.  
  15. extendWidth = ( 550 - 400 ) * 1/5 = 30 
  16.  
  17. // 第一個伸縮項目拉伸后的寬度 
  18.  
  19. itemWidth = 60 + 30 = 90   

 

 

 

然后我們把flex-grow:1替換成flex:1,下面是表現的效果,伸縮項目拉伸后的寬度變成一樣了。

 

從chrome的盒子模型可看到伸縮項目拉伸后寬度變成了110px,伸縮容器等分了容器的寬度。 

 

 

 

flex:1展開后是flex:1 1 0%,flex-grow:1相當于flex:1 1 auto,兩者的區別在于flex-basis的值不同。flex:1為項目寬度重新設置了寬度為0,所以可分配空間為整個容器,從公式計算上可以更直觀理解:

  1. // 項目容器寬度 
  2.  
  3. container = 550 
  4.  
  5. // 項目寬度或項目設置的flex-basis總和 
  6.  
  7. itemSum = 0 + 0 + 0 + 0 + 0 = 0 
  8.  
  9. // 第一個伸縮項目對應的flex-grow比例 
  10.  
  11. flexRatio = 1 / ( 1 + 1 + 1 + 1 + 1 ) = 1/5 
  12.  
  13. // 第一個伸縮項目擴展寬度 
  14.  
  15. extendWidth = ( 550 - 0 ) * 1/5 = 110 
  16.  
  17. // 第一個伸縮項目拉伸后的寬度 
  18.  
  19. itemWidth = 0 + 110 = 110  

需要注意的Flexbox特性

無效屬性

  • column-*在伸縮容器無效
  • float和clear在伸縮項目無效
  • vertical-align在伸縮項目無效
  • ::first-line and ::first-letter在伸縮容器無效

伸縮容器中的非空字符文本節點也是伸縮項目

1 2 我是個假文本 3 4 5 

 

margin折疊

  • 伸縮容器和伸縮項目的margin不會折疊
  • 伸縮項目間的margin不會折疊

舊版Flexbox的BUG

伸縮項目為行內元素要加display:block;或display:flex 

責任編輯:龐桂玉 來源: 前端大全
相關推薦

2017-02-23 15:37:44

OptionObject容器

2021-09-15 16:20:02

Spring BootFilterJava

2016-01-05 11:28:20

按需付費云計算docker

2022-11-16 09:27:58

flexbox左右布局均分布局

2022-02-21 11:21:40

golang編程語言

2018-01-11 15:31:39

命令Linux關機

2017-05-24 10:12:54

前端FlexboxCSS3

2017-10-10 15:52:17

前端FlexboxCSS Grid

2016-05-09 10:41:03

算法分析開發

2017-03-16 11:39:33

Openstack源碼姿勢

2023-01-30 07:41:43

2020-08-31 06:54:37

注解脫敏ELK

2021-07-12 11:35:13

Go協程Goroutine

2021-01-08 08:10:34

MySQL表空間回收

2017-10-12 11:30:34

Spark代碼PR

2021-10-08 08:38:00

Pipelineshell命令Jenkins

2016-12-12 08:48:24

2019-12-27 15:58:57

大數據IT互聯網

2024-09-25 08:22:06

2019-10-30 17:06:50

AWS物聯網IoT
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久草免费在线视频 | 黑人精品xxx一区一二区 | 成人精品在线观看 | 免费在线观看av网址 | 亚洲精品一区二区三区在线观看 | 羞羞的视频免费观看 | 色视频成人在线观看免 | 国产成人免费视频 | 久久性 | 国产精品美女www爽爽爽视频 | 精品久久久久久久久亚洲 | 91在线观看免费 | 久久国产精品免费一区二区三区 | 中文字幕精品一区久久久久 | 国产精品揄拍一区二区久久国内亚洲精 | 欧美一区二区三区在线观看视频 | 国产在线视频一区二区董小宛性色 | 福利精品在线观看 | 欧美在线日韩 | 久久久成人免费视频 | 国产精品久久久久无码av | 影音先锋男 | 东方伊人免费在线观看 | 国产91亚洲精品 | 9191av| 97国产精品视频人人做人人爱 | 免费一级大片 | 国产精品综合色区在线观看 | 久久人体 | 久国久产久精永久网页 | 成人高清视频在线观看 | 在线激情视频 | 在线观看av网站永久 | 7777在线| 精品国产欧美一区二区 | 91中文在线观看 | 97国产成人| 天堂在线1| 在线观看国产精品视频 | 亚洲国产精品一区 | 久久国产精品网 |