网上讲Flex布局的文章一抓一大把,但我发现很多朋友实际写页面的时候,遇到"垂直居中"还是条件反射地去翻老代码,遇到"左右自适应"第一反应还是float + margin。这套东西其实早就应该成为基因里的技能了。今天就把它彻底揉碎了讲清楚,从零开始,把Flex的核心规则、实战技巧、以及最常见的那些坑一次说透。
这篇内容适合刚接触前端布局的新手,也适合用了很久Flex但总觉得哪里没想明白的开发者。我会尽量把每一个属性背后的逻辑讲清楚,而不是甩出一堆"照着抄就行"的代码,因为布局这东西,只有理解了规则,才能真正做到怎么搭都顺手。
1. Flex的核心思维:把布局从"推箱子"变成"挂灯笼"
1.1 传统布局为什么折磨人
先聊一个很基础的问题:为什么早年间的CSS布局这么费劲?根源在于,传统的块级元素(block)是从上往下堆的,行内元素(inline)是从左往右排的,但"从中间往两边排"、"垂直方向随心所欲"、"高度不同还能底边对齐"这类需求,却要我们靠各种"技巧"硬凑。
举个最常见的例子,让一个盒子在父容器里水平垂直居中,传统方案有margin:auto + 绝对定位、table-cell + vertical-align、line-height等于容器高度等等,每一种都有它的适用场景和副作用。margin:auto + 绝对定位要求父容器必须有明确高度,而且子元素也得定宽高;line-height那套只适合单行文本;table-cell对IE老版本有点兼容性,但它的行为总让人觉得隔了一层。
这些方案本质都是"推箱子"——你推一下,箱子动一下,换一个场景要重新推。布局稍微复杂一点,比如三个元素,一个靠左一个居中一个靠右,传统方案要么用float绕来绕去,要么用绝对定位加calc去算,算完还得考虑圆角、阴影、换行这些细节。一整套写下来,代码又多又脆,改一个地方就崩另一处。
1.2 Flex的底层思维转变
Flex的英文全称是Flexible Box,翻译过来叫"弹性盒子"。它的思维方式跟传统布局完全不同:你不再挨个调整每个子元素的位置,而是告诉父容器"你应该怎么分配空间",剩下的交给浏览器去算。
打个比方,传统布局像在墙上钉钉子挂画,每张画你得自己量尺寸、找水平线、用水平仪反复调;Flex布局则像在一根晾衣绳上挂衣服,你把衣服夹上去,绳子和夹子会自动把衣服都挂平,间距不均匀?夹子调整一下夹的位置就好。
这种思维转变非常关键。以前我们是"约束每一个元素",现在是"定义一个容器规则,让空间自动流动"。这也是为什么Flex能用一个属性解决那么多看似复杂的布局问题——因为它的设计初衷就是让一维空间分配自动完成。
从实际效果来看,Flex把元素的排列、对齐、空间分配这三种能力全部内置了,而且是建立在"计算"而不是"硬调"的基础上。所以同样的需求,Flex代码量通常只有传统方案的三分之一,而且几乎不需要考虑子元素的具体尺寸。说白了,学会了Flex,你就从"精确控制工匠"变成了"定规则的包工头"。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 容器属性全拆解:排列、换行和对齐三大类
2.1 启动Flex:display:flex到底做了什么
要把一个普通的div变成弹性容器,只需要一行代码:
css复制.parent {
display: flex;
}
这行代码一加,父容器的子元素立即从"块级独占一行"变成了"水平排列",而且高度会自动拉伸到跟最高那个子元素一致。这是因为Flex容器默认的flex-direction是row(水平排列),默认的align-items是stretch(拉伸填满交叉轴)。
很多新手会在这时候疑惑:"我没写任何对齐属性,为什么子元素高度自己就变了一样?" 这就是Flex的默认行为。如果你不想要这种拉伸,通常要配合下面要讲的属性去覆盖。理解这一点很重要,因为不少"诡异问题"其实都来自默认值。
2.2 flex-direction:主轴方向决定一切
flex-direction是Flex布局的"方向盘",它有四个值:row、row-reverse、column、column-reverse。
- row:默认值,主轴水平,从左到右
- row-reverse:主轴水平,从右到左
- column:主轴垂直,从上到下
- column-reverse:主轴垂直,从下到上
Flex的整个布局体系是"主轴+交叉轴"的二维坐标模型。主轴方向由flex-direction决定,交叉轴永远是主轴的垂直方向。这个模型必须建立起来,否则justify-content和align-items混着用会特别晕。
举个常见例子,做一个移动端列表,希望条目上下排列,那直接:
css复制.list {
display: flex;
flex-direction: column;
}
从面试角度来说,考点通常是"flex-direction改变主轴对justify-content和align-items的影响"。记住一句话:justify-content跟着主轴走,align-items跟着交叉轴走。主轴变了,这两个属性对应的方向也全变了。
2.3 flex-wrap:一条线排不下怎么办
默认情况下,Flex容器里的子元素即使排不下,也会被压缩而不是换行。这个行为很多时候不是我们想要的。比如一排商品卡片,当屏幕只有320px宽时,你希望它自动换到下一行,那就要加:
css复制.parent {
display: flex;
flex-wrap: wrap;
}
flex-wrap有三个值:
- nowrap:不换行,默认值,子项会被压缩
- wrap:换行,排不下就换到下一行
- wrap-reverse:从下往上换行,比较少见
这里有个重要的认知:Flex默认的nowrap并不是"排不下就溢出",而是"排不下就压缩"。压缩的规则跟后面讲到的flex-shrink有关。所以如果你想做栅格系统、卡片瀑布、标签列表这类多行多列场景,wrap几乎是必开的。
wrap和flex-direction组合起来还能做方向反转的换行,比如从左到右排列且第二行在左侧。不过实际工作里用得不多,了解即可。
2.4 justify-content:主轴对齐的六种姿势
这可能是你用得最多的一个属性。justify-content负责子元素在主轴上的分布方式,六个值如下:
- flex-start:从主轴的起点开始排列(默认值)
- flex-end:从主轴的终点开始排列
- center:居中排列
- space-between:两端对齐,中间的间隔自动均分
- space-around:每个子项两侧的空间相等
- space-evenly:所有间距(包括两端的)完全相等
我分享一下实操中的经验对比。space-around和space-evenly经常被搞混,简单区分就是:space-around每个元素左右两侧各有相同空间,最左和最右元素到容器边缘只有中间间距的一半;space-evenly则彻底平均,连边缘都是完整间距。视觉上space-around更"松"一点,space-evenly更"规整"一点。
实际做导航栏、页脚图标栏、按钮组时,space-between和space-around使用率最高。比如做一个标准的导航,logo在左、菜单在右,一行justify-content: space-between就搞定了,不需要再对每个菜单项单独设margin。
2.5 align-items和align-content:交叉轴对齐的两兄弟
align-items处理的是单行子项在交叉轴上的对齐方式:
- stretch:拉伸填满交叉轴(默认值)
- flex-start:交叉轴起点对齐
- flex-end:交叉轴终点对齐
- center:交叉轴居中
- baseline:按文本基线对齐
align-content处理的是多行子项在交叉轴上的整体分布,前提是容器设置了flex-wrap: wrap并且有多行内容。它的取值跟justify-content几乎一样,只是方向换成了交叉轴。
这里有个常见的坑:很多人给多行容器设align-items: center,发现没居中,原因是多行时align-items只会作用于每一行内部,而不是整个容器。要整体的垂直居中就必须用align-content。而align-items和align-content同时设置时,有换行时align-content优先。
一句话总结使用场景:
- 做单行垂直居中 → align-items: center
- 做多行整体分布 → align-content: space-between / center
3. 项目属性精讲:flex-grow、flex-shrink、flex-basis的配合艺术
3.1 flex-basis:子项在主轴上的"初始尺寸"
flex-basis的值是长度(如200px、50%),它定义了子项在主轴方向上的初始大小。它和width有些像,但在Flex布局中有个区别:flex-basis的优先级高于width,但低于min-width和max-width。
举个例子:
css复制.item {
flex-basis: 200px;
}
这个子项在主轴方向上初始宽度是200px(假设主轴水平)。如果容器空间不够,它会被压缩;空间有余,它可能会被拉大——前提是没设置flex-grow: 0。
有个点值得注意,很多人喜欢直接写width来做flex容器里的子项宽度,但一旦出现空间不均、换行、压缩等问题,会发现width的"刚性"反而碍事。更推荐的做法是用flex-basis来设定初始尺寸,让flex体系内的分配逻辑保持闭环。
3.2 flex-grow:空间有余时怎么"长大"
flex-grow的默认值是0,意味着子项不会主动扩张。当容器的剩余空间为正数时,flex-grow决定谁去瓜分这些空间,以及按什么比例分。
举个例子:
html复制<div class="parent">
<div class="item a">A</div>
<div class="item b">B</div>
<div class="item c">C</div>
</div>
css复制.parent {
display: flex;
width: 600px;
}
.item {
flex-grow: 0;
}
.item.a {
flex-grow: 1;
}
.item.b {
flex-grow: 2;
}
.item.c {
flex-grow: 0;
}
如果A、B的初始宽度都是100px,剩余空间是400px(600 - 100 - 100 - 100),那这400px会按1:2分给A和B,A多分约133px,B多分约267px。最终A约233px,B约367px,C保持100px。
这种比例分配在日常布局里实在太常用了:侧边栏加主内容区、列表里的数量展示、卡片里的说明文字自动撑满剩余空间,全部是flex-grow的典型场景。比如一个消息列表,左边头像固定,中间内容自适应,右边时间固定,中间的flex-grow: 1就是那个"弹性变量"。
3.3 flex-shrink:空间不足时怎么"缩小"
flex-shrink的默认值是1,也就是空间不够了每个子项都会被压缩。0表示不压缩。
还是用例子说。容器宽300px,里面有三个子项,初始尺寸分别是100px、200px、150px,总和450px,超出150px。按flex-shrink比例(默认都是1)来压缩,因为基数不同,实际上压缩量是按"初始尺寸 * 缩小比例"来计算的:实际压缩后,较大的那个会被压得更狠。
- 项目1压掉100 / 450 × 150 ≈ 33px
- 项目2压掉200 / 450 × 150 ≈ 67px
- 项目3压掉150 / 450 × 150 ≈ 50px
最终尺寸约67px、133px、100px。
这个计算方式很多人没注意,以为flex-shrink是"1:1:1地均分超出的量",其实不是,是按加权值来算的。如果希望某个元素不被压缩,比如一个按钮文字不能变短,就设置:
css复制.btn {
flex-shrink: 0;
}
这在做移动端适配时特别有用。比如一个标签行,左标签想要完整显示,右侧的说明文字可以压缩,那左侧就flex-shrink: 0。
3.4 flex缩写:一行代码掌握分配规则
flex其实是三个属性的缩写:flex-grow、flex-shrink、flex-basis。常见的缩写值有:
- flex: 1 等价于 flex: 1 1 0%
- flex: auto 等价于 flex: 1 1 auto
- flex: none 等价于 flex: 0 0 auto
- flex: 0 1 auto 是默认值
我看到很多团队规范里喜欢用flex: 1来做"自适应占满剩余空间",这确实很方便,但有一个隐藏的小坑:flex: 1的flex-basis是0%,所以它不会根据内容先分配基础空间,而是把所有剩余空间(包括本来文字该占的那部分)都当成"可分配空间"来算。当内容很长时,flex: 1的元素可能会把文字挤到自己撑爆的极限。
如果你希望"内容多大就占多少,多了的才分配",那用flex: auto更贴合语义;如果你希望"固定按比例切分剩余空间",那flex: 1就对了。这个区别,面试时经常会被问到,实际开发里也影响布局得很直观。
3.5 align-self和order:个别子项的"特殊通道"
align-self允许单个子项在交叉轴上覆盖整体的align-items设置。比如一行里有三个按钮,希望中间那个底部对齐、其他居中,中间那个写align-self: flex-end就行。
order则控制子项的排列顺序,默认值是0。值小的排前面,支持负数。这个属性实际应用中非常香,比如移动端与PC端视觉顺序不同但HTML不想变时,用order调整就行,不用改DOM结构。但注意,order只是视觉排序,不影响键盘操作和屏幕阅读器的朗读顺序,涉及无障碍时要谨慎。
4. 自适应与居中的全套解决方案
4.1 水平垂直居中:一行代码的终极公式
Flex布局解决了CSS里最经典的中心问题。把一个元素在父容器里水平垂直居中,只需要三行:
css复制.parent {
display: flex;
justify-content: center;
align-items: center;
}
不需要知道子元素的宽高,不需要父容器定高,不需要计算——这是Flex在居中问题上最大的价值。父容器只要有宽高,哪怕宽高是100%或100vh都行。
如果父容器高度不确定,又想居中,其实Flex也能处理:父级用min-height而不是height,配合align-items: center,子元素的高度受内容支撑即可居中。这一点比绝对定位的方式优雅得多,绝对定位要求父级必须有确定高度,否则整段样式会失效。
4.2 一个元素居中,另一个定位:悬浮/容错布局
有时候子元素不是一个,而是有一个"正常文档流内的元素"居中,另一个"悬浮的角标"要放在角落。这种场景,父容器依然display: flex + justify-content: center + align-items: center,但那个角标不能用传统普通子元素放在里面(否则会被居中),而是用position: absolute脱离布局即可。
css复制.parent {
position: relative;
display: flex;
justify-content: center;
align-items: center;
}
.badge {
position: absolute;
top: 8px;
right: 8px;
}
这个组合让我在日常开发里把大量"浮角标、删除按钮、徽章"之类的需求都变得非常清爽。
4.3 多列等宽与内容自适应的两种模式
第一种是"每列固定等宽",用flex: 1就可以,无论多少列,它们会均分剩余空间。这是做统计栏、图标行、表格化卡片的好方式。
第二种是"部分固定、部分自适应"。比如搜索结果列表,左边缩略图固定80px宽,右边内容区域用flex: 1占满剩余空间。这里的一个细节是,右边的flex-basis最好设置成0%,这样就不会因为内容长短而影响整体的分配比例。实践写法:
css复制.thumb {
width: 80px;
flex-shrink: 0;
}
.content {
flex: 1 1 0%;
min-width: 0;
}
4.4 min-width: 0:解决内容把Flex容器撑破的问题
这是Flex布局里最隐蔽也最实用的一个坑。当一个flex子项内部包含长文本(比如一长串英文、一段URL)、或包含一个没有自适应能力的子元素时,即使父容器设置了flex: 1,子项也很容易被内容撑出容器,产生横向滚动。
根因是Flex子项默认的min-width: auto——意思是"我不能小于我的内容宽度"。长文本的"最小宽度"可能非常大,于是容器就被撑破了。
解决办法是给这个flex子项加上min-width: 0,让它允许被压缩到比内容更窄。这在聊天列表、指标卡片、多列布局中几乎必用。我还遇到一个"搜索框 + 按钮"的组合,搜索框用flex: 1后总被placeholder的长度撑破,加上min-width: 0立刻解决。
提示:遇到Flex子项莫名产生横向滚动条时,第一个排查点就是min-width: 0有没有加。
4.5 移动端适配:底部导航、标签栏、滑动的合体
移动端的底部Tab栏,几乎就是Flex的经典案例。需求是三到五个固定高度选项,水平分布且均分宽度,每个选项里有图标和文字。
实现思路:
css复制.tab-bar {
display: flex;
height: 50px;
border-top: 1px solid #eee;
}
.tab-item {
flex: 1;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
}
你注意,这里第二层又用了一次Flex,实现tab内部图标的垂直居中。Flex是支持嵌套的,一个flex容器里的子项也可以是另一个flex容器,这种做法在成熟项目里非常常见。水平均分、垂直居中、底部固定,一条flex链全搞定。
还有一类是"超出可滚动"的标签栏,比如顶部频道标签。做法是容器flex + overflow-x: auto,然后让每个标签flex-shrink: 0,这样才能横向滚动且不压缩。如果忘了设置flex-shrink: 0,标签会被压成细长条,看起来非常怪。
5. 高频场景实战:从导航栏到卡片布局的完整代码
5.1 经典导航栏:左边logo,中间菜单,右边按钮
先给一个非常常见的需求:顶部导航栏,左边放logo,中间放导航菜单,右边放一个"立即登录"按钮。
html复制<header class="navbar">
<div class="logo">LOGO</div>
<nav class="menu">
<a href="#">首页</a>
<a href="#">产品</a>
<a href="#">关于</a>
</nav>
<div class="action">
<button>登录</button>
</div>
</header>
css复制.navbar {
display: flex;
align-items: center;
justify-content: space-between;
padding: 0 20px;
height: 60px;
}
.menu {
display: flex;
gap: 16px;
}
这个方案里,navbar本身用space-between让三块区域两端分散开,中间menu里再用flex + gap控制菜单项间距。如果希望菜单真的居中而不是"中间偏左",可以把logo和action都固定宽度,然后给menu设置flex: 1 + justify-content: center。
两种做法的区别:前一种简单,适用于视觉不需要严格居的导航;后一种要复杂一些,但能让菜单在容器正中间。这个取舍我在实际项目中很常用到——如果菜单项很多且分布不均,前者几乎永远不会出问题。
5.2 双侧固定中间自适应:两行Flex完成的圣杯布局
经典的三栏布局(左右固定、中间自适应)以前是圣杯布局/双飞翼布局的重灾区,现在用Flex三行就能写完:
css复制.layout {
display: flex;
gap: 16px;
}
.sidebar-left {
width: 200px;
flex-shrink: 0;
}
.main {
flex: 1 1 0%;
min-width: 0;
}
.sidebar-right {
width: 220px;
flex-shrink: 0;
}
关键在于中间项的flex: 1 1 0%和min-width: 0。前者让它占满剩余空间,后者防止它被内容撑破。两个侧边栏各自设固定宽度并禁止压缩。
这套方案比老的三种技术方案(float三列、绝对定位加margin、table布局)少了一半代码,而且天然支持不同高度下的拉伸对齐。面试时如果被问到"如何实现左右固定中间自适应",直接甩这个,面试官基本就满意了。
5.3 卡片列表子项高度对齐:让每张卡片底部按钮"站齐"
做卡片列表时,经常遇到卡片高度不一致、按钮位置参差的问题。Flex处理这个非常优雅。
容器开启flex + wrap,每个卡片设置宽度(比如calc(33.333% - 16px)),然后卡片内部用flex-direction: column,底部按钮用margin-top: auto把它"推"到底部。
css复制.card-list {
display: flex;
flex-wrap: wrap;
gap: 16px;
}
.card {
width: calc(33.333% - 16px);
display: flex;
flex-direction: column;
}
.card .footer-btn {
margin-top: auto;
}
margin-top: auto在flex容器里非常好用。原本auto的margin只能做水平居中,但在flex容器里,auto margin会在主轴或交叉轴上自动吃掉剩余空间,把元素推到另一侧。这个技巧,用好了能省一堆定位代码。
5.4 侧边菜单:垂直排列加自动底部版权位
侧边栏布局是column方向的柔体。左边竖排菜单、底部版权信息固定在侧边栏最下方,用Flex做如下:
css复制.sidebar {
display: flex;
flex-direction: column;
height: 100vh;
}
.menu {
flex: 1;
overflow-y: auto;
}
.copyright {
padding: 16px;
}
这里.menu的flex: 1把中间的菜单区撑满剩余空间,版权块跟着自然沉底。菜单区域还能独立滚动,非常干净。如果用传统布局,你可能要body级flex + 绝对定位,或者计算高度后加死padding-bottom,很快就变得很脆。
5.5 登录表单:标签和输入框的对齐
表单里"标签左对齐、输入框自适应"是高频需求:
css复制.form-row {
display: flex;
align-items: center;
gap: 12px;
}
.form-row label {
width: 80px;
text-align: right;
flex-shrink: 0;
}
.form-row input {
flex: 1 1 0%;
min-width: 0;
}
标签固定宽度、输入框自动填充剩余空间,这样无论表单多宽,输入框都能撑满,且不会踩到标签。这是我从表格布局时代就希望获得的能力。
6. 面向面试与实际排查:Flex高频考点和避坑清单
6.1 面试必问的三个考点
第一个考点是flex: 1和flex: auto的区别。flex: 1的完整写法是1 1 0%,flex: auto是1 1 auto。前者表示"基础尺寸从0开始算,剩余空间按比例分配",后者表示"基础尺寸按内容大小,剩余空间再分配"。典型的面试场景是问"为什么flex: 1能等分?为什么换成auto就不等分了?"答案就是basis从0%和auto的差异。
第二个考点是主轴和交叉轴的识别。如果flex-direction写成column,那justify-content就不再是水平对齐了,而是垂直方向上的分布。很多人面试时一紧张就答反,关键是心中要有"主轴交叉轴坐标系"。
第三个考点是"flex子项min-width: auto导致的撑破容器"。面试官会给你一个长文本撑破盒子布局的代码,让你指出原因并修复。能答出min-width: 0,基本就说明你踩过这个坑,而不是背过答案。
6.2 一个老生常谈的问题:为什么设置了flex: 1宽度不变
很多新手发现,自己给某个元素设了flex: 1,但它没有占满剩余空间。原因往往在于:
- 子项里还有内容设置的固定宽度或padding、border,挤占了空间分配。
- 父容器没有确切的宽度(比如父级本身是width: auto,那么剩余空间的定义就很模糊)。
- 兄弟元素没有正确地收缩,比如某个兄弟有flex-shrink: 0且宽度超大。
解决办法:确保父容器有明确宽度,或者让所有参与分配的兄弟元素都使用同一套flex规则,必要时用flex-basis: 0%来彻底消除内容宽度的影响。
6.3 兼容性说明:老项目要不要用Flex
Flex的浏览器兼容性已经非常好,现代浏览器全部支持。只有极老的IE10/11是半吊子支持:IE10支持的是带-ms-前缀的老版语法,且不支持flex-wrap、gap等属性。如果项目还需要兼容IE11,建议用display: block + 手写宽度的fallback方案,或者在已经用了flex的位置增加后备样式。
不过从我的经验看,2026年了还固守IE11的项目至少是个遗留系统,这种系统通常也已不再做大量新功能的布局了。新项目可以放心全量使用Flex,再往前推进可以关注CSS Grid,但那是另一套体系,日常大部分一维布局Flex依旧是最顺手的工具。
6.4 几个容易被忽略的细节坑
第一个坑是gap属性的兼容性。Flex gap在2021年之后的浏览器基本都支持了,不用再靠margin + nth-child去模拟间距。但如果你的项目需要兼容旧iPad或某些WebView,还是要注意验证。我踩过一次:在一个企业内部App的WebView里,gap完全没生效,后来拿margin底做了兼容。
第二个坑是align-items: stretch的"意外拉伸"。默认情况下,flex子项会沿着交叉轴拉伸到跟容器一样高。有些场景下你不想让它拉伸,比如一个按钮在侧边栏里只想保持内容高度,那就得显式设为align-self: flex-start。
第三个坑是嵌套Flex容器里的百分比高度。如果你在column方向的flex容器里,子级想用height: 50%来占一半高度,父级又没设固定高度,那这个百分比很可能失效。解决方案是给父级高度一个确切的px/vh值,或者干脆用flex: 1配合min-height: 0。
7. 实操总结:最值得记下的三个核心心法
我说这三个心法,是因为它们能覆盖日常开发里百分之八十的布局需求:
第一,"主轴交叉轴"是唯一需要记在脑子里的坐标系。遇到任何对齐问题,先判断当前主轴是水平还是垂直,然后justify-content管主轴,align-items管交叉轴,永远不出错。
第二,flex: 1和min-width: 0是"自适应阵营"的最佳搭档。只要见到"这个元素想占满剩余空间但又怕被内容撑破",就同时写上这两个属性,基本能解决九成以上的疑难布局。
第三,善用gap和margin-top: auto这类小技巧,它们能减少大量单独的间距和定位代码。尤其是margin-top: auto,在Flex里利用"auto吃剩余空间"的机制推元素到底部,比绝对定位和死高度优雅得多。
Flex这套体系的魅力就在于:你不需要记住几百个属性值,只需要理解"容器定规则,子项按比例分配空间"这一个核心思想,然后所有布局都变成搭积木。真遇到复杂场景,大胆嵌套Flex容器,即使三层五层,只要每一层的结构关系清楚,代码都不会乱。
我实际做完这么多项目后的体会是,Flex最值钱的地方不是能少写多少行代码,而是它让布局从此变得可以预测、可以推理。以前写布局是"试出来的",现在写布局是"推出来的"。这样的转变,才是真正让人从"差不多能用"进阶到"写一个稳一个"的关键。
最后再分享一个小技巧:开发时打开浏览器DevTools,Elements面板里选中flex容器,可视化工具会直接展示主轴交叉轴和子项的收缩情况,调试Flex问题时比凭空想象快得多。看到分布不对,先看主轴方向是不是理解错了,再看子项的flex-shrink和min-width,这两个是排查Flex问题的万能起点。
