flex:1详解,以及flex:1和flex:auto的区别

什么是flex:1?

在css中,我们经常可以看到这样的写法:

cpp 复制代码
.box {
  display: flex;
}

.item {
  flex: 1;
}

这里的flex:1相当于flex: 1 1 0%,它是一个简写属性,表示项目(flex item)在弹性容器(flex container)中如何伸缩。它相当于flex: 1 1 0%,包含了三个子属性:

  • flex-grow 定义项目的放大比例,默认为0,即如果存在剩余空间,也不放大。
  • flex-shrink 定义了项目的缩小比例,默认为1,即如果空间不足,该项目将缩小。
  • flex-basis 定义在分配多余空间之前,项目占据的主轴空间(main size),浏览器根据此属性计算主轴是否有多余空间,默认值为 auto ,即项目本身的大小。

flex:1的作用

使用flex:1的作用是让项目能够自动填充剩余空间,实现自适应布局。例如,我们有一个水平排列的三个项目,它们的内容长度不一样,我们想让它们平均占据一行的空间,就可以给它们都设置flex:1\

cpp 复制代码
<div class="container">
  <div class="item">Hello</div>
  <div class="item">World</div>
  <div class="item">Flex</div>
</div>
.container {
  display: flex;
}

.item {
  flex: 1;
}

这样,无论容器的宽度如何变化,项目都会自动调整宽度,保持平均分配。

flex:1和其他值的区别

flex属性还可以取其他值,例如:

  • flex: none,相当于flex: 0 0 auto,表示项目不会伸缩,保持原始大小。
  • flex: auto,相当于flex: 1 1 auto,表示项目会根据自身大小和剩余空间进行伸缩。
  • flex: n(n为正整数),相当于flex: n 1 0%,表示项目的放大比例为n,其他值默认。

我们可以通过修改上面的例子来观察不同值的效果:

cpp 复制代码
<div class="container">
  <div class="item none">Hello</div>
  <div class="item auto">World</div>
  <div class="item one">Flex</div>
</div>
.container {
  display: flex;
}

.item {
  border: 1px solid black;
}

.none {
  flex: none;
}

.auto {
  flex: auto;
}

.one {
  flex: 1;
}

可以看到,none类的项目保持了原始大小,auto类的项目根据内容长度进行了伸缩,one类的项目平分了剩余空间。

felx:1和flex:auto的区别

  • flex-basis属性定义了项目在分配多余空间之前,占据的主轴空间(main size)。
  • flex:1相当于flex: 1 1 0%,表示项目的基准大小为0%,不考虑项目本身的大小,只根据剩余空间进行伸缩。
  • flex:auto相当于flex: 1 1 auto,表示项目的基准大小为auto,即项目本身的大小,同时也会根据剩余空间进行伸缩。

这样,当容器的大小变化时,两者的表现也不同。

  • 如果容器有足够的空间,flex:1和flex:auto都会平分剩余空间,但是flex:auto会保持项目本身的最小宽度,而flex:1不会。
  • 如果容器没有足够的空间,flex:1会优先压缩内容,使得所有项目都能等分空间,而flex:auto会优先保持内容的完整性,挤压其他项目的空间。

总结

flex:1是一个常用的CSS属性,它可以让项目在弹性容器中自动填充剩余空间。
它是一个简写属性,包含了三个子属性:flex-grow, flex-shrink, flex-basis。
它相当于flex: 1 1 0%,flex:1和flex:auto都会占满剩余空间,我们可以根据合适的需求去选择这两种属性。

相关推荐
kyriewen10 小时前
我手写了一个 EventEmitter,面试官追问了 6 个问题——第 4 个我没答上来
前端·javascript·面试
IT_陈寒10 小时前
Java的Date类又坑了我一次,改用时间戳真香
前端·人工智能·后端
小林攻城狮11 小时前
使用 Transport 节流解决 Vercel AI SDK 流式渲染卡死问题
前端·react.js
前端缘梦11 小时前
告别 TS 运行时类型漏洞!Zod 完整入门实战教程(前端 / 全栈必备)
前端·react.js·全栈
the_answer11 小时前
Webpack vs Vite 深度对比分析
前端·webpack
转转技术团队12 小时前
验证码识别实战:前端不写页面,改训模型了?
前端
MomentYY12 小时前
Temperature:AI 的“脑洞旋钮”
前端·llm·ai编程
远航_12 小时前
OpenSpec 完整详细介绍
前端·后端
召钱熏12 小时前
状态枚举正确≠渲染正确:一个语音按钮的状态机边界修复实录
android·前端
SkyWalking中文站12 小时前
认识 Horizon UI · 1/17:SkyWalking 新一代可观测性控制台
运维·前端·监控