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;
}
相关推荐
学习使我快乐012 小时前
JS进阶 3——深入面向对象、原型
开发语言·前端·javascript
bobostudio19952 小时前
TypeScript 设计模式之【策略模式】
前端·javascript·设计模式·typescript·策略模式
黄尚圈圈3 小时前
Vue 中引入 ECharts 的详细步骤与示例
前端·vue.js·echarts
浮华似水4 小时前
简洁之道 - React Hook Form
前端
正小安6 小时前
如何在微信小程序中实现分包加载和预下载
前端·微信小程序·小程序
_.Switch7 小时前
Python Web 应用中的 API 网关集成与优化
开发语言·前端·后端·python·架构·log4j
一路向前的月光7 小时前
Vue2中的监听和计算属性的区别
前端·javascript·vue.js
长路 ㅤ   7 小时前
vite学习教程06、vite.config.js配置
前端·vite配置·端口设置·本地开发
长路 ㅤ   7 小时前
vue-live2d看板娘集成方案设计使用教程
前端·javascript·vue.js·live2d
Fan_web7 小时前
jQuery——事件委托
开发语言·前端·javascript·css·jquery