flex布局三个核心属性解析
flex布局中控制子元素尺寸和占比的三个核心属性分别是flex-grow、flex-shrink和flex-basis,三者共同作用决定子元素的最终尺寸,很多占比问题都是因为对这三个属性的理解不到位导致的。

flex-basis:初始尺寸基准
flex-basis用来定义子元素在分配多余空间之前,占据的主轴空间大小,默认值是auto,也就是根据子元素的内容或者设置的width/height来决定初始尺寸。如果设置了具体的长度值,比如200px,那么子元素的初始尺寸就会按照这个值计算,除非后续被flex-grow或flex-shrink调整。
flex-grow:剩余空间放大比例
flex-grow的默认值是0,表示即使容器有剩余空间,子元素也不会放大。如果设置为大于0的数值,那么子元素会按照比例分配容器的剩余空间。比如两个子元素的flex-grow分别是1和2,那么剩余空间会按照1:2的比例分配给两个元素。
flex-shrink:不足空间缩小比例
flex-shrink的默认值是1,当容器空间不足时,子元素会按照比例缩小。如果设置为0,那么子元素不会缩小,可能会超出容器范围。缩小比例的计算会结合子元素的flex-basis值,flex-basis越大的元素,缩小的绝对值通常也越大。
常见占比不正确的场景与解决方法
场景一:设置了flex-grow但占比没有生效
这种情况通常是因为没有正确设置flex-basis,或者子元素有固定宽度导致无法放大。比如下面的代码,两个子元素都设置了flex-grow:1,但是第一个元素有固定width,导致占比不符合预期。
.container {
display: flex;
width: 600px;
}
.item1 {
width: 200px;
flex-grow: 1;
background: #f00;
}
.item2 {
flex-grow: 1;
background: #0f0;
}
这时候item1的初始宽度是200px,item2的初始宽度是内容宽度,剩余空间会按照1:1分配,但是item1因为有固定width,实际不会按照预期的比例分配。正确的做法是将固定width去掉,或者设置flex-basis为0,让两个元素都从0开始分配空间。
.container {
display: flex;
width: 600px;
}
.item1 {
flex-basis: 0;
flex-grow: 1;
background: #f00;
}
.item2 {
flex-basis: 0;
flex-grow: 1;
background: #0f0;
}
场景二:空间不足时元素超出容器
当容器宽度小于子元素的总flex-basis时,如果flex-shrink设置不合理,就会出现元素超出容器的情况。比如下面的代码,两个子元素的flex-basis都是400px,容器宽度只有600px,但是flex-shrink都设置为0,元素就不会缩小,超出容器范围。
.container {
display: flex;
width: 600px;
}
.item1 {
flex-basis: 400px;
flex-shrink: 0;
background: #f00;
}
.item2 {
flex-basis: 400px;
flex-shrink: 0;
background: #0f0;
}
解决方法是将flex-shrink设置为大于0的数值,让元素在空间不足时按比例缩小。比如都设置为1,那么两个元素会按照400:400的比例缩小,最终各占300px,刚好填满容器。
.container {
display: flex;
width: 600px;
}
.item1 {
flex-basis: 400px;
flex-shrink: 1;
background: #f00;
}
.item2 {
flex-basis: 400px;
flex-shrink: 1;
background: #0f0;
}
场景三:需要固定比例占比的实现
如果需要子元素按照固定的比例分配空间,比如2:1的占比,正确的做法是将flex-grow、flex-shrink、flex-basis配合使用,通常设置flex-basis为0,然后flex-grow按照比例设置,flex-shrink也按照比例设置,避免空间不足时出现异常。
.container {
display: flex;
width: 600px;
}
.item1 {
/* 2:1占比,flex-grow设为2,flex-shrink设为2,flex-basis设为0 */
flex: 2 2 0;
background: #f00;
}
.item2 {
flex: 1 1 0;
background: #0f0;
}
这里的flex是三个属性的简写,第一个值是flex-grow,第二个是flex-shrink,第三个是flex-basis,上面的代码等价于分别设置三个属性,最终实现item1占400px,item2占200px的2:1占比。
排查占比问题的步骤
当遇到flex子元素占比不正确时,可以按照以下步骤排查:
- 检查容器是否设置了display: flex,没有开启flex布局的话属性都不会生效
- 检查子元素的flex-basis是否设置合理,是否和固定width/height冲突
- 检查flex-grow是否正确设置,剩余空间分配是否符合预期比例
- 检查flex-shrink是否设置合理,空间不足时是否会正确缩小
- 检查子元素是否有min-width或者max-width限制,这些属性会影响最终的尺寸计算
只要理清三个属性的作用逻辑,结合具体场景调整参数,就能解决大部分flex布局子元素占比不正确的问题。
flexflex_growflex_shrinkflex_basis修改时间:2026-06-20 09:57:25