flex:1
和flex:auto
到底有啥区别?看完这篇别再搞混了!
前几天看到一个看似简单的面试题:"flex:1
和flex:auto
有什么区别?" 一查才发现,这俩真的不是一回事!而且据说90%的前端都容易搞错。
场景
假设你有一个div
,里面放了三个子元素,你想让它们平均分宽度。很多人会这样写:
css
.item {
flex: 1;
}
这样写没问题,三个元素确实会等分。但如果你改成:
css
.item {
flex: auto;
}
效果可能就完全不一样了!你可以试试。下面有对比图。
flex属性
首先要知道,flex
属性其实是三个属性的简写:
flex: flex-grow
flex-shrink
flex-basis
;
这仨兄弟分别管什么呢?
flex-grow
:有剩余空间时,怎么放大flex-shrink
:空间不够时,怎么缩小flex-basis
:初始大小是多少
flex:1 到底是什么意思?
当你写 flex:1 时,实际上相当于:
css
{
flex-grow: 1;
flex-shrink: 1;
flex-basis: 0%;
}
注意这里的flex-basis:0%
这意味着它的初始大小是0,剩余空间会完全按照flex-grow
的比例分配。
flex:auto
又是什么意思?
当你写 flex:auto 时,相当于:
css
{
flex-grow: 1;
flex-shrink: 1;
flex-basis: auto;
}
关键区别就在这个flex-basis:auto
上!它会根据元素内容大小来设定初始尺寸。
假设我们有三个div:
html
<div class="container">
<div class="item">短文本</div>
<div class="item">这是一段比较长的文本内容</div>
<div class="item">中等待遇</div>
</div>
案例1:使用 flex:1
css
.container { display: flex; }
.item { flex: 1; }
结果:三个div完全等分,不管里面文字多少!
案例2:使用 flex:auto
css
.container { display: flex; }
.item { flex: auto; }
结果对比

你会发现,有更多文字的div会更宽一些,因为它的初始大小(flex-basis:auto)更大。
什么时候用哪个?
- 想要完全均分空间 → 用
flex:1
- 想要根据内容比例分配 → 用
flex:auto
再举个实际例子:导航栏菜单
如果你想要所有菜单项等宽,用flex:1
。 如果你想要菜单项根据文字长度自适应,用flex:auto
。 如下图:

简单总结
flex:1
= 我不管内容,我就要均分! flex:auto
= 先按内容大小来,剩下的再分!
这下明白了吧?下次面试再被问到,可别再说"差不多"了!
赶紧收藏起来,说不定哪天就用上了呢?
我是大华,专注分享前后端开发的实战笔记。关注我,少走弯路,一起进步!
📌往期精彩
《工作 5 年没碰过分布式锁,是我太菜还是公司太稳?网友:太真实了!》