如何解决flex文本溢出问题小结


Posted in HTML / CSS onJuly 15, 2022

前言

一个小姑娘问了我关于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容器,包括着两个容器,其中右边的容器中我们希望的应该是正常展示,且文本显示省略号,但总是事与愿违。页面展示如下,左边红色区域被压缩,蓝色的区域拉伸了,并将父容器撑开。

如何解决flex文本溢出问题小结

那么,我们该如何解决怎么这个问题呢?

解决方法

方法有三,如下

  • 蓝色容器设置 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:作用于子元素的主轴上的宽度属性,并且优先级比默认的宽/高要高。 这个属性决定CSS如何给可伸缩项在容器中分配初始大小.

上面作妖的属性就是flex-basis。flex-basis的值有 content | \<width\>

flex-basis: 会检索项目的width 或 height 值作为 flex-basis 的值。如果 width 或 height 值为 auto,则 flex-basis 设置为 content,也就是基于 flex 的元素的内容自动调整大小。

注意: flex-basis设置 00% 上有所区别, 如果flex-basis的值为百分数,且它flex容器的尺寸没有被显式设置,此时flex-basis的值会被解析为content, 值会根据flex子项的内容(指flex子项的子元素尺寸)来计算实际尺寸,多数情况下效果与 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,验证下我们的结果,结果如下,解决成功。

如何解决flex文本溢出问题小结

法三 min-width

一般情况下 min-width 属性默认值是 0 ,但是 Flexbox 容器中的 flex 项的 min-width 属性默认值是 auto ,这样能为 Flexbox 布局指明更合理的默认表现。将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以及所有相关滚动条的宽度。
  • 发生明确的换行外不发生换行的时 首选宽度(preferred width) 即content-box的宽度

那么计算如下: (816是当时浏览器获取的宽度)

min(max(0, 400px - 100px), 816px) = 300px

所以,设置最小宽度也能解决我们的问题。

flex再算一题

html的内容如下,我们需要计算左右两个容器的宽度。

<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文本溢出问题小结的文章就介绍到这了,更多相关flex文本溢出内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章,希望大家以后多多支持三水点靠木!

 
HTML / CSS 相关文章推荐
CSS3轻松实现清新 Loading 效果的简单实例
Jun 06 HTML / CSS
CSS3 函数技巧 用css 实现js实现的事情(clac Counters Tooltip)
Aug 15 HTML / CSS
CSS3自定义滚动条样式的示例代码
Aug 21 HTML / CSS
利用css3径向渐变做一张优惠券的示例
Mar 22 HTML / CSS
HTML5 placeholder属性详解
Jun 22 HTML / CSS
如何使用html5与css3完成google涂鸦动画
Dec 16 HTML / CSS
突破canvas语法限制 让他支持链式语法
Dec 24 HTML / CSS
深入理解HTML的FormData对象
May 17 HTML / CSS
HTML5实现音频和视频嵌入的方法
Aug 22 HTML / CSS
关于iframe跨域使用postMessage的实现
Oct 29 HTML / CSS
html5 横向滑动导航栏的方法示例
May 08 HTML / CSS
AmazeUI 折叠面板的实现代码
Aug 17 HTML / CSS
使用HBuilder制作一个简单的HTML5网页
使用CSS定位HTML元素的实现方法
CSS实现背景图片全屏铺满自适应的3种方式
Jul 07 #HTML / CSS
HTML实现仿Windows桌面主题特效的实现
Jun 28 #HTML / CSS
CSS 实现角标效果的完整代码
Jun 28 #HTML / CSS
CSS SandBox应用场景及常见问题
CSS的calc函数用法小结
Jun 25 #HTML / CSS
You might like
php中将数组存到文件里的实现代码
2012/01/19 PHP
php面向对象 字段的声明与使用
2012/06/14 PHP
php颜色转换函数hex-rgb(将十六进制格式转成十进制格式)
2013/09/23 PHP
php网页标题中文乱码的有效解决方法
2014/03/05 PHP
PHP中调用SVN命令更新网站方法
2015/01/07 PHP
详解WordPress开发中用于获取分类及子页面的函数用法
2016/01/08 PHP
ecshop适应在PHP7的修改方法解决报错的实现
2016/11/01 PHP
javascript中文本框中输入法切换的问题
2013/12/10 Javascript
js实现鼠标滚轮控制图片缩放效果的方法
2015/02/20 Javascript
jQuery实现的产品自动360度旋转展示特效源码分享
2015/08/21 Javascript
jQuery+css实现的换页标签栏效果
2016/01/27 Javascript
JavaScript简单实现鼠标移动切换图片的方法
2016/02/23 Javascript
jQuery操作cookie
2016/08/08 Javascript
easyui tree带checkbox实现单选的简单实例
2016/11/07 Javascript
jQuery插件FusionCharts绘制2D环饼图效果示例【附demo源码】
2017/04/10 jQuery
vue组件传递对象中实现单向绑定的示例
2018/02/28 Javascript
JS实现为动态添加的元素增加事件功能示例【基于事件委托】
2018/03/21 Javascript
解决vue-cli@3.xx安装不成功的问题及搭建ts-vue项目
2020/02/09 Javascript
[50:29]2014 DOTA2华西杯精英邀请赛 5 24 DK VS iG
2014/05/26 DOTA
[39:11]DOTA2上海特级锦标赛C组资格赛#2 LGD VS Newbee第二局
2016/02/28 DOTA
django admin添加数据自动记录user到表中的实现方法
2018/01/05 Python
python中实现字符串翻转的方法
2018/07/11 Python
python3基于TCP实现CS架构文件传输
2018/07/28 Python
python: 判断tuple、list、dict是否为空的方法
2018/10/22 Python
对Xpath 获取子标签下所有文本的方法详解
2019/01/02 Python
python opencv 读取本地视频文件 修改ffmpeg的方法
2019/01/26 Python
Django处理多用户类型的方法介绍
2019/05/18 Python
python pandas 时间日期的处理实现
2019/07/30 Python
Pycharm 使用 Pipenv 新建的虚拟环境(图文详解)
2020/04/16 Python
Python实现列表索引批量删除的5种方法
2020/11/16 Python
HTML5标签嵌套规则详解【必看】
2016/04/26 HTML / CSS
压铸汽车模型收藏家:Diecastmodelswholesale.com
2016/12/21 全球购物
naturalizer加拿大官网:美国娜然女鞋
2017/04/04 全球购物
2014年法院个人工作总结
2014/12/17 职场文书
幼儿园老师工作总结2015
2015/05/22 职场文书
2016猴年开门红标语口号
2015/12/26 职场文书