0

0

如何通过css flex-grow flex-shrink flex-basis组合控制布局

P粉602998670

P粉602998670

发布时间:2025-09-17 23:25:01

|

182人浏览过

|

来源于php中文网

原创

flex-grow、flex-shrink、flex-basis共同控制Flexbox子项的伸缩行为:flex-basis设定初始尺寸,flex-grow决定剩余空间的放大比例,flex-shrink定义空间不足时的缩小比例,三者通过flex简写属性协同工作,实现灵活的响应式布局。

如何通过css flex-grow flex-shrink flex-basis组合控制布局

CSS中的

flex-grow
flex-shrink
flex-basis
这三个属性,就像是Flexbox布局里,我们分配空间和应对尺寸变化的“指挥棒”。它们共同决定了一个弹性子项(flex item)在容器中如何根据可用空间进行伸缩和占据初始尺寸。简单来说,
flex-basis
设定了它“理想”的初始大小,而当空间不足时,
flex-shrink
决定它如何“委屈”自己缩小;当空间有余时,
flex-grow
则让它“放开手脚”去扩展。它们协同工作,让布局在不同屏幕尺寸下都能灵活自如地调整。

解决方案

要真正掌握

flex-grow
flex-shrink
flex-basis
,我们得把它们拆开来看,然后理解它们如何相互作用。在我看来,这三者是Flexbox弹性布局的核心,理解了它们,你对很多复杂的布局场景就能游刃有余。

  1. flex-basis
    :初始尺寸的“意愿”

    • 这个属性定义了flex item在沿着主轴(main axis)方向上的初始大小。你可以把它想象成在任何伸缩行为发生之前,这个元素“希望”自己有多大。
    • 如果
      flex-direction
      row
      (行),
      flex-basis
      控制的是宽度;如果是
      column
      (列),它控制的就是高度。
    • 常见的值有像素(
      px
      )、百分比(
      %
      )、
      em
      rem
      等,以及两个特殊关键字:
      • auto
        :这是默认值。这意味着flex item的初始大小会根据其
        width
        /
        height
        属性来决定,如果
        width
        /
        height
        也没设置,就根据内容大小来。
      • content
        :这个值会根据flex item的内容大小来计算其
        flex-basis
    • 我个人在实践中,如果想让元素在伸缩前有一个明确的起点,通常会给一个固定的
      px
      值,或者
      0
      (特别是当所有元素都需要等比例瓜分剩余空间时)。
  2. flex-grow
    :空间有余时的“贪婪”

    立即学习前端免费学习笔记(深入)”;

    • 当flex容器内有额外空间时,
      flex-grow
      决定了flex item如何去“瓜分”这些空间。
    • 它的值是一个无单位的数字,表示伸展的比例。默认值是
      0
      ,意味着元素不会增长。
    • 举个例子,如果两个flex item都有
      flex-grow: 1;
      ,它们会平分所有额外的空间。如果一个有
      flex-grow: 1;
      ,另一个有
      flex-grow: 2;
      ,那么第二个元素会获得第一个元素两倍的额外空间。
    • 这个属性在实现响应式布局,尤其是等宽或按比例分配宽度的场景下,简直是神器。
  3. flex-shrink
    :空间不足时的“妥协”

    • 当flex容器内空间不足,导致flex item会溢出时,
      flex-shrink
      决定了flex item如何“收缩”自己以适应容器。
    • 同样,它的值也是一个无单位的数字,表示收缩的比例。默认值是
      1
      ,意味着元素会收缩。
    • flex-shrink: 0;
      是一个非常重要的用法,它表示这个元素绝对不会收缩,会保持其
      flex-basis
      (或内容/
      width
      )定义的尺寸。这在需要固定尺寸的元素(比如导航栏中的Logo、侧边栏)上非常有用,可以防止它们被挤压变形。
    • 收缩的计算比增长稍微复杂一点,它会考虑每个元素的
      flex-basis
      乘以
      flex-shrink
      的值来决定收缩的“权重”。

组合使用:

flex
简写属性

这三个属性通常会通过

flex
简写属性一起设置:
flex: [flex-grow] [flex-shrink] [flex-basis];

  • 例如:
    flex: 1 1 auto;
    (默认值,可伸可缩,基于内容或
    width
  • 例如:
    flex: 0 0 200px;
    (固定200px宽,不伸不缩)
  • 例如:
    flex: 1;
    (这是
    flex: 1 1 0%;
    的简写,非常常用,表示元素可伸可缩,且在伸缩前没有固定尺寸,会尽可能占用空间)
  • 例如:
    flex: auto;
    (这是
    flex: 1 1 auto;
    的简写)
  • 例如:
    flex: none;
    (这是
    flex: 0 0 auto;
    的简写,不伸不缩,基于内容或
    width

我的经验是,理解了这三个参数的含义,再用

flex
简写,会清晰很多。特别是当你在调试布局时,单独调整
flex-grow
flex-shrink
flex-basis
,能让你更直观地看到每个参数的影响。

flex-basis和width/height有什么区别

这个问题我被问过好多次,也是初学者经常感到困惑的地方。在我看来,

flex-basis
width
/
height
在Flexbox布局中扮演的角色确实有重叠,但它们的优先级和作用场景是不同的。

width
height
是CSS中传统的尺寸属性,它们定义了一个元素的固有、绝对的尺寸。当一个元素不是flex item时,或者它在flex容器中的主轴方向不是由
flex-basis
控制时(比如
flex-direction: column
时你设置
width
),
width
/
height
会直接生效。

然而,当一个元素成为flex item,并且

flex-basis
被明确设置时,
flex-basis
会优先于
width
(如果
flex-direction
row
)或
height
(如果
flex-direction
column
)。你可以这样理解:
flex-basis
是告诉Flexbox布局算法,“嘿,在计算伸缩之前,我希望这个元素的主轴尺寸是这个值。”而
width
/
height
则更像是一个“备用方案”或者“非flexbox场景下的默认值”。

举个例子,如果你有一个div设置了

width: 300px;
,但同时它又是flex item,并且你给它设置了
flex-basis: 200px;
,那么在Flexbox的计算中,它会首先被视为200px宽。只有当
flex-basis
被设置为
auto
时,Flexbox才会去查看
width
height
属性,如果它们存在,就用它们作为
flex-basis
的初始值;如果
width
/
height
也不存在,那就按内容大小来。

我个人在写Flexbox布局时,除非有特殊需求(比如在交叉轴方向上需要固定尺寸),我更倾向于直接使用

flex-basis
来控制flex item在主轴上的初始尺寸,这样能让布局逻辑更清晰,避免不必要的冲突和优先级问题。

.flex-container {
  display: flex;
  flex-direction: row;
  width: 500px;
  border: 1px solid #ccc;
}

.item-a {
  width: 300px; /* 传统宽度 */
  flex-basis: 150px; /* flex-basis会覆盖width */
  background-color: lightblue;
  padding: 10px;
}

.item-b {
  width: 100px;
  flex-basis: auto; /* 此时会参照width: 100px */
  background-color: lightcoral;
  padding: 10px;
}

在这个例子中,

item-a
的宽度会是150px(在伸缩前),而不是300px。而
item-b
的初始宽度是100px,因为它
flex-basis: auto
。这种优先级关系,在实际开发中非常关键。

燕雀Logo
燕雀Logo

为用户提供LOGO免费设计在线生成服务

下载

如何使用flex-grow实现等宽布局或按比例分配空间?

使用

flex-grow
来实现等宽布局或按比例分配空间,是我最常用的Flexbox技巧之一。它让响应式设计变得异常简单。

1. 实现等宽布局: 当你想让容器内的所有flex item平分剩余空间,从而实现等宽布局时,最简洁的方法是给所有flex item设置

flex: 1;
。 这个
flex: 1;
其实是
flex: 1 1 0%;
的简写。这意味着:

  • flex-grow: 1;
    :所有元素都会以相同的比例去瓜分容器中所有可用的额外空间
  • flex-shrink: 1;
    :它们也都可以收缩。
  • flex-basis: 0%;
    :这是关键。它告诉浏览器,在计算伸缩之前,这些元素的初始尺寸是0。这样一来,所有的可用空间都变成了“额外空间”,然后被
    flex-grow
    公平地分配。
.equal-width-container {
  display: flex;
  width: 100%; /* 假设占满父容器 */
  border: 1px solid #ccc;
}

.equal-item {
  flex: 1; /* 简写,等同于 flex: 1 1 0%; */
  padding: 20px;
  text-align: center;
  border-right: 1px solid #eee;
}

.equal-item:last-child {
  border-right: none;
}
/* 结果:所有.equal-item都会平分容器的宽度 */

2. 实现按比例分配空间: 如果你需要更精细的控制,让不同flex item占据不同比例的额外空间,只需调整它们的

flex-grow
值即可。同样,为了确保是按比例分配所有额外空间,通常也会将
flex-basis
设置为
0

.proportional-container {
  display: flex;
  width: 100%;
  border: 1px solid #ccc;
}

.item-one-third {
  flex: 1 1 0%; /* 占据1份 */
  background-color: #a7d9f7;
  padding: 20px;
}

.item-two-thirds {
  flex: 2 1 0%; /* 占据2份 */
  background-color: #f7d9a7;
  padding: 20px;
}
/* 结果:item-two-thirds会是item-one-third宽度的两倍 */

这里有个小细节,如果

flex-basis
不是
0
,而是
auto
或者一个固定值,那么
flex-grow
分配的是减去所有flex item的
flex-basis
之和后
的剩余空间。这意味着,如果你的
flex-basis
值比较大,最终的比例可能不会严格按照
flex-grow
的比例来。比如,两个元素,一个
flex: 1 1 100px;
,另一个
flex: 2 1 100px;
,它们都会先占用100px,然后剩余空间按1:2分配。这样总宽度比例就不是严格的1:2了。所以,当追求严格的比例分配时,
flex-basis: 0
是个好习惯。

什么时候应该使用flex-shrink,以及如何避免不必要的收缩?

flex-shrink
这个属性,在我看来,是Flexbox处理“空间不足”场景的利器。它决定了当flex items的总尺寸超出flex容器时,每个item应该如何“委屈”自己,缩小以适应容器。

什么时候使用

flex-shrink

当你希望flex item在容器空间不足时能够自动调整大小,避免溢出时,

flex-shrink
就派上用场了。默认情况下,
flex-shrink
的值是
1
,这意味着所有的flex item都会按照一定的比例收缩。

比如,你有一个导航栏,里面有几个菜单项。当屏幕宽度缩小,菜单项可能就会挤不下。这时,默认的

flex-shrink: 1
会让它们都等比例缩小,尽量保持在同一行。

更具体的场景:

  • 响应式布局中元素的自适应: 很多时候,我们希望内容区域能根据视口大小自动调整,
    flex-shrink
    就让这种“弹性”成为可能。
  • 避免内容溢出: 当你不想出现横向滚动条,或者元素被截断时,让元素适度收缩是必要的。

如何避免不必要的收缩?

虽然

flex-shrink
很实用,但有些时候我们不希望某些元素收缩。比如一个logo、一个固定宽度的侧边栏、或者一个重要的按钮,它们必须保持其最小尺寸。这时候,
flex-shrink: 0;
就成了我们的救星。

  • flex-shrink: 0;
    :阻止元素收缩。
    当一个flex item被设置
    flex-shrink: 0;
    时,它将不会在容器空间不足时缩小。它会保持其
    flex-basis
    (或
    width
    /
    height
    ,如果
    flex-basis
    auto
    )定义的尺寸。这对于需要保持固定大小的元素至关重要。
.layout-container {
  display: flex;
  width: 100%;
  min-width: 300px; /* 模拟小屏幕 */
  border: 1px solid #ccc;
}

.sidebar {
  flex: 0 0 200px; /* 不伸不缩,固定200px宽 */
  background-color: #e0f7fa;
  padding: 15px;
}

.main-content {
  flex: 1 1 auto; /* 可伸可缩,优先内容尺寸,但会占用剩余空间 */
  background-color: #f1f8e9;
  padding: 15px;
}
/* 结果:当容器宽度小于200px + main-content的最小内容宽度时,main-content会收缩,但sidebar会保持200px */

在这个例子中,即使

.layout-container
的宽度变得很小,
.sidebar
也会坚定地保持200px的宽度,而
.main-content
则会努力收缩来适应剩余空间。如果
.main-content
收缩到其内容的最小尺寸也无法适应,那么整个容器就可能出现溢出。

结合

min-width
/
min-height
进行更精细的控制:

有时候,你可能不希望元素完全不收缩,而是希望它只收缩到某个最小尺寸。这时,

min-width
(或
min-height
,取决于
flex-direction
)就与
flex-shrink
形成了强大的组合。即使
flex-shrink
允许元素收缩,
min-width
也会为它设定一个“底线”,确保它不会缩小到无法接受的程度。

.gallery-container {
  display: flex;
  flex-wrap: wrap; /* 允许换行 */
  width: 100%;
  border: 1px solid #ccc;
}

.gallery-item {
  flex: 1 1 250px; /* 初始250px宽,可伸可缩 */
  min-width: 180px; /* 最小收缩到180px */
  background-color: #ffe0b2;
  margin: 10px;
  padding: 10px;
  box-sizing: border-box;
}
/* 结果:.gallery-item会尝试保持250px,如果空间不足会收缩,但不会小于180px。如果空间足够,它们会伸展以填充行。 */

这里,

flex-shrink
允许
gallery-item
收缩,但
min-width: 180px;
确保了它们不会变得过小,即便是在非常狭窄的屏幕上。这种组合拳,在我看来,才是真正实现健壮响应式布局的关键。

相关专题

更多
css
css

css是层叠样式表,用来表现HTML或XML等文件样式的计算机语言,不仅可以静态地修饰网页,还可以配合各种脚本语言动态地对网页各元素进行格式化。php中文网还为大家带来html的相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

524

2023.06.15

css居中
css居中

css居中:1、通过“margin: 0 auto; text-align: center”实现水平居中;2、通过“display:flex”实现水平居中;3、通过“display:table-cell”和“margin-left”实现居中。本专题为大家提供css居中的相关的文章、下载、课程内容,供大家免费下载体验。

265

2023.07.27

css如何插入图片
css如何插入图片

cssCSS是层叠样式表(Cascading Style Sheets)的缩写。它是一种用于描述网页或应用程序外观和样式的标记语言。CSS可以控制网页的字体、颜色、布局、大小、背景、边框等方面,使得网页的外观更加美观和易于阅读。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

758

2023.07.28

css超出显示...
css超出显示...

在CSS中,当文本内容超出容器的宽度或高度时,可以使用省略号来表示被隐藏的文本内容。本专题为大家提供css超出显示...的相关文章,相关教程,供大家免费体验。

539

2023.08.01

css字体颜色
css字体颜色

CSS中,字体颜色可以通过属性color来设置,用于控制文本的前景色,字体颜色在网页设计中起到很重要的作用,具有以下表现作用:1、提升可读性;2、强调重点信息;3、营造氛围和美感;4、用于呈现品牌标识或与品牌形象相符的风格。

761

2023.08.10

什么是css
什么是css

CSS是层叠样式表(Cascading Style Sheets)的缩写,是一种用于描述网页(或其他基于 XML 的文档)样式与布局的标记语言,CSS的作用和意义如下:1、分离样式和内容;2、页面加载速度优化;3、实现响应式设计;4、确保整个网站的风格和样式保持统一。

605

2023.08.10

css三角形怎么写
css三角形怎么写

CSS可以通过多种方式实现三角形形状,本专题为大家提供css三角形怎么写的相关教程,大家可以免费体验。

560

2023.08.21

css设置文字颜色
css设置文字颜色

CSS(层叠样式表)可以用于设置文字颜色,这样做有以下好处和优势:1、增加网页的可视化效果;2、突出显示某些重要的信息或关键字;3、增强品牌识别度;4、提高网页的可访问性;5、引起不同的情感共鸣。

397

2023.08.22

Java编译相关教程合集
Java编译相关教程合集

本专题整合了Java编译相关教程,阅读专题下面的文章了解更多详细内容。

7

2026.01.21

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
CSS3 教程
CSS3 教程

共18课时 | 4.7万人学习

Git 教程
Git 教程

共21课时 | 2.8万人学习

PHP自制框架
PHP自制框架

共8课时 | 0.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号