如何解決flex文本溢出問題小結
前言
一個小姑娘問了我關于flex文本溢出的問題,事后我覺得這個問題還挺有意思的,所以簡單的研究下和大家分享分享。
問題
用一個簡化的css和html為例
<style>
* {
margin: 0;
padding: 0;
}
.box {
display: flex;
height: 200px;
margin-top: 20px;
width: 400px;
margin: 20px auto 0 auto;
}
.left {
width: 100px;
height: 100%;
background: red;
}
.right {
flex: auto;
height: 100%;
background: blue;
color: #fff;
}
.text {
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
</style>
<div class="box">
<div class="left">123</div>
<div class="right">
<p class="text">
這是一段很長長長長長長長長長長長長長長長長長長文字,這是一段很長長長長長長長長長長長長長長長長長長文字
</p>
</div>
</div>
<div class="box" style="background: green">正常的box</div>
上面是一個flex容器,包括著兩個容器,其中右邊的容器中我們希望的應該是正常展示,且文本顯示省略號,但總是事與愿違。頁面展示如下,左邊紅色區(qū)域被壓縮,藍色的區(qū)域拉伸了,并將父容器撐開。

那么,我們該如何解決怎么這個問題呢?
解決方法
方法有三,如下
- 藍色容器設置
overflow: hidden - 藍色容器設置
width: 0 - 藍色容器設置
min-width: 0
第一種 overflow超出截斷比較好理解。我們看看剩下的兩種。
法二 width
第二種,首先看下flex屬性
<!-- 縮寫 --> flex: auto; flex-grow: 1; flex-shrink: 1; flex-basis: auto; <!--默認值為--> flex: 0 1 auto;
flex: auto是flex: 0 1 auto的縮寫
其中
- flex-grow:表示放大比例
- flex-shrink:表示縮小比例
- flex-basis:作用于子元素的主軸上的寬度屬性,并且優(yōu)先級比默認的寬/高要高。 這個屬性決定CSS如何給可伸縮項在容器中分配初始大小.
上面作妖的屬性就是flex-basis。flex-basis的值有 content | \<width\>
flex-basis: 會檢索項目的width 或 height 值作為 flex-basis 的值。如果 width 或 height 值為 auto,則 flex-basis 設置為 content,也就是基于 flex 的元素的內(nèi)容自動調(diào)整大小。
注意: flex-basis設置 0 和 0% 上有所區(qū)別, 如果flex-basis的值為百分數(shù),且它flex容器的尺寸沒有被顯式設置,此時flex-basis的值會被解析為content, 值會根據(jù)flex子項的內(nèi)容(指flex子項的子元素尺寸)來計算實際尺寸,多數(shù)情況下效果與 max-content 值一致,就是說flex子項的子元素有多長其主軸初始值就有多長。
這里藍色容器的flex-basis為默認值0項目總寬度小于容器寬度,計算如下:
項目總寬度100px + 0px = 100px
待分配寬度400px - 100px = 300px
放大比例0 + 1 = 1 , 這是項目的flex-grow之和
每個項目得到自身的grow/總的grow之和比例的剩余空間。
紅色容器得到0/1 * 300px = 0,最終寬度100px + 0px = 100px
藍色容器得到 1/1 * 300px = 300px,最終寬度300px
將藍色容器的寬度設為0,驗證下我們的結果,結果如下,解決成功。

法三 min-width
一般情況下 min-width 屬性默認值是 0 ,但是 Flexbox 容器中的 flex 項的 min-width 屬性默認值是 auto ,這樣能為 Flexbox 布局指明更合理的默認表現(xiàn)。將min-width設置成0,width未設置默認值為auto。這個時候會使用shrink-to-fit算法去計算寬度(文獻3中說明flexbox中也會使用到該算法), 算法如下:
width = min(max(preferred minimum width, available width), preferred width)
其中
- 最小寬度(preferred minimum width)也就是min-width
- 可用寬度(available width) ,這個寬度為包含塊減去margin、border、padding以及所有相關滾動條的寬度。
- 發(fā)生明確的換行外不發(fā)生換行的時 首選寬度(preferred width) 即content-box的寬度
那么計算如下: (816是當時瀏覽器獲取的寬度)
min(max(0, 400px - 100px), 816px) = 300px
所以,設置最小寬度也能解決我們的問題。
flex再算一題
html的內(nèi)容如下,我們需要計算左右兩個容器的寬度。
<style>
.box {
display: flex;
height: 200px;
margin-top: 20px;
width: 400px;
margin: 20px auto 0 auto;
}
.item-1 {
background: red;
width: 200px;
flex-shrink: 2;
}
.item-2 {
background: blue;
width: 300px;
flex-shrink: 3;
}
</style>
<div class="box">
<div class="item-1">設置200px,實際169.23</div>
<div class="item-2">設置300px,實際230.77</div>
</div>
開始計算,此時項目總寬度超過父容器時,這個時候需要使用flex-shrink計算
- 先要去計算項目的虛擬總寬度Total = 各項目flex-basic * flex-strink 之和,這里左右項目都設置了寬度,所以flex-basis=width
- 再計算單個項目的占比P = flex * flex-strink / Total
- 最后計算項目應該減去的大小 = 真實超出部分 * P
Total = 200 * 2 + 300 * 3 = 1300
P1 = 200 * (2 / VS)
P2 = 300 * (3 / VS)
最終得出:
item-1的寬度為:200 - (500 - 400) * P1 = 169.23px
item-2 的寬度為:300 - (500 - 400) * P2 = 230.77px

參考文獻
到此這篇關于如何解決flex文本溢出問題小結的文章就介紹到這了,更多相關flex文本溢出內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持腳本之家!
相關文章
這篇文章主要介紹了CSS flex-basis 文本溢出問題的解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起2019-12-04


