百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

深入了解 Flex 属性(flex-flow属性)

myzbx 2025-01-26 23:28 26 浏览

你有没有想过 CSS 中的 flex属性如何工作?它是 flex-grow,flex-shrink和flex-basis的简写。开发中最常见的写法是flex:1,它表示 flex 项目扩展并填充可用空间。

接下来,我们来详细看看它表示是什么意思。

flex-grow 属性

flex-grow属性定义项目的放大比例,默认为0,即如果存在剩余空间,也不放大。flex-grow的值只接受一个整数。考虑下面代码:


??
??
??
.wrapper?{
????display:?flex;
????flex-wrap:?wrap;
}

.item?{
????flex-grow:?1;
}

注意:flex-grow会影响宽度或高度,具体取决于flex-direction属性。对于以下示例,默认的flex-direction的值都是row。

在不使用flex-grow的情况下,flex 项目的宽度将默认为其初始宽度。但是,使用flex-grow: 1时,flex 项目会平均剩余可用的空间。

你可能想知道,flex 项目之间的空间是如何分配的?嗯,这是个好问题,稍后会回答。

在下面的图中,是没有使用flex-grow情况。换句话说,这是它们的自然大小。

要了解 flex 项目宽度的计算方式,可以参考下面的公式。

我们来计算一下文本是 CSS 的项目宽度。

项目宽度 = (( flex-grow / flex-grow 总个数) * 可用空间)+ 初始项目宽度

多个 flex-grow 值

在前面的示例中,所有flex项目的flex-grow值都相同。现在我们把第一项的flex-grow值改为2。这们它又是如何计算?请注意,本示例的可用空间为498px

上图已经解释的很清楚,这里就不在啰嗦了,还不懂的,可以多看几次。

可以用0作为flex-grow的值吗?

当然可以!因为flex-grow属性接受整数值,所以可以使用0,可以防止 flex 项目占用可用空间的一种方式。

这在边界情况下非常有用,我们希望使 flex 项目保持其初始宽度。

flex-grow 不能让 flex 项目相等

有一个常见的误解,使用flex-grow会使项目的宽度相等。这是不正确的,flex-grow的作用是分配可用空间。正如在公式中看到的,每 flex 项目的宽度是基于其初始宽度计算的(应用flex-grow之前的宽度)。

如果你想让项目的宽度相等,可以使用flex-basis,这个在接下来的部分会对此进行讲解。

flex-shrink 属性

flex-shrink属性定义了项目的缩小比例,默认为1,即如果空间不足,该项目将缩小。

考虑下面的例子:中间的项目宽度为300px,flex-shrink的值为```。如果没有足够的空间来容纳所有的项目,则允许项目缩小宽度。

.item-2?{
????width:?300px;
????flex-shrink:?1;
}

在下列条件下,浏览器会保持项目宽度为300px:

下面是项目在不同视口大小下的行为。

如图所示,在视口宽度大于300px时,宽度为300px,少于 300px,该项目的宽度就被压缩成跟视口一样的宽度。

flex-basis 属性

flex-basis属性定义了在分配多余空间之前,项目占据的主轴空间(main size)。浏览器根据这个属性,计算主轴是否有多余空间。它的默认值为auto,即项目的本来大小。

flex-basis可以设为跟width或height属性一样的值(比如350px,默认值为 auto),则项目将占据固定空间。

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

在上面的例子中,第一项的宽度为50%。这里需要将flex-grow重置为0,以防止项目宽度超过50%。

如果将 flex-basis 设置为 100%,会怎么样?该项目单独占一行,其他项目将换行。

flex 属性

flex属性是flex-grow, flex-shrink 和 flex-basis的简写,默认值为0 1 auto。后两个属性可选。这也说 flex 项目会根据其内容大小增长

flex 项目相对大小

.item?{
????/*?默认值,相当于 flex:1 1 auto */
????flex:?auto;
}

flex 项目的大小取决于内容。因此,内容越多的flex项目就会越大。

flex 项目绝对大小

相反,当flex-basis属性设置为0时,所有flex项目大小会保持一致。

.item?{
????/*?相当于??flex:?1?1?0%?*/
????flex:?1;
}

我喜欢 flex 属性的几个点!

顾名思义,此属性可以灵活使用其值。请看下面的例子。

一个值的情况

.item?{
????flex:?1;
}

上面默认对应的值是 1 1 0,也就是 flex-grow: 1,flex-shrink:1, flex-basic: 0。

两个值的情况

.item?{
????flex:?1?1;
}

上面对应的值是 1 1 0,也就是 flex-grow: 1,flex-shrink:1, flex-basic: 0。

一个长度值

如果 flex 值是一个长度值,这会作用于flex-basis。flex-grow和flex-shrink默认为1。

.item?{
????flex:?100px;
????/*?flex:?1?1?100px?*/
}

使用无单位0

有时,你想把 felx-basis 设置为 0,你可能会这样写:

.item?{
????flex:?0;
}

不建议这样做,因为让开发人员和浏览器感到困惑。你到底是要把 flex-grow 或者 flex-shirnk 设置为 0,还是将 flex-basis 设置为 0。

所以,你应该添加一个单位,如px或%。

.item?{
????flex:?0%;
????/*?flex:?1?1?0%?*/
}

建议使用 flex 简写属性

当你需要设置grow、shrink和basis时,最好使用flex属性来实现这个目的。

根据 CSS 规范:

建议开发者使用?`flex`?简写来控制灵活性,而不是直接使用它的普通属性,因为简写的可以正确地重置任何未指定的组件以适应常见情景。

flex 用例

用户头像

flexbox 的一个常见用例是用户组件,头像和文本内容应该在同一行。


?
?
??

Ahmad?Shadeed

??

Author?of?Debugging?CSS

?
.user?{
????display:?flex;
????flex-wrap:?wrap;
????align-items:?center;
}

.user__avatar?{
????flex:?0?0?70px;
????width:?70px;
????height:?70px;
}

上面为 头像 添加了 flex:0 0 70px。如果这里不这样设置,在某些旧版浏览器,图像看起来像被压缩的一样。除此之外,flex 的优先级高于width属性(flex-direction: row)或height(flex-direction: column)。

如果我们仅通过调整flex属性来改变头像的大小,那么width将被浏览器忽略。

.user__avatar?{
????/*?width?是?100px,?不是?70px?*/
????flex:?0?0?100px;
????width:?70px;
????height:?70px;
}

头部

如果想让一个标题填满所有可用的空间,使用flex: 1非常适合这种情况。

.page-header?{
????display:?flex;
????flex-wrap:?wrap;?
}

.page-header__title?{
????flex:?1;
}

输入框

form?{
????display:?flex;
????flex-wrap:?wrap;?
}

input?{
????flex:?1;
????/*?Other?styles?*/
}

在两张卡片上对齐最后一项

假设CSS grid具有两列布局。这里的问题是日期没有对齐,它们应该在同一条线上(红色那条)。

我们可以使用flexbox做到这一点。


?
?Title?short
?

通过设置flex-direction: column,我们可以在标题上使用flex-grow使其填充可用空间,这样,即使标题很短也将日期保留在末尾。

.card?{
????display:?flex;
????flex-direction:?column;
}

/*?第一个解决方案?*/
.card__title?{
????flex-grow:?1;
}

同样,无需使用flex-grow也可实现,我们使用margin-top: auto

/*?第二个解决方案*/
.card__date?{
????margin-top:?auto;
}

用例 - 多个 flex 属性

这里的意思是使用flex-grow或flex-shrink,但值不为1。在本节中,我们会探讨一些可以将其合并的想法。

footer

像上面这样的布局, 我们可以这样写:

.actions?{
????display:?flex;
????flex-wrap:?wrap;
}

.actions__item?{
????flex:?2;
}

.actions__item.user?{
????flex:?1;
}

扩展动画

我们可以做的一件有趣的事情是在悬停时为flex项目设置动画。这很有用的,下面是一个简单的例子:

.palette?{
????display:?flex;
????flex-wrap:?wrap;
}

.palette__item?{
????flex:?1;
????transition:?flex?0.3s?ease-out;
}

.palette__item:hover?{
????flex:?4;
}

增加的用户体验

源码:
https://codepen.io/shshaw/pen/EbjvbQ

当内容大于其包装器时

不久前,我收到一个读者的问题,他的问题如下。如图所示,两个图像应保留在其包装的边界内。

.wrapper?{
????display:?flex;
}

.wrapper?img?{
????flex:?1;
}

这里,即使 使用了 flex: 1,图像仍然会溢出。根据CSS规范:

默认情况下,flex 项目不会缩小到其最小内容大小(最长的单词或固定大小的元素的长度)以下。要更改此设置,请设置min-width或min-height属性。

上面情况,是由于图片太大,flexbox不会缩小图片。要更改此行为,我们需要设置以下内容:

.wrapper?img?{
????flex:?1;
????min-width:?0;
}

作者:Ahmad shaded 译者:前端小智 来源:sitepoint

原文:
https://ishadeed.com/article/css-flex-property/

相关推荐

C语言备忘录 - 09. 数组与字符串(c语言数组字符串长度)

C语言支持数组数据结构,它可以存储一个固定大小的相同类型元素的顺序集合。数组都是由连续的内存位置组成。最低的地址对应第一个元素,最高的地址对应最后一个元素。一、数组定义/*定义一个一维数组数...

Java 读取 xml 文件的五种方式(java读取xml工具类)

1、Java读取xml文件的五种方式在Java中读取XML文件有多种方法,这里列出五种常见的方式:DOM解析器(DocumentObjectModel):DOM是处理XML文...

如何获取一个APP的所有接口API和参数签名信息?

先给出所需的工具:步骤工具/技术抓包Charles、Fiddler、Wireshark、tcpdump反编译Jadx、JEB、Apktool动态调试Frida、IDAPro、Unidbg/Unico...

编辑距离算法详解:Levenshtein Distance算法

算法基本原理:假设我们可以使用d[i,j]个步骤(可以使用一个二维数组保存这个值),表示将串s[1…i]转换为串t[1…j]所需要的最少步骤个数,那么,在最基本的情况下,即在i等...

RTCP协议详解(SR、RR、SDES、BYE、APP、NACK、TCC、PLI、SLI)

RTCP协议规范中定义了五种类型的RTCP包:接收方报告(RR)、发送方报告(SR)、源描述(SDES)、成员管理(BYE)和应用程序定义(APP)。SR:payload...

javascript实现获取中文汉字拼音首字母

今天分享一个日常开发中可能会用到的一个小功能,简单说就是输入中文汉字可转换得到中文汉字拼音首字母。当然我可写不出这样的功能,源码来自于其他民间大神的分享,博主在此记录一下功能demo,方便日后复用,同...

记一次前端逻辑绕过登录到内网挖掘

前言在测试一个学校网站的时候发现一个未授权访问内网系统,但是这个未授权并不是接口啥的,而是对前端js的审计和调试发现的漏洞,这里给大家分享一下这次的漏洞的过程文章中涉及的敏感信息均已做打码处理,文...

Node.js 是怎么找到模块的?(node.js有哪些模块)

大家好,我是前端西瓜哥,今天我们来看看Node.js模块查找的原理。模块种类模块有三种来源。核心模块:Node.js内置的包。比如http、fs、path;自定义模块:NPM包。比如axi...

细节确定成败!全网最详细的xxs夸脚本攻击以及测试方法(上)

XSS全称是CrossSiteScripting也是跨站脚本,他也分为三种类型存储型,反射型,DOM型。当目标网站目标用户浏览器渲染HTML文档的过程中,出现了不被预期的脚本指令并执行时,XSS就...

简单易懂的KMP字符串匹配算法(实现kmp字符串匹配)

什么是KMPKMP算法是Knuth、Morris和Pratt三人设计的线性时间字符串匹配算法。算法的核心思想是尽可能地利用已知信息,减少尝试匹配的次数,从而降低时间复杂度。要想彻底地弄懂KMP算法,需...

golang标准库每日一库之strings(golang 字符串操作)

以下为Go语言strings包的深度解析,涵盖字符串切割、替换、查找等核心操作及高效处理技巧:一、基础字符串操作1.字符串切割(Split)函数作用描述示例strings.Split(s,s...

开源轻量级BT下载器qBittorrent 5.1.1发布:改进Wayland会话

IT之家6月24日消息,科技媒体9to5Linux昨日(6月23日)发布博文,报道称开源轻量级BT下载器qBittorrent发布5.1.1版本更新,主要改进支持Lin...

晨雾轻散时!2 道 JS 面试题细解,静享知识慢时光

清晨的雾气渐渐散去,阳光透过纱窗洒在桌前,泡一杯温热的蜂蜜水,让我们在这宁静的氛围里,以轻松的节奏聊聊两道JavaScript高频面试题。就像在晨光中散步,不急不躁地探索知识,让学习成为一种治愈的...

JS 写正则表达式,判断是否为手机号

以下是使用JavaScript写正则表达式,判断一个字符串是否为手机号的示例代码:在上述代码中,我们定义了一个isPhoneNumber函数,该函数接收一个字符串作为参数,使用正则表达式判断该...

不用任何 js 库,纯前端导出数据到 Excel / CSV 文件就简单几行代码

最近实现的导出数据为表格的需求,不需要工具库,也不要后端实现,mark一下。js导出excel表格最近工作中又遇到了将表格数据导出为excel表格的需求,我第一时间想到的是之前我的网站上推...