加入收藏 | 设为首页 | 会员中心 | 我要投稿 聊城站长网 (https://www.0635zz.com/)- 智能语音交互、行业智能、AI应用、云计算、5G!
当前位置: 首页 > 综合聚焦 > 编程要点 > 语言 > 正文

CSS中flex-basis导致文本溢出怎么化解

发布时间:2023-09-27 14:45:29 所属栏目:语言 来源:
导读:不值一提的 flex-basis ,却给文本溢出添加省略号这个小小的功能带来很多了麻烦。下面来演示一下。

1. flex 家族

flex 里有很多的属性,我们经常用到的就是如下操作:

.container {

display: flex
不值一提的 flex-basis ,却给文本溢出添加省略号这个小小的功能带来很多了麻烦。下面来演示一下。
 
1. flex 家族
 
flex 里有很多的属性,我们经常用到的就是如下操作:
 
.container {
 
  display: flex;
 
}
 
.container > .left {
 
  flex: 1;
 
}
 
.container > .right {
 
  flex: 1;
 
}
 
这样可以很方便的实现一个左右等分的布局。
 
我们来看一个引起问题的例子:
 
<!DOCTYPE html>
 
<html lang="en">
 
  <head>
 
    <meta charset="UTF-8" />
 
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
 
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
 
    <title>Document</title>
 
    <style>
 
      div {
 
        padding: 5px;
 
        border: 1px solid #ccc;
 
      }
 
      .no-effect {
 
        align-items: center;
 
        margin: 100px;
 
        width: 200px;
 
        color: #999;
 
      }
 
      .no-effect > div:first-of-type {
 
        margin-right: 10px;
 
      }
 
      p {
 
        color: red;
 
      }
 
      .no-wrap {
 
        overflow: hidden;
 
        white-space: nowrap;
 
        text-overflow: ellipsis;
 
      }
 
    </style>
 
  </head>
 
  <body>
 
    <div style="display: flex;" class="no-effect">
 
      <div style="flex: 0 0 80px">我比较短</div>
 
      <div style="flex: auto">
 
        <p class="no-wrap">我很长,不是开玩笑的,可以长到没边</p>
 
      </div>
 
    </div>
 
  </body>
 
</html>

为什么会出现这个情况?
 
2. flex-basis 从中作梗
 
flex: auto 实际上是三个属性的集合:
 
flex-grow: 1;
 
flex-shrink: 1;
 
flex-basis: auto;
 
flex-grow 表示放大比例, flex-shrink 表示收缩比例, flex-basis 表示分配多余空间前,项目占据的主轴空间。
 
我们左边 div 不放大,不缩小,固定 80px 宽度;右边 div 自动铺满剩余宽度也就是 200px - 80px = 120px,实际效果却远远超出了 120px,这是因为 flex-basis 为 auto 时的计算导致的。
 
我们来看看 flex-basis: auto 的历史:
 
最初的时候 flex-basis 是由 width/height 决定的;
 
后来有个bug 1032922 ,flex-basis 的计算就变成了沿主轴的宽度决定了;
 
后来又出现了一个 bug 1093316 ,又变回了由 width/height 决定且出现了一个新的概念 content 来自动计算宽/高;
 
所以当我们没有给 flex-basis 元素设置 width 时, flex-basis: auto 由内部的 content 决定宽度,且受 max/min-width 限制。
 
如此一来,在内部 content 自由的情况下,那么 flex-basis 元素的宽度就看 max/min-width 了。
 
max-width 的默认值是 none ,而 min-width 的默认值一般是 0 ,而此处却是 auto ,这也是出现“异常”的原因了。

 3. 解决方式
 
知道原因后,那我们就可以对症下药了。
 
首先自然是设置 width 属性即可了,只要 width 小于剩余空间即可,一般设置为 width: 0; 这样可百分之百确定小于剩余空间;
 
不设置 width 但用 min-width 来限制也是一样的,既然 flex 项 的 min-width:auto ,那我们也设置一个小于剩余空间的值,一般也是 min-width: 0;
 
设置 overflow:hidden 来限制溢出效果也是一致的。
 
介绍了三种解决方式,再来聊聊前两种为什么可以解决的原因吧。
 
第一种很简单,width 设置为 0,但是 flex-basis 会让元素填满剩余空间,所以就会铺满,由于 P 元素有不换行显示省略号,会正常显示。
 
那么第二种呢?
 
第二种的情况比较复杂,当我们设置了 min-width 不为 auto 的值后,这里会用到 shrink-to-fit 算法,这个算法的计算机制如下:
 
min(max(preferred minimum width, available width), preferred width)
 
翻译成人话就是:
 
preferred minimum width:最小宽度
 
available width:可用宽度,也就是content box的宽度
 
preferred width:首选宽度,除了明确换行外的不换行时的宽度
 
shrink-to-fit 的宽度 = min ( max (最小宽度, 可用宽度) , 首选宽度)
 
那么来计算一下:
 
最小宽度:0
 
可用宽度:272px
 
首选宽度:200 - 一些七七八八的值剩余部分(98px)
 
由计算可得:
 
max(0, 272) = 272
 
min(272, 98) = 98
 
所以最终宽度是剩余部分 98px,当我们手动设置 min-width: 110px 时就可以看到超过溢出去了。
 
 
 

(编辑:聊城站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章