flex:1;详解

本文深入解析Flex布局中flex属性的多种取值方式及其效果,包括默认值、none、auto及不同组合形式,阐述了flex-basis属性对子元素基准值的影响,并通过实例说明不同值的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先明确一点是, flex 是 flex-grow、flex-shrink、flex-basis的缩写。故其取值可以考虑以下情况:

flex 的默认值是以上三个属性值的组合。假设以上三个属性同样取默认值,则 flex 的默认值是 0 1 auto。同理,如下是等同的:

.item {flex: 2333 3222 234px;}
.item {
    flex-grow: 2333;
    flex-shrink: 3222;
    flex-basis: 234px;
}

当 flex 取值为 none,则计算值为 0 0 auto,如下是等同的:

.item {flex: none;}
.item {
    flex-grow: 0;
    flex-shrink: 0;
    flex-basis: auto;
}

当 flex 取值为 auto,则计算值为 1 1 auto,如下是等同的:

.item {flex: auto;}
.item {
    flex-grow: 1;
    flex-shrink: 1;
    flex-basis: auto;
}

当 flex 取值为一个非负数字,则该数字为 flex-grow 值,flex-shrink 取 1,flex-basis 取 0%,如下是等同的:

.item {flex: 1;}
.item {
    flex-grow: 1;
    flex-shrink: 1;
    flex-basis: 0%;
}

当 flex 取值为一个长度或百分比,则视为 flex-basis 值,flex-grow 取 1,flex-shrink 取 1,有如下等同情况(注意 0% 是一个百分比而不是一个非负数字):

.item-1 {flex: 0%;}
.item-1 {
    flex-grow: 1;
    flex-shrink: 1;
    flex-basis: 0%;
}
.item-2 {flex: 24px;}
.item-1 {
    flex-grow: 1;
    flex-shrink: 1;
    flex-basis: 24px;
}

当 flex 取值为两个非负数字,则分别视为 flex-grow 和 flex-shrink 的值,flex-basis 取 0%,如下是等同的:

.item {flex: 2 3;}
.item {
    flex-grow: 2;
    flex-shrink: 3;
    flex-basis: 0%;
}

当 flex 取值为一个非负数字和一个长度或百分比,则分别视为 flex-grow 和 flex-basis 的值,flex-shrink 取 1,如下是等同的:

.item {flex: 2333 3222px;}
.item {
    flex-grow: 2333;
    flex-shrink: 1;
    flex-basis: 3222px;
}

flex-basis 规定的是子元素的基准值。所以是否溢出的计算与此属性息息相关。flex-basis 规定的范围取决于 box-sizing。这里主要讨论以下 flex-basis 的取值情况:

  • auto:首先检索该子元素的主尺寸,如果主尺寸不为 auto,则使用值采取主尺寸之值;如果也是 auto,则使用值为 content。

  • content:指根据该子元素的内容自动布局。有的用户代理没有实现取 content 值,等效的替代方案是 flex-basis 和主尺寸都取 auto。

  • 百分比:根据其包含块(即伸缩父容器)的主尺寸计算。如果包含块的主尺寸未定义(即父容器的主尺寸取决于子元素),则计算结果和设为 auto 一样。

举一个不同的值之间的区别:

<div class="parent">
    <div class="item-1"></div>
    <div class="item-2"></div>
    <div class="item-3"></div>
</div>
 
<style type="text/css">
    .parent {
        display: flex;
        width: 600px;
    }
    .parent > div {
        height: 100px;
    }
    .item-1 {
        width: 140px;
        flex: 2 1 0%;
        background: blue;
    }
    .item-2 {
        width: 100px;
        flex: 2 1 auto;
        background: darkblue;
    }
    .item-3 {
        flex: 1 1 200px;
        background: lightblue;
    }
</style>

显示效果:
这里插入图片描述](https://img-blog.csdnimg.cn/20190126164241570.png)
主轴上父容器总尺寸为 600px

子元素的总基准值是:0% + auto + 200px = 300px,其中

  • 0% 即 0 宽度
  • auto 对应取主尺寸即 100px

故剩余空间为 600px - 300px = 300px

伸缩放大系数之和为: 2 + 2 + 1 = 5

剩余空间分配如下:

  • item-1 和 item-2 各分配 2/5,各得 120px
  • item-3 分配 1/5,得 60px

各项目最终宽度为:

  • item-1 = 0% + 120px = 120px
  • item-2 = auto + 120px = 220px
  • item-3 = 200px + 60px = 260px

当 item-1 基准值取 0% 的时候,是把该项目视为零尺寸的,故即便声明其尺寸为 140px,也并没有什么用,形同虚设

而 item-2 基准值取 auto 的时候,根据规则基准值使用值是主尺寸值即 100px,故这 100px 不会纳入剩余空间

### CSS `display: flex` 属性详解 #### 定义与基本概念 `display: flex` 是一种用于创建灵活布局的方式,能够更方便地设计响应式的网页结构。当容器设置此属性后,其子元素会自动成为弹性盒子模型中的项目,并遵循一系列特定的行为规则[^1]。 #### 基本语法 要使某个HTML元素作为Flexbox容器,只需简单地将其样式表中的`display`属性设为`flex`: ```css .container { display: flex; } ``` 这行简单的声明即可开启强大的布局能力。 #### 主轴与交叉轴的概念 在理解具体属性之前,先来认识两个重要术语——主轴(main axis) 和 交叉轴(cross axis),它们定义了项目的排列方向。默认情况下: - **主轴**是从左到右; - **交叉轴**则是从上至下; 可以通过改变某些属性来自由调整这两个维度的方向。 #### 关键属性介绍 ##### Flex Container Properties (作用于父级) ###### flex-direction 决定主轴的方向以及项目的排列顺序,默认值为row即横向排布。其他可能取值包括column(纵向)、row-reverse(反向横排)和column-reverse(反向纵排)。例如: ```css .container { flex-direction: row | column | row-reverse | column-reverse; } ``` ###### justify-content 控制沿主轴上的空间分配方式,影响的是每项之间的间距分布情况。常见选项有start、end、center、space-between、space-around等。比如让所有子元素居中显示可以这样写: ```css .container { justify-content: center; } ``` ###### align-items 设定侧轴上的对齐模式,适用于整个容器内的所有项目。可用参数如stretch(拉伸填充剩余空间),flex-start(顶部对齐),flex-end(底部对齐),center(垂直居中)等等。如果希望所有的孩子都位于中间位置则应采用下面的形式: ```css .container { align-items: center; } ``` ##### Flex Item Properties (作用于子级) ###### order 指定项目的排序次序,默认数值为0,越小越靠前。通过修改这个值可以让不同级别的组件按照需求重新排序而不必改动DOM树的位置关系。 ###### flex-grow 决定了该项目在其所在行内未被占用的空间里所占的比例大小。接受任意非负实数输入,缺省状态下等于零意味着不增长也不收缩。 ###### flex-shrink 规定缩小因子,在总宽度不足时按比例减少尺寸以适应容器边界。同样是一个正整型常量,默认也是0表示不允许压缩。 ###### flex-basis 初始长度或宽高基数,通常配合百分比单位一起使用以便更好地实现自适应效果。 ###### align-self 允许单独配置某一项相对于兄弟节点的不同对齐策略,从而覆盖掉全局性的`align-items`设定。有效枚举列表包含auto、flex-start、flex-end、center、baseline、stretch六种情形之一[^2]。 #### 实际案例解析 考虑这样一个例子:构建一个具有左侧固定栏加右侧动态变化区域的页面框架。这里就可以利用上述提到的知识点轻松搞定! ```html <div class="main-content"> <div class="left-content"></div> <div class="right-content"></div> </div> ``` 对应的CSS代码片段如下所示: ```css .main-content { width: 100%; height: 100%; background-color: #72f884; display: flex; /* 启动弹性盒 */ } .left-content { box-sizing: border-box; width: 200px; height: 100%; background-color: rgb(238, 119, 34); } .right-content { box-sizing: border-box; flex: 1; height: 100%; background-color: rgb(68, 133, 255); } ``` 这段样例展示了如何借助`display: flex`快速搭建起两列式布局方案,其中左边部分保持定宽而右边随窗口缩放自动调节自身范围。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值