在使用彈性佈局實現兩側寬度固定,中間寬度自適應的效果時,發現本身理解的和實際效果不一致,因此親自實踐驗證了一個flex屬性的諸多場景的表現,不只解開了我以前使用過程遇到的疑惑,並且發現了許多本身之前理解有誤差的地方。第一章節有點繞,第二,三章節結論比較清晰。若是啃不動第一章節,建議直接跳到第二章節閱讀,相信你看完以後,也會有收穫的。佈局
連續的英文+數字內容會溢出flex
連續的中文斷行正確,內容不會溢出。spa
連續的數字+英文,加上斷詞樣式設置後,內容再也不溢出。code
flex子元素的flex-basis > content-size時, flex子元素的寬度爲flex-basisblog
flex子元素的flex-basis < content-size, flex子元素的寬度爲content-size繼承
content-size > flex-basis > width, flex子元素寬度爲flex-basisit
content-size > width > flex-basis ,flex子元素寬度爲widthclass
content-size > width > flex-basis, flex子元素寬度爲width容器
width < flex-basis < content-size, flex子元素寬度爲width基礎
flex-basis > content-size時,flex子元素的寬度是content-size
flex-basis < content-size時,flex子元素的寬度是content-size
max-width > content-size 時, max(flex-basis,width)生效
max-width > content-size 時,沒有width屬性時,max(flex-basis, content-size)生效
max-width < content-size 時 ,max-wdith生效
子元素max-width > flex父元素寬度,flex子元素的寬度是max(子元素的width,flex父元素的寬度)
flex-basis > 或 < width時,都不起做用。
沒有width屬性時,起做用的是content-size。flex-basis仍舊不起做用
子元素max-width < flex父元素寬度,flex子元素的寬度是子元素的max-width
min-width的優先級高於flex-basis,width,content-size
flex-basis的優先級高於width,content-size
width的優先級高於content-size
不設置flex-basis,width屬性時,content-size才起做用
min-width與max-width衝突時,min-width生效
flex-basis,width,content-size同時存在時,flex-basis生效
width,content-size同時存在時,width生效
只有content-size存在時,content-size才生效
父容器寬度 > 子元素min-width,子元素寬度是父容器寬度,width,flex-basis,content-size都不生效
父容器寬度 < 子元素min-width,子元素寬度是min-width
<style>
.item {
display: flex; width: 500px; height: 100px; } .item1 { width: 50px; flex: none; background-color: red; } .item2 { flex: 1 1 50px; background-color: green; } .item3 { flex: 2 2 100px; background-color: blue; } </style> <div class="item"> <div class="item1">xxxxxxxxxxxxxx</div> <div class="item2">xxxxxxxxxxxxxx</div> <div class="item3">xxxxxxxxxxxxxx</div> </div>
剩餘寬度 : 500 - 50 - 50 - 100 = 300
item1寬度: 50 + 300*( 0 / (0+1+2)) = 50;
item2寬度: 50 + 300 * ( 1 /(0+1+2)) = 50+100=150;
item3寬度: 100 + 300 *( 2 /(0+1+2))= 100+200=300
注意:flex子項的內容默認是不換行的,內容超過flex子項寬度,會溢出
<style>
.item {
display: flex; width: 500px; height: 100px; } .item1 { width: 50px; flex: none; background-color: red; } .item2 { width: 50px; flex: 1; background-color: green; } .item3 { width: 100px; flex: 1; background-color: blue; } </style> <div class="item"> <div class="item1">xxxxxxxxxxxxxx</div> <div class="item2">xxxxxxxxxxxxxx</div> <div class="item3">xxxxxxxxxxxxxx</div> </div>
剩餘寬度 : 500 - 50 - 0 - 0 = 450
item1寬度: 50 + 450*( 0 / (0+1+1)) = 50
item2寬度: 0 + 450 * ( 1 /(0+1+1)) = 225
item3寬度: 0 + 450 *( 2 /(0+1+1))= 225
注意:flex-basis的優先級高於width屬性。item2和item3的flex-basis:0%覆蓋了它們的width屬性。
<style> .item { display: flex; height: 100px; width:300px; } .item1 { width: 300px; background-color: green; } .item2 { flex:1 1 100px; background-color: red; } .item3{ flex:2 2 200px; background-color: blue; } </style> <div class="item"> <div class="item1"></div> <div class="item2"></div> <div class="item3"></div> </div>
超出寬度=300+100+200-300=300
總權重=300*1+100*1+200*2=800
item1的寬度=300 - 300 * 300*1/800 =300 - 112.5=187.5;(只有width屬性時,flex的屬性值是0 1 auto,空間不足時也會收縮)
item2的寬度=100 - 300 * 100*1/800 =100 - 37.5=62.5;
item3的寬度=200 - 300 * 200*2 /800 =200-150=50;
<style> .item { display: flex; height: 100px; width: 300px; } .item1 { width: 300px; background-color: green; } .item2 { flex: 2; width: 100px; background-color: red; } .item3 { flex: 2 2 200px; background-color: blue; } </style> <div class="item"> <div class="item1"></div> <div class="item2"></div> <div class="item3"></div> </div>
超出寬度: 300+200 -300=200
總權重:300*1 + 0*1 + 200*2=700
item1的寬度是 300 - 200* 300*1/700=214.29
item2的寬度是 0 - 200* 0*1/700=0
item3的寬度是 200 - 200* 200*2/700=85.71
<style>
.item {
display: flex; height: 100px; width:300px; } .item1 { width: 400px; flex:none; background-color: green; } .item2 { flex:1 1 100px; background-color: red; } .item3{ flex:2 2 200px; background-color: blue; } </style> <div class="item"> <div class="item1"></div> <div class="item2"></div> <div class="item3"></div> </div>
flex父容器的寬度是300
非收縮項item1的寬度是400
收縮項item2,item3的寬度都是0
<style> .item { display: flex; width: 300px; height: 100px; } .item1 { width: 150px; background-color: red; } .item2 { width: 200px; flex: 1; background-color: green; } .item3 { width: 100px; flex: 2; background-color: blue; } </style> <div class="item"> <div class="item1">01234567890123456789</div> <div class="item2">01234567890123456789</div> <div class="item3">01234567890123456789</div> </div>
item的寬度爲300px
item1的寬度爲min(150,187.66)=150
item2的寬度爲min(200,187.66)=187.66
item3的寬度爲min(100,187.66)=100
150+187.66+100=437.66 > 300 flex子項撐破了父容器
<style>
.item {
display: flex; height: 100px; background-color: blue; } .item1 { width: 100px; background-color: green; } .item2 { height: 50px; width: 100px; background-color: red; } </style> <div class="item"> <div class="item1">item1</div> <div class="item2">item2</div> </div>