white-space nowrap如何使得弹性盒布局“异常”

概述

我们先来看看简单的例子:在弹性盒子模型中添加了 white-space: nowrap 会使的该项失去弹性效果。

效果:

图中可以看出实际 flex-right 的宽度并没有 250px,而且 flex-left 也失去了 flex:1 的效果。

这个问题在实际开发中最常出现在弹性盒子模型中设置其中项内容超出显示省略符失效:

效果:

notice 部分并没有超出显示省略符效果,并且 flex-1 也失效了。

原理

在解释原理之前先要搞清楚弹性盒子模型的一些概念:

flex 容器 (flex container) 和 flex 项目 (flex item)

flex 容器 (flex container): 开启了 flex 布局的元素;flex 项目 (flex item):flex 容器里面的直接子元素

主轴 (main axis) 和 交叉轴 (cross axis)

主轴 (main axis):flex 项目的排列方向;交叉轴 (cross axis):主轴的垂直交叉方向。

其中 main start 是主轴的开始位置(与边框的交叉点);main end:主轴的结束位置;cross start:交叉轴的开始位置;cross end:交叉轴的结束位置;main size:flex 容器或 flex 项目占据的主轴空间;cross size:flex 容器或 flex 项目占据的交叉轴空间。

图中 main size 是由 flex 容器或 flex 项目的 width 属性确定的,因此 width 属性也叫做 main size propertymin/max main size 是由 flex 容器或 flex 项目的 min-widthmax-width 属性确定的,因此 min-widthmax-width 属性也叫做 min and max main size properties

同样 cross size 是由 height 属性确定的,也叫做 cross size propertymin/max cross size 也就是 min-heightmax-height,也叫做 min and max cross size properties

size suggestion

content size suggestion(直译内容尺寸建议):是在主轴上的最小内容尺寸,如果有宽高比,通过宽高比转换确定侧轴的最大和最小尺寸。

specified size suggestion(直译指定尺寸建议):是在主轴上通过 main size property 设置的固定尺寸

transferred size suggestion(直译转换尺寸建议):如果 flex 项目具有固有的纵横比并且其计算的交叉尺寸属性是确定的,则传输的尺寸建议是通过纵横比转换的尺寸

content-based minimun size

content-based minimun size(基于内容的最小尺寸): 没有固定纵横比的情况下,基于内容的最小尺寸值是 content size suggestion(建议内容尺寸)和 specified size suggestion(指定建议尺寸)中的最小值。有固定纵横比基于内容的最小尺寸值是 content size suggestion(建议内容尺寸)和 transferred size suggestion(转换建议尺寸)的最小值。

automatic Minimum Size

automatic Minimum Size(自动最小尺寸): 关键字 auto 表示自动最小尺寸,这是 min-widthmin-height 属性的初始值,而在非滚动容器的 flex 项目中,其主轴自动最小尺寸是 content-based minimun size(基于内容的最小尺寸),滚动容器的的 flex 项目中自动最小尺寸是 0。

概念解释完了,我们再来看看上面的 flexbox 布局例子,flex-1 所在的元素并非滚动容器因此他的 automatic Minimum Size(自动最小尺寸)的值就是 content-based minimun size(基于内容的最小尺寸)的值,而 content-based minimun size(基于内容的最小尺寸)的值又是 content size suggestion(建议内容尺寸)和 specified size suggestion(指定建议尺寸)中的最小值,flex-1 所在的元素并未指定宽度,因此 content-based minimun size(基于内容的最小尺寸)的值就是 content size suggestion(建议内容尺寸)。也就是说 flex-1 所在的元素的最小尺寸就是元素内容的尺寸。而导致 flex:1 的自适应效果在小于内容尺寸时失效。

简单来说就是 flex 项目是非滚动容器时最小尺寸是内容尺寸和 width 中的最小值,width 没有设置那么最小尺寸就是内容尺寸。

解决方案

min-width:0

通过 min-width 为 0 来设置 specified size suggestion(指定建议尺寸)

css 复制代码
.flex-1 {
  flex: 1;
  min-width:0;
}

width :0

由于 content-based minimun size(基于内容的最小尺寸)值是 content size suggestion(建议内容尺寸)和 specified size suggestion(指定建议尺寸)中的最小值。如果 specified size suggestion(指定建议尺寸)为 0,那么 content-based minimun size(基于内容的最小尺寸)也就为 0,从而使得 automatic Minimum Size(自动最小尺寸)也为 0。

根据 specified size suggestion(指定建议尺寸)的定义,width 为 0 就能设置 specified size suggestion(指定建议尺寸)值为 0

css 复制代码
.flex-1 {
  flex: 1;
  width:0;
}

overflow:hidden

通过 overflow:hidden 创建 BFC(块级格式化上下文),BFC 就是一个隔离的独立容器,容器里的子元素不会影响到外面的元素,是里面的内容不会影响外面 flexbox 的布局。

css 复制代码
.flex-1 {
  flex: 1;
  overflow:hidden;
}

-webkit-line-clamp

可以把块容器中的内容限制为指定的行数多出的部分显示显示省略号。

css 复制代码
.notice{
  width: 100%;
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 1;
  word-break: break-all;
  overflow: hidden;
}
相关推荐
excel20 分钟前
如何解决 Nuxt DevTools 中关于 unstorage 包的报错
前端
Rust研习社23 分钟前
使用 Axum 构建高性能异步 Web 服务
开发语言·前端·网络·后端·http·rust
C澒42 分钟前
AI 生码 - API2Code:接口智能匹配与 API 自动化生码全链路设计
前端·低代码·ai编程
浔川python社1 小时前
HTML头部元信息避坑指南技术文章大纲
前端·html
IT_陈寒1 小时前
SpringBoot配置加载顺序把我坑惨了
前端·人工智能·后端
kyriewen1 小时前
Next.js部署:从本地跑得欢,到线上飞得稳
前端·react.js·next.js
Moment1 小时前
面试官:给 llm 传递上下文,有哪几个身份 role ❓❓❓
前端·后端·面试
跨境数据猎手1 小时前
跨境独立站系统技术拆解(附带源码)
服务器·前端·php
豹哥学前端2 小时前
用猜数字游戏,一口气掌握 JavaScript 核心知识点(附完整代码)
前端·javascript
忆往wu前2 小时前
从0到1一步步拆解搭建,梳理一个 Vue3 简易图书后台全开发流程
前端·javascript·vue.js