如何解決flex文本溢出問題小結(jié)

前言
一個小姑娘問了我關(guān)于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容器,包括著兩個容器,其中右邊的容器中我們希望的應(yīng)該是正常展示,且文本顯示省略號,但總是事與愿違。頁面展示如下,左邊紅色區(qū)域被壓縮,藍(lán)色的區(qū)域拉伸了,并將父容器撐開。
那么,我們該如何解決怎么這個問題呢?
解決方法
方法有三,如下
- 藍(lán)色容器設(shè)置
overflow: hidden
- 藍(lán)色容器設(shè)置
width: 0
- 藍(lán)色容器設(shè)置
min-width: 0
第一種 overflow超出截斷比較好理解。我們看看剩下的兩種。
法二 width
第二種,首先看下flex屬性
<!-- 縮寫 --> flex: auto; flex-grow: 1; flex-shrink: 1; flex-basis: auto; <!--默認(rèn)值為--> flex: 0 1 auto;
flex: auto是flex: 0 1 auto的縮寫
其中
- flex-grow:表示放大比例
- flex-shrink:表示縮小比例
- flex-basis:作用于子元素的主軸上的寬度屬性,并且優(yōu)先級比默認(rèn)的寬/高要高。 這個屬性決定CSS如何給可伸縮項在容器中分配初始大小.
上面作妖的屬性就是flex-basis。flex-basis的值有 content
| \<width\>
flex-basis: 會檢索項目的width 或 height 值作為 flex-basis 的值。如果 width 或 height 值為 auto
,則 flex-basis 設(shè)置為 content
,也就是基于 flex 的元素的內(nèi)容自動調(diào)整大小。
注意: flex-basis設(shè)置 0
和 0%
上有所區(qū)別, 如果flex-basis
的值為百分?jǐn)?shù),且它flex容器的尺寸沒有被顯式設(shè)置,此時flex-basis的值會被解析為content
, 值會根據(jù)flex子項的內(nèi)容(指flex子項的子元素尺寸)來計算實際尺寸,多數(shù)情況下效果與 max-content 值一致,就是說flex子項的子元素有多長其主軸初始值就有多長。
這里藍(lán)色容器的flex-basis為默認(rèn)值0項目總寬度小于容器寬度,計算如下:
項目總寬度100px + 0px = 100px
待分配寬度400px - 100px = 300px
放大比例0 + 1 = 1 , 這是項目的flex-grow之和
每個項目得到自身的grow/總的grow之和比例的剩余空間。
紅色容器得到0/1 * 300px = 0,最終寬度100px + 0px = 100px
藍(lán)色容器得到 1/1 * 300px = 300px,最終寬度300px
將藍(lán)色容器的寬度設(shè)為0,驗證下我們的結(jié)果,結(jié)果如下,解決成功。
法三 min-width
一般情況下 min-width 屬性默認(rèn)值是 0 ,但是 Flexbox 容器中的 flex 項的 min-width
屬性默認(rèn)值是 auto
,這樣能為 Flexbox 布局指明更合理的默認(rèn)表現(xiàn)。將min-width設(shè)置成0,width未設(shè)置默認(rèn)值為auto。這個時候會使用shrink-to-fit
算法去計算寬度(文獻(xiàn)3中說明flexbox中也會使用到該算法), 算法如下:
width = min(max(preferred minimum width, available width), preferred width)
其中
- 最小寬度(preferred minimum width)也就是min-width
- 可用寬度(available width) ,這個寬度為包含塊減去margin、border、padding以及所有相關(guān)滾動條的寬度。
- 發(fā)生明確的換行外不發(fā)生換行的時 首選寬度(preferred width) 即content-box的寬度
那么計算如下: (816是當(dāng)時瀏覽器獲取的寬度)
min(max(0, 400px - 100px), 816px) = 300px
所以,設(shè)置最小寬度也能解決我們的問題。
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">設(shè)置200px,實際169.23</div> <div class="item-2">設(shè)置300px,實際230.77</div> </div>
開始計算,此時項目總寬度超過父容器時,這個時候需要使用flex-shrink計算
- 先要去計算項目的虛擬總寬度Total = 各項目flex-basic * flex-strink 之和,這里左右項目都設(shè)置了寬度,所以flex-basis=width
- 再計算單個項目的占比P = flex * flex-strink / Total
- 最后計算項目應(yīng)該減去的大小 = 真實超出部分 * 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
參考文獻(xiàn)
到此這篇關(guān)于如何解決flex文本溢出問題小結(jié)的文章就介紹到這了,更多相關(guān)flex文本溢出內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持腳本之家!
相關(guān)文章
- 這篇文章主要介紹了CSS flex-basis 文本溢出問題的解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起2019-12-04