最新要闻
- Win无敌二十多年后 微软又抓到了AI风口:印度裔CEO立大功
- 环球关注:“小号Mate 50 Pro”!华为畅享60X来了:骁龙680、又一技术行业首发
- 全球观点:这株极品牡丹居然有“带刀侍卫”!24小时守护
- 当前关注:地表能效第一!锐龙9 7950X3D深入测试:i9-13900K无言以对
- 焦点讯息:SSD散热器疯了:比显卡都要高!还有暴力风扇
- 最新快讯!2023年北京市积分落户申报时间安排一览表
- 焦点简讯:选择大城市逐梦还是小城市安稳
- 世界快消息!电动自行车电池爆炸由谁赔偿?律师:销售商也有责任
- 每日热闻!会“跳舞”的汽车你见过吗?比亚迪云辇系统再次引领行业
- 全球热议:韩国26岁女星被发现在家中去世:新剧拍摄中 死因未透露
- 全球资讯:华为小米vivo一加重磅新机汇总!接下来10天有的看了
- 世界球精选!终于不缺货了!小米13 Ultra订单增加50%:不愁买不到
- 视讯!这才是青春_山东聊城市中考满分作文 中考满分作文:静待一场幸
- 环球热议:“三轮跑车”尬舞!又被比亚迪装到了 国产车控黑科技登场
- 每日快播:安“踏”李宁
- 天天速讯:月薪2万女高管不服从工作安排被炒获赔98万:网友力挺
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
环球观点:CSS杂谈——flex布局里面的auto到底多长
本篇博客将以 “ flex 布局里设置 auto 的区块怎么让文案超出省略的问题” 作为切入点,来分析一下 flex 布局里面各子项的具体长度到底怎么计算。
(资料图片仅供参考)
从需求出发谈 flex 布局
我们有一个 H5 项目,类似于微信的通讯录界面,前面是头像,后面是昵称。
所以我们一开始的代码是这么写的:
pic 00000000000000000000
pic 00000000000000000000 用人话来翻译一下这段代码,就是:
第一个 flex 布局子项占 100,且有剩余不占,有超出不减;
第二个 flex 布局子项自由适配,有剩余就占,有超出就减。
所以就达到了头像恒占 100,剩下部分占据剩余宽度的效果。
这个时候,我们需要关心的还有一个问题,就是昵称的长度问题,如果昵称长度太长了我们需要省略一下。所以我们对代码做了如下修改:
pic 00000000000000000000000000000000000000000000000000000000
pic 00000000000000000000000000000000000000000000000000000000 但 flex 布局的 flex-basis 设置为 auto 后,省略却不会如期生效。
这个时候可以用三种方法去解决这个问题:
设置第二个 flex 布局子项 width 为小于剩余宽度的值,由于剩余宽度不好确定,设置为0最保险
pic 00000000000000000000000000000000000000000000000000000000pic00000000000000000000000000000000000000000000000000000000设置第二个 flex 布局子项 min-width 为小于剩余宽度的值,由于剩余宽度不好确定,设置为0最保险
pic 00000000000000000000000000000000000000000000000000000000pic00000000000000000000000000000000000000000000000000000000设置第二个 flex 布局子项 overflow为 hidden(实际上设置 scroll、auto 都是可以的,但滚动,多少有些奇怪吧)
pic 00000000000000000000000000000000000000000000000000000000pic00000000000000000000000000000000000000000000000000000000
在解释这些设置为什么能解决这个问题之前,先来重新认识一下 flex 布局,毕竟长时间使用各个 UI 组件库的 Grid 后,自己也部分丧失了对弹性布局的理解。
Flex 布局的扩缩策略
我们这里不去讨论 flex 布局中 wrap 的部分,也只以水平方向的 flex 布局为例。尽量先简单地理解,如果大家对 flex 布局想要了解得更深,可以阅读 w3c 关于 CSS Flexible Box Layout Module Level 1 (w3.org) 的最新内容。
我们先了解一下 flex 这个决定布局扩缩策略的 CSS 属性。
flex
属性是以下 CSS 属性的简写:
flex-grow
flex-shrink
flex-basis
.flex-container {flex: 0 0 100px}
就是代表
.flex-container {flex-grow: 0;flex-shrink: 0;flex-basis: 100px;}
我们这里仅讨论三值语法,关于flex单值语法、双值语法的与flex-grow、flex-shrink、flex-basis的对应关系不在这里展开讨论,详细可以看 flex - CSS:层叠样式表 | MDN (mozilla.org) 这篇MDN文档。
接下来,先介绍一下flex-grow
、flex-shrink
两个扩缩相关的。
flex-grow
这个属性规定了 flex 布局子项在 flex 容器中分配剩余空间的相对比例,这个属性的默认值为0。
剩余空间是 flex 容器的大小减去所有 flex 项的大小加起来的大小。如果所有的 flex 布局子项的 flex-grow 系数加起来小于等于1,则剩余空间直接用 flex-grow 系数进行分配(有空余也不会接着分配);否则把 flex-grow 系数当成权重进行分配。
flex-grow 系数加起来小于等于1
|- 140px -| |- 160px -| \[\text{第一个子项(青色)的宽度:}W1 = \text{子项的初始大小:}100 + \text{剩余宽度:}200 * \text{flex-grow:}0.2 = 140 \\\text{第二个子项(棕色)的宽度:}W2 = \text{子项的初始大小:}100 + \text{剩余宽度:}200 * \text{flex-grow:}0.3 = 160\]flex-grow 系数加起来大于1
|- 180px -| |- 220px -| \[\text{第一个子项(青色)的宽度:}W1 = \text{子项的初始大小:}100 + \text{剩余宽度:}200 * \text{比例:}\frac{2}{2 + 3} = 140 \\\text{第二个子项(棕色)的宽度:}W2 = \text{子项的初始大小:}100 + \text{剩余宽度:}200 * \text{比例:}\frac{3}{2 + 3}> = 160\]flex-shrink
这个属性规定了 flex 布局子项在 flex 容器中的收缩规则,这个属性的默认值为1。
flex 布局子项在原始宽度之和大于容器的时候才会发生收缩。与 flex-grow 一样,如果所有的 flex 布局子项的 flex-shrink 系数加起来小于等于1,则超出部分直接用 flex-shrink 系数进行缩减(有超出也不会接着缩减);否则把 flex-shrink 系数当成权重进行超出部分的缩减。
flex-shrink 系数加起来小于等于1
\[\text{第一个子项(青色)的宽度:}W1 = \text{子项的初始大小:}300 - \text{超出宽度:}200 * \text{flex-shrink:}0.2 = 260 \\\text{第二个子项(棕色)的宽度:}W2 = \text{子项的初始大小:}300 - \text{超出宽度:}200 * \text{flex-shrink:}0.3 = 240\]flex-shrink 系数加起来大于1
\[\text{第一个子项(青色)的宽度:}W1 = \text{子项的初始大小:}300 - \text{超出宽度:}200 * \text{比例:}\frac{2}{2 + 3} = 220 \\\text{第二个子项(棕色)的宽度:}W2 = \text{子项的初始大小:}300 - \text{超出宽度:}200 * \text{比例:}\frac{3}{2 + 3} = 180\]flex-basis: auto
的计算规则
flex-basis 之所以单独介绍,是因为他是我们今天讨论的问题围绕的关键CSS属性
flex-basis 大部分时候是可以等同于 width的(flex-basis 的优先级比width高),但设置为 auto 的时候是比较特殊的,而且有较为复杂的发展历史。
备注:简史
- 最初,"flex-basis:auto" 的含义是 "参照我的
width
和height
属性".- 在此之后,"flex-basis:auto" 的含义变成了自动尺寸,而 "main-size" 变成了 "参照我的
width
和height
属性"。实际执行于 bug 1032922.- 然后呢,这个更改又在 bug 1093316 中被撤销了,所以 "auto" 变回了原来的含义; 而一个新的关键字 "content" 变成了自动尺寸。 (bug 1105111 包括了增加这个关键字).
不过这个历史了解一下就好,它跟我们今天讨论的问题并没有关系。当我们没有给 flex 布局子项设置width
时,flex-basis: auto
由内部的content
决定宽度,和flex-basis: content
是一样的。
在上面,我们通过三种方法,让 flex-basis 为 auto 的 flex 布局子项文案省略可以生效。
设置 flex 布局子项 width 为 0,让宽度的初始值为 0,再基于 flex-grow 扩张,而不是以子项的 content 宽度为准,从而保障宽度不溢出,这听起来很好理解。
但是设置 flex 布局子项 overflow 为 hidden、设置 min-width 为 0,从而让宽度不以子项的 content 宽度为准,这听起来就不是一个很好理解的做法。
设置 flex 布局子项 overflow 为 hidden
因为设置 flex 布局子项 overflow 为 hidden 和设置 min-width 为 0 是一个道理,我们先来看看设置 overflow 为 hidden 是怎么等同设置 min-width 为 0 的。
为此,我们需要先阅读一下 CR-css-flexbox-1-20181119 的 4.5节 Automatic Minimum Size of Flex Items。
To provide a more reasonable default minimum size for flex items, the used value of a main axis automatic minimum size on a flex item that is not a scroll container is a content-based minimum size; for scroll containers the automatic minimum size is zero, as usual.
从这段话可以得出设置 overflow 为 scroll、auto 可以让 min-width 为 0,所以设置 overflow 为 scroll 和设置 min-width 为 0 在宽度计算的影响方面是等效的。那设置 overflow 为 hidden 呢?
我们来看一下 CR-css-flexbox-1-20181119 从 2016 年之后的处于候选推荐阶段的一些东西 Changes since the 1 March 2016 CR。
value to be easier to understand. ([Issue 9](CSS Flexible Box Layout Level 1 Disposition of Comments for 2016-03-01 CR (csswg.org)))
On a flex item whose overflow is visible in the main axis, when specified on the flex item’s main-axis min-size property,
the following table gives the minimum size …specifies an automatic minimum size.In general, the automatic minimum size … defined below:
这里的意思就是为了方便理解,不再是说 overflow 设置为滚动才会使 min-width 为 0,而是只有 overflow 设置为 visible 的时候,min-width 为 auto,其他时候都是 0。一般来讲,有相当部分的文档会在候选推荐阶段就得到浏览器厂商的认可,并用于实践。所以,现在大多数的浏览器也是 overflow 不为 visible 时 min-width 为 0。
设置 flex 布局子项 min-width 为 0
接下来就是讨论为什么设置 flex 布局子项 min-width 为 0 可以让文案省略生效了。
我们已经知道 overflow 为 visible 时,min-width 为 auto,所以一般情况下,min-width 都为 auto。而由于弹性布局特有的扩缩容忍度,flex 布局子项的大小是可以延伸到弹性盒子外的。CR-css-flexbox-1-2018111 也写到了,如果 min-width 为 auto,flex 布局子项就会基于他的 content 去计算自己的最小宽度。
For the purpose of calculating an intrinsic size of the box (e.g. the box’s min-content size), a content-based minimum size causes the box’s size in that axis to become indefinite (even if e.g. its width property specifies a definite size). Note this means that percentages calculated against this size will behave as auto.
这个特性导致最小宽度如果超出原本他可以占据的空间,而 flex-shrink 的设置又受最小宽度的限制不能回缩,flex 布局子项就会溢出。
而省略文本由于设置了white-space: nowrap,导致空格或者其他分割、全角符号不能换行,此时文案越长,flex 布局子项的content越宽,flex 布局子项随着溢出,没有了外边的限制,内部也就失去了省略的必要。
In particular, if flex sizing is being used for a major content area of a document, it is better to set an explicit font-relative minimum width such as min-width: 12em. A content-based minimum width could result in a large table or large image stretching the size of the entire content area into an overflow zone, and thereby making lines of text gratuitously long and hard to read.
CR-css-flexbox-1-2018111 文档也说明了这样的特性会导致溢出的出现,需要开发者去指定一个最小宽度,所以指定最小宽度是一个官方的,合理的解决方案。
简单理解
如果长篇大段不好理解,其实有一个比较奇特的类比可以说明问题。一般来说,flex 布局设置 flex-basis 为 auto 的子项默认情况如下代码:
10000000000000000000000000000000000000000000000000000000000000000000
10000000000000000000000000000000000000000000000000000000000000000000 开发者需要用 min-width:0
覆盖 min-width: fit-content
。
CSS 的设计还是有其深奥的地方,平时过于依赖UI组件库果然是不行呢~
关键词:
环球观点:CSS杂谈——flex布局里面的auto到底多长
光栅化算法-中点画圆算法
Win无敌二十多年后 微软又抓到了AI风口:印度裔CEO立大功
环球关注:“小号Mate 50 Pro”!华为畅享60X来了:骁龙680、又一技术行业首发
全球观点:这株极品牡丹居然有“带刀侍卫”!24小时守护
当前关注:地表能效第一!锐龙9 7950X3D深入测试:i9-13900K无言以对
焦点讯息:SSD散热器疯了:比显卡都要高!还有暴力风扇
最新快讯!2023年北京市积分落户申报时间安排一览表
世界资讯:微信小程序:接手项目,修bug
焦点简讯:选择大城市逐梦还是小城市安稳
世界快消息!电动自行车电池爆炸由谁赔偿?律师:销售商也有责任
每日热闻!会“跳舞”的汽车你见过吗?比亚迪云辇系统再次引领行业
全球热议:韩国26岁女星被发现在家中去世:新剧拍摄中 死因未透露
Python中struct 模块的使用教程
焦点观察:once do, do it well
全球资讯:华为小米vivo一加重磅新机汇总!接下来10天有的看了
世界球精选!终于不缺货了!小米13 Ultra订单增加50%:不愁买不到
视讯!这才是青春_山东聊城市中考满分作文 中考满分作文:静待一场幸
SpringApplication详解
焦点讯息:OpenAI Translator | 基于ChatGPT API全局翻译润色解析及ORC上传图像翻译工具
当前报道:锁屏面试题百日百刷-kafk篇(一)
环球热议:“三轮跑车”尬舞!又被比亚迪装到了 国产车控黑科技登场
每日快播:安“踏”李宁
天天速讯:月薪2万女高管不服从工作安排被炒获赔98万:网友力挺
出水芙蓉?真人版《小美人鱼》电影照更新:黑小美人鱼特写来了
Turtlebot3仿真代码学习笔记
世界热点!.NET 个人博客系统
五金店卖什么卖得最好_五金店卖什么
天天新消息丨腾讯国漫手游《狐妖小红娘》宣布停运 6月16日关闭服务器
电动版帕萨特这模样?大众ID.7申报图亮相
视焦点讯!3599元起 铭凡推出NPB7迷你主机:i7-13700H、双雷电4
天天速读:丰田醒了 可睁开眼发现:世界已经变了!
南方的网友注意了 沙尘已跨过长江!北京影响已到末期
day07-OpenFeign-服务调用
看热讯:stm32 使用多串口通信调试总结
速讯:记录-css实现交融文字效果
环球最新:阿里云 - 连接不同VPC方案
天天时讯:紫薯泥怎么做好吃-紫薯泥
【天天新视野】本周发布!徕卡M11 Monochrom详细规格曝光
旗舰功能全下放!华为nova 11 Ultra曝光:卫星通信、可变光圈都支持
焦点速看:米粉催雷军发小米13 Ultra:你敢发我就敢买
电脑里破解软件又少一款!Win11原生录屏免费平替了:新增快捷键
绝对忠诚?超八成iPhone用户丢机后秒换新款iPhone
全球快讯:从spring boot泄露到接管云服务器平台
ThreadPoolExecutor源码学习
图文介绍 Windows 系统下打包上传 IOS APP 流程
【Visual Leak Detector】使用注意事项
一个TCP 连接可以发送多少个HTTP请求?
为什么打不开空间_腾讯官方的解决方法
《终结者》T-1000成真!科学家研制出可固液转变机器人 形态科幻
当前观点:或命名为“高山” 魏牌全新插混MPV申报:红旗HQ9有话要说
印度版大G来啦!4排10座轴距超3米 马力只有90匹
坚持元宇宙不动摇:Meta百万美元年薪招聘VR程序员
环球观热点:女子下班回工作消息获赔加班费引热议!调查称仅1成多人拒绝下班秒回工作
全球即时:卢拉发推预告:“我将启程前往中国”,期望加强巴中贸易伙伴关系
世界简讯:【一行代码秒上云】Serverless六步构建全栈网站
科创人·中建三局一公司尹奎:数字化变革能创造全新行业,其意义超越形式、范式创新
当前关注:CAD二次开发,安装程序中写注册表
滚动:低代码开发,是稳扎稳打还是饮鸩止渴?
快报:【金融街发布】人民银行:3月货币供应量M2同比增长12.7% 比上月回落0.2个百分点
能打比亚迪宋PLUS DM-i 哈弗枭龙MAX开订:用上Hi4电四驱
焦点关注:两大巨头“世纪大和解”!腾讯视频官方入驻抖音:昵称“鹅家”
天天日报丨13代标压高能轻薄本!华硕无畏15i 2023到手5699元:OLED好屏值得拥有
又来一份10年协议!微软与英国EE达成云游戏合作
焦点播报:《圣斗士星矢》真人版战斗预告:变身画面超燃!
温彬等:食品、能源价格双双下探,促内需政策仍须发力
精彩看点:【业务自动化平台】上海道宁与UiPath致力于让每个企业、每个人都能充分利用自动化带来的成就和优势
微服务保护--Sentinel
ASP.NET Post, FromBody 接参总是null 空值. Web api 前端传递是有值的,怎么回事?
【新华500】新华500指数(989001)11日微跌0.07%
快消息!7000mAh超大电池比肩充电宝!华为畅享60X官宣:实用体验才是王道
世界快资讯:女子看电视惊现3000多秒超长广告 直呼太离谱
环球今亮点!国内最新快递服务满意度出炉:顺丰、京东、邮政排前三 你经常用哪家?
简讯:大家不看电视了?海信:电视开机率低是个伪命题
环球快讯:别YY失控!深圳一辆特斯拉钣喷中心破窗而出 差点掉下来:官方回应
热议:希腊神话的英语典故
重试,让程序更健壮
aix系统如何查看网卡配置
模型训练与推理中为什么需要使用GPU?基本概念梳理
全球球精选!2023年最新iOS打包发布流程汇总
韩总统府称网传美监听韩政府文件部分系伪造
多地现沙尘暴!中央气象台首席预报员:沙尘天气无需根治
英特尔锐炫A750最新驱动游戏实测:进步巨大
刷新认知!男子站临海近乎垂直石壁上钓鱼:网友直呼请勿模仿
环球新动态:世界首个“九尾狐甲鱼”化石被发现:长相奇特怪异
全球第一批25个GPT模型开始自由生活
当前资讯!应用火山引擎 DataTester“避坑”,抖音实现用 A/B 实验快速试错
路由跳转及传参
每日消息!堆叠面积图的优点和缺点有哪些?
跟ChatGPT聊天、需求润色优化,禅道OpenAI 插件发布!
三星9082怎么恢复出厂设置?三星9082手机参数
索尼w570现在值多少钱?索尼w570参数
台式机怎么设置无线上网?台式机怎么调节屏幕亮度?
巧克力键盘是什么意思?巧克力键盘和机械键盘的区别是什么?
诺基亚n82上市价格是多少?诺基亚n82手机参数
每日时讯!鑫顺看市:4.11黄金守住1980关键位,多头或再次卷土重来
当前资讯![网络]应用层协议:HTTP / HTTPS
用ChatGPT问.NET的相关问题,.NET工程师的前景不错
每日热讯!男子被鱼刺卡喉硬吞饭团:结果扎穿食管
天天速看:力压宝马X5 理想L7交付首月狂卖8009台:稳居国内中大型SUV销量第一