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;
}
相关推荐
Monkey的自我迭代3 分钟前
Python标准库:时间与随机数全解析
前端·python·数据挖掘
行云&流水3 分钟前
打造自己的组件库(二)CSS工程化方案
前端·vue.js·vue3组件库
知了清语27 分钟前
pnpm之monorepo项目, vite版本冲突, 导致vite.config.ts ts警告处理
前端
弗锐土豆1 小时前
一个基于若依(ruoyi-vue3)的小项目部署记录
前端·vue.js·部署·springcloud·ruoyi·若依
Hilaku1 小时前
我为什么放弃了“大厂梦”,去了一家“小公司”?
前端·javascript·面试
1undefined21 小时前
element中的table改造成虚拟列表(不定高),并封装成hooks
前端·vue.js
浅墨momo1 小时前
搭建第一个Shopify App
前端·程序员
然我1 小时前
React 事件机制:从代码到原理,彻底搞懂合成事件的核心逻辑
前端·react.js·面试
Codebee1 小时前
OneCode 组件服务通用协议栈:构建企业级低代码平台的技术基石
前端·前端框架·开源