作者:Ahmad shaded
译者:前端小智
起源:sitepoint
挪动端浏览:https://mp.weixin.qq.com/s/Tw…
点赞再看,微信搜寻 【大迁世界】 关注这个没有大厂背景,但有着一股向上踊跃心态人。本文
GitHub
https://github.com/qq44924588… 上曾经收录,文章的已分类,也整顿了很多我的文档,和教程材料。
大家都说简历没我的项目写,我就帮大家找了一个我的项目,还附赠【搭建教程】。
你有没有想过 CSS 中的 flex
属性如何工作?它是 flex-grow
,flex-shrink
和 flex-basis
的简写。开发中最常见的写法是flex:1
,它示意 flex 我的项目扩大并填充可用空间。
接下来,咱们来具体看看它示意是什么意思。
flex-grow 属性
flex-grow
属性定义我的项目的放大比例,默认为 0
,即如果存在残余空间,也不放大。flex-grow
的值只承受一个整数。思考上面代码:
<div class="wrapper">
<div class="item item-1"></div>
<div class="item item-2"></div>
<div class="item item-3"></div>
</div>
.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 的一个常见用例是用户组件,头像和文本内容应该在同一行。
<div class="user">
<img class="user__avatar" src="shadeed.jpg" alt="" />
<div>
<h3>Ahmad Shadeed</h3>
<p>Author of Debugging CSS</p>
</div>
</div>
.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 做到这一点。
<div class="card">
<img src="thumb.jpg" alt="">
<h3 class="card__title">Title short</h3>
<time class="card__date"></time>
</div>
通过设置 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…
当内容大于其包装器时
不久前,我收到一个读者的问题,他的问题如下。如图所示,两个图像应保留在其包装的边界内。
.wrapper {display: flex;}
.wrapper img {flex: 1;}
这里,即便 应用了 flex: 1
,图像依然会溢出。依据 CSS 标准:
默认状况下,flex 我的项目不会放大到其最小内容大小(最长的单词或固定大小的元素的长度)以下。要更改此设置,请设置
min-width
或min-height
属性。
下面状况,是因为图片太大,flexbox
不会放大图片。要更改此行为,咱们须要设置以下内容:
.wrapper img {
flex: 1;
min-width: 0;
}
代码部署后可能存在的 BUG 没法实时晓得,预先为了解决这些 BUG,花了大量的工夫进行 log 调试,这边顺便给大家举荐一个好用的 BUG 监控工具 Fundebug。
原文:https://ishadeed.com/article/…
交换
文章每周继续更新,能够微信搜寻 【大迁世界】 第一工夫浏览,回复 【福利】 有多份前端视频等着你,本文 GitHub https://github.com/qq449245884/xiaozhi 曾经收录,欢送 Star。