Flex: 1
今天在学习 Full-Stack Social Media App Tutorial with React 19 & Next.js 15 & MySql | React Next.js Full Course 时遇到了好几次使用 flex-1,这是由 Tailwindcss 提供的预定义的类名,等同于为该元素挂上了 flex: 1。
flex 是 CSS 中一个常用的 简写属性,其实际上是 flex-grow、flex-shrink、flex-basis 三个属性的简写,而 flex: 1 则等同于 flex: 1 1 0%。
flex-grow: 1:定义项目的放大比例,值为 1 表示如果存在剩余空间,项目将按比例放大。flex-shrink: 1:定义项目的缩小比例,值为 1 表示如果空间不足,项目将按比例缩小。flex-basis: 0%:定义在分配多余空间之前,项目占据的主轴空间,值为 0% 表示项目的初始大小为 0。
flex: auto 与 flex: 1 的区别
在 CSS Flex 布局中,flex: 1 和 flex: auto 都用于定义弹性项目如何在容器中分配空间,但它们的行为有所不同,主要区别在于 flex-basis 属性的取值:
flex: 1:等同于flex: 1 1 0%,其中flex-basis为0%。这意味着元素的初始大小被设为 0,在分配剩余空间时,各元素按比例平分剩余空间,而不考虑其内容的固有大小。flex: auto:等同于flex: 1 1 auto,其中flex-basis为auto。这表示元素的初始大小基于其内容的固有尺寸,在分配剩余空间时,首先考虑元素的内容大小,然后再根据剩余空间进行伸缩。
具体区别:
-
空间分配方式:
- 使用
flex: 1时,所有设置了该属性的元素会忽略自身内容的宽度,平分容器的剩余空间。 - 使用
flex: auto时,元素首先根据自身内容确定初始大小,然后在剩余空间中按比例分配。
- 使用
适用场景:
flex: 1:适用于需要所有元素等分剩余空间的场景,例如创建等宽的导航按钮或卡片布局。flex: auto:适用于希望元素根据自身内容动态调整大小的场景,例如导航栏中的菜单项,其宽度根据文字长度自动调整。
Flex
以下摘取自 MDN Web Docs 中对该属性的语法解释:
语法
/* 关键字值 */
flex: auto;
flex: initial;
flex: none;
/* 单值,无单位数字:flex-grow
flex-basis 此时等于 0。 */
flex: 2;
/* 单值,宽度/高度:flex-basis */
flex: 10em;
flex: 30px;
flex: min-content;
/* 双值:flex-grow | flex-basis */
flex: 1 30px;
/* 双值:flex-grow | flex-shrink */
flex: 2 2;
/* 三值:flex-grow | flex-shrink | flex-basis */
flex: 2 2 10%;
/* 全局值 */
flex: inherit;
flex: initial;
flex: revert;
flex: revert-layer;
flex: unset;
可以使用一个、两个或三个值来指定 flex 属性。
-
单值语法:值必须是以下之一:
- 一个
flex-grow的有效值:此时简写会扩展为flex: <flex-grow> 1 0。 - 一个
flex-basis的有效值:此时简写会扩展为flex: 1 1 <flex-basis>。 - 关键字
none或者全局关键字之一。
- 一个
-
双值语法:
-
第一个值必须是一个
flex-grow的有效值。 -
第二个值必须是以下之一:
- 一个
flex-shrink的有效值:此时简写会扩展为flex: <flex-grow> <flex-shrink> 0。 - 一个
flex-basis的有效值:此时简写会扩展为flex: <flex-grow> 1 <flex-basis>。
- 一个
-
-
三值语法:值必须按照以下顺序指定:
- 一个
flex-grow的有效值。 - 一个
flex-shrink的有效值。 - 一个
flex-basis的有效值。
- 一个
取值
initial:
元素会根据自身宽高设置尺寸。它会缩短自身以适应 flex 容器,但不会伸长并吸收 flex 容器中的额外自由空间来适应 flex 容器。相当于将属性设置为flex: 0 1 auto。auto:
元素会根据自身的宽度与高度来确定尺寸,但是会伸长并吸收 flex 容器中额外的自由空间,也会缩短自身来适应 flex 容器。这相当于将属性设置为flex: 1 1 auto。none:
元素会根据自身宽高来设置尺寸。它是完全非弹性的:既不会缩短,也不会伸长来适应 flex 容器。相当于将属性设置为flex: 0 0 auto。flex-grow:
定义 flex 项目的flex-grow。负值无效。省略时默认值为1。 (初始值为0)flex-shrink:
定义 flex 元素的flex-shrink。负值无效。省略时默认值为1。 (初始值为1)flex-basis:
定义 flex 元素的flex-basis属性。若值为0,则必须加上单位,以免被视作伸缩性。省略时默认值为0。(初始值为auto)
评论区