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;
}
相关推荐
想唱rap30 分钟前
缓冲区的理解和实现
java·服务器·前端·c++·python
勤奋的小米蜂32 分钟前
vscode 自带终端无法正常执行例如npm命令---解决办法
前端·vue.js·vscode·npm
Wpa.wk39 分钟前
接口测试-多层嵌套响应处理-JSONPath使用(Java版)
java·前端·经验分享·python·测试工具·jsonpath
码丁_11739 分钟前
某IT培训班一阶段前端面试题
前端
yyt36304584139 分钟前
BEM规范
前端
遗憾随她而去.40 分钟前
前端加密(常用加密方式及使用)
前端
怕浪猫40 分钟前
React 从入门到出门第二章 生命周期函数与内置 Hooks 整体认知
前端·javascript·react.js
Han.miracle43 分钟前
JavaScript 基础核心知识点闯关练习
css·js
韩曙亮43 分钟前
【Web APIs】移动端常用的 JavaScript 开发插件 ⑤ ( Swiper 插件案例 - 3D 木马特效 )
前端·javascript·css·html·swiper·web apis
松涛和鸣1 小时前
DAY 44 HTML and HTTP Server Interaction Notes
linux·前端·网络·数据库·http·sqlite·html