起因

工作以后由于大量使用到了flex布局而碰到了一些尚不清楚的问题,以及一些有意思的特性,在此写篇博客记录一下。

flex三个值的含义

众所周知,flex布局所有的属性有两种:一种作用在弹性容器(Flex container)上,一种作用在弹性项目(Flex item)上,而flex就是作用在弹性项目上的属性。

flexflex-growflex-shrinkflex-basis 三个值的简写,这个值规定了弹性项目如何伸长或压缩以适应弹性容器中的可用空间。

flex-grow 定义弹性项目的放大比列,可以接受数字(小数也可以),不接受负值,默认值是 0 。这个值如果为 0 就意味着即使容器内还存在剩余空间,弹性项目也不会放大。

flex-shrink 定义弹性项目的收缩比例,同样接受数字(小数也可以),不接受负值,默认值是 1 。如果一个弹性项目的 flex-shrink 设为 0 而其他弹性项目的 flex-shrink 值为 1 ,则当弹性容器空间不足时,该弹性项目不会被压缩,而其他的弹性项目会被等比例压缩。

flex-basis 定义在分配容器内空间之前,弹性项目占据的主轴空间(不一定是宽度,因为主轴方向可以是纵向的),默认值是 auto 。如果对弹性项目同时设置 flex-basiswidthwidth 会被忽略。还要注意当主轴是横向的时候,如果设定了 max-widthmin-width 会限制弹性项目的宽度。

这里讲一下 flex-basis 取值的情况:

  • 指定的数值,比如以px、em为单位的数值。
  • 百分数,取百分数的话就是相对其父弹性容器的宽或高(取决于主轴方向)来计算,如果包含块的尺寸未指定(也就是说父元素的尺寸取决于子元素),那么这时候结果和 auto 一样。
  • auto 值的意思是基于弹性项目的 widthheight 调整大小(根据主轴的横向或者纵向),如果没有设置 widthheight 则根据内容自适应。

设置flex之后的弹性项目如何计算宽度

这里给一个代码的例子

<div id="content">
<div class="box1" style="background-color:red;">A</div>
<div class="box2" style="background-color:lightblue;">B</div>
<div class="box3" style="background-color:yellow;">C</div>
</div>
#content {
display: flex;
width: 360px;
} .box1 {
width: 100px;
flex: 1 1 0;
} .box2 {
width: 100px;
flex: 1 1 0;
} .box3 {
width: 100px;
flex: 1 1 0;
}

由于flex-basis的值为 0 ,所以此时弹性容器的剩余空间为 360px - 0 * 3 = 360px ,由于3个元素都设置了 flex-grow: 1 ,所以剩余空间3个元素所占比例为 1:1:1 ,每个元素的宽度就是 360px / 3 = 120px

如果把代码改一下呢?

#content {
display: flex;
width: 360px;
} .box1 {
width: 100px;
flex: 1 1 0;
} .box2 {
width: 100px;
flex: 1 1 auto;
} .box3 {
flex: 1 1 200px;
}

此时,弹性容器内剩余宽度为:360px - 0 - 100px - 200px = 60px,3个元素所占剩余空间比例同样是 1:1:1 。那么宽度分别就是:0 + 20px = 20px100px + 20px = 120px200px + 20px = 220px

对应复杂情况的计算,这里有一个回答写得不错:

flex设置成1和auto有什么区别

flex单值、双值、三值的赋值规则是怎么样的

单值情况下:

  • 一个无单位的数字:它会被当作 flex-grow 的值,flex-shrink 为 1 ,flex-basis 为 0%。
  • 一个有效的宽度值:它会被当作 flex-basis 的值,flex-shrinkflex-grow 都是 1 。
  • 关键字:比如 autonone 这两个下文会讲。

双值情况下:

第一个值必须是无单位的数字,它会作为 flex-grow 的值;第二个值可以是:

  • 一个无单位的数字:它会被当作 flex-shrink 的值,而flex-basis 的值就是 0% 。
  • 一个有效的宽度值:它会被当作 flex-basis 的值,flex-shrink 的取值就是 1 。

三值情况下:

第一个和第二个值必须是无单位的数,分别作为 flex-growflex-shrinkflex-basis 的值;第三个值可以是有效的宽度值,也可以是 auto

flex: 0,flex: 1,flex: auto,flex: none,flex: 0%的区别是什么?

讲完了上面的三种赋值方式之后,那么简写就变得很容易理解了:

  • flex: 0flex: 0 1 0% 的简写
  • flex: noneflex: 0 0 auto 的简写
  • flex: 1flex: 1 1 0% 的简写
  • flex: autoflex: 1 1 auto 的简写
  • flex: 0%flex: 1 1 0% 的简写

小结一下:以上就是对 flex 这个属性取值的梳理,最近一年没有写过博客,最近还是要填一下坑的,前端之路且歌且行~

原文地址:https://segmentfault.com/a/1190000016899455

谈一谈flex布局使用中碰到的一些问题的更多相关文章

  1. flex布局浅谈

    flex布局浅谈和实例 阿基米德曾说给我一个支点我可以撬动地球,而拥有flex基本可以撬动所有的布局. 1.flex布局基本介绍及效果展示 工欲善其事必先利其器,来来来,一起看下基础知识先(呵~,老掉 ...

  2. 浅谈CSS3中display属性的Flex布局

    浅谈CSS3中display属性的Flex布局   最近在学习微信小程序,在设计首页布局的时候,新认识了一种布局方式display:flex 1 .container { 2 display: fle ...

  3. flex布局浅谈和实例

    阿基米德曾说给我一个支点我可以撬动地球,而拥有flex基本可以撬动所有的布局. 1.flex布局基本介绍及效果展示 工欲善其事必先利其器,来来来,一起看下基础知识先(呵~,老掉牙,但是有用啊). ** ...

  4. 浅谈flex布局中小技巧

    最近有个面试,面试官问到,在一个横向布局上,假设有三个div,每个宽度为定宽apx,如果想使两侧宽度为x,中间div间间隔为2x.x可以自适应.如下图: 怎么做很简单,两行代码就搞定:   justi ...

  5. 【分享】谈CSS3中display属性的flex布局

    最近在学习微信小程序(重新学习微信小程序),在设计首页布局的时候,新认识了一种布局方式display:flex .guide-top{ height: 36%; display: flex; /*fl ...

  6. 浅谈flex布局

    Flex布局,俗称弹性布局,有了这个布局,咱们做的事情很多,以前那些很难实现比如说垂直居中之类都不存在了. 盒模型布局依赖于float,display,定位之类的方式来布局,这种的布局对一些特殊布局来 ...

  7. 浅谈css的栅格布局

    栅格布局想必大家都很了解,我们做页面开发的时候,往往对页面板式的要求很高,如何对各个区域的内容排版,并使之对齐是我们的一大难题.而栅格系统就是我们排版的利器,他支持自动对齐.自动计算边距.流式布局等优 ...

  8. 小白入门篇:flex布局

    --前言 因为这个星期写一个小的项目用到flex布局和grid布局,虽然这两种布局都是兼容性都有问题,但是别急,我觉的以后肯定是会发展并且流行起来的,毕竟google大法好,而且这两个布局真的比一般的 ...

  9. 一篇文章弄懂flex布局

     壹 ❀ 引 谈到flex布局,我不知道有多少人跟我一样,在本能的想到justify-content:center与align-items:center两条属性之后,除此之外的其它属性居然显得格外陌生 ...

随机推荐

  1. bzoj 3613: [Heoi2014]南园满地堆轻絮【二分+贪心】

    二分答案w,然后判断的时候维护一个mx,扫描序列,先更新mx=max(mx,a[i]-w),然后如果a[i]+w<mx的话就是说这个位置即使升到极限并且前面降到极限也不能符合条件了 #inclu ...

  2. P2579 [ZJOI2005]沼泽鳄鱼

    传送门 话说邻接矩阵居然还能快速幂的么-- 把原图的邻接矩阵\(G\)打出来,那么\(G[u][v]\)表示一秒后\(u\)到\(v\)的方案数,\(G^2[u][v]\)表示\(2\)秒后的方案数- ...

  3. 状压dp小结 By cellur925

    会一直慢慢写的... 一.一些技巧(位运算) 取出整数n在二进制表示下的第k位,检验是否为1---(n>>k)&1 求最后完备状态(假设都是1),有n个待枚举状态,结果是(1< ...

  4. C# BitmapData和Marshal.Copy()用法

    C# BitmapData和Marshal.Copy()用法 //此函数用法例子如下: public static byte[] GetGrayArray(Bitmap srcBmp, Rectang ...

  5. 跟我一起玩Win32开发(8):绘图(A)

    从本篇开始,我就不吹牛皮,那就吹吹兔皮吧.说说与绘图有关的东东. 要进行绘制,首先要得到一个DC,啥是DC呢?按字面翻译叫设备上下文,也可以翻译为设备描述表,它主要指API为我们封装了一些与显示设备相 ...

  6. 洛谷 P3810 【模板】三维偏序(陌上花开) (cdq分治模板)

    在solve(L,R)中,需要先分治solve两个子区间,再计算左边区间修改对右边区间询问的贡献. 注意,计算额外的贡献时,两子区间各自内部的顺序变得不再重要(不管怎么样左边区间的都发生在右边之前), ...

  7. 学习JavaScript数据结构与算法 (一)

    学习JavaScript数据结构与算法 的笔记, 包含一二三章 01基础 循环 斐波那契数列 var fibonaci = [1,1] for (var i = 2; i< 20;i++) { ...

  8. 关于MyBatis的两种写法

    刚接触MyBatis是在Jike的视频中学习的,但是之后又发现和项目中的MyBatis的用法不太一致.上网找了好多资料,发现网上的教程分为两种写法: 第一种,是jike视频中的写法,写好map.xml ...

  9. PV,UV,IP概念

    PV是网站分析的一个术语,用以衡量网站用户访问的网页的数量.对于广告主,PV值可预期它可以带来多少广告收入.一般来说,PV与来访者的数量成正比,但是PV并不直接决定页面的真实来访者数量,如同一个来访者 ...

  10. 01_C++学习笔记_入门

    1.float类型只能表示数字里面的前6位或者前7位.也就是说c++只能保证float类型的数字的前6位是正确的.如果要求的精度更高的话,请使用double和long double. float精度是 ...