首页 > 其他分享 >Flex布局的三个属性要深刻理解!

Flex布局的三个属性要深刻理解!

时间:2023-10-11 13:06:54浏览次数:45  
标签:Flex flex 元素 100px 宽度 left 属性 深刻理解 200px

在我们日常开发中,flex布局可以说是家常便饭,对于很多的我们来说(你懂得^_^),可能我们用的比较多的应该就是垂直居中里,也就是下面这段代码:

.flex-box{
  display: flex;
  justify-content: center;
  align-items: center;
}

写的非常好(^_^)!然后我们都知道这个是定义在父元素的,布局效果是在子元素生效的!对吧!但是我们有没有想过这样的问题?

  • 假如所有子元素宽度之和大于父元素的宽度时,这时候的子元素会如何变化?
  • 假如所有子元素宽度之和小于父元素的宽度时,这时候的子元素又会如何变化?

我们先不管这两个问题是怎么样,又是怎么解决的!我们先来了解一下flex-growflex-shrinkflex-basis这三个元素是个啥,又是怎么用,下面我们一起来学习学习!

1 flex-grow

  • flex-grow:grow的中文意思是扩大,用来分配父元素剩余空间的相对比例。默认值为0。我们先看一个例子:
/* 父元素 */
.flex-box{
    display: flex;
    width: 300px;
    height: 300px;
    margin:0 auto;
    background-color: #000;
}

/* 子元素left */
.left{
    flex-grow: 1;
    width: 100px;
    background-color: orange;
}
/* 子元素right */
.right{
    flex-grow: 0;
    width:100px;
    background-color: cyan;
}

上面我们可以看出子元素left和right的宽度之和为200px,而父元素宽度为300px,也就是说父元素还有空余空间,而真正的效果如图所示。

Flex布局的三个属性要深刻理解!_css

 我们会发现子元素left的宽度会变成200px,这就是flex-grow的作用了,flex-grow为0不做处理,而left盒子的flex-grow为1。也就是剩余宽度空间全部分配给了left盒子,假如flex-grow属性变成这样呢?

/* 子元素left */
.left{
    ...
    flex-grow: 3;
    ...
}
/* 子元素right */
.right{
    ...
    flex-grow: 1;
    ...
}

这样处理的话也就是剩余空间按照left:right为3:1处理,多出来的空间:300px-(100px+100px)=100px;left的宽度:100px+100px*(100px*3/(100*3+100*1)) = 175px;right的宽度:100px+100px*(100px*1/(100*3+100*1)) = 125px;这就解析了当所有子元素宽度之和小于父元素宽度之和时,子元素如何处理?这个问题了。

注意地,如果所有子元素的flex-grow的值是一样的话,那么剩余空间就按照平均分配。

Flex布局的三个属性要深刻理解!_宽高_02

2 flex-shrink

  • flex-shrink:shrink的中文意思是收缩,用来指定flex元素的收缩规则。默认值为1。我们先看一个例子:
/* 父元素 */
.flex-box{
    display: flex;
    width: 300px;
    height: 300px;
    ...
}
/* 子元素left */
.left{
    flex-shrink: 3;
    width: 200px;
    background-color: orange;
}
/* 子元素right */
.right{
    flex-shrink: 1;
    width:200px;
    background-color: cyan;
}

Flex布局的三个属性要深刻理解!_默认值_03

 首先,所有子元素宽度之和大于父元素宽度(200px+200px>300px)。由于父元素的宽高都是固定的,所以不能撑大父元素,只能缩小子元素。子元素flex-shrink的比为3:1,所以子元素left的宽度为:200px-100px*(200px*3/(200px*3+200px*1)) = 125px;子元素right的宽度为:200px-100px*(200px*1/(200px*3+200px*1)) = 175px;这样也就解析了当所有子元素的宽度和大于父元素宽度和的时候,子元素是如何处理的这个问题的了。

3 flex-basis

  • flex-basis:basis的中文意思是基准,用来指定子元素内容盒尺寸大小。默认值为auto。我们先看一下下面这个例子:
.flex-box{
        display: flex;
        width: 300px;
        height: 300px;
        margin:0 auto;
        background-color: #000;
    }

    .left{
        width: 200px;
        flex-basis: 100px;
        background-color: orange;
    }
    .right{
        width:100px;
        background-color: cyan;
    }

Flex布局的三个属性要深刻理解!_宽高_04

 细心地我们发现,left的宽度是不是有点奇怪?上面left不是定义了一个width:200px,为什么效果会是100px的?我们都知道flex-basis是基准,其实在flex布局下,这个属性的优先级比width要高的,当flex-basis与width都存在时,是以前者的值为准的。 好了好了,三个元素我们都学完了,总结一下:

  • flex-grow:值大于0,主要是解决父元素宽度大于所有子元素宽度之和时,子元素合理分配父元素剩余空间。值为0时,子元素盒子空间不做扩大处理。
  • flex-shrink:值大于0,主要是解决父元素宽度小于所有子元素宽度之和时,子元素缩小宽度以适应父元素宽度,值为0时,子元素盒子空间不做缩小处理。
  • flex-basis:其实也可以理解为在flex布局下,一个高优先级的宽度

4 结合flex属性使用

除了上面各自分开使用这三个属性,还可以盒子一起使用也就是:

flex:flex-grow flex-shrink flex-basis;
/*记忆法:g(拱)s(?)b(?)后面两个字懂了吧^_^*/

flex属性可以灵活处理这三个属性,可以单值、双值处理,这样的话,flex属性分别代表什么?

  • 当flex为单值时,可代表一个无单位数(默认为flex:number 1 0;)、一个有效宽度值(flex:100px,即是flex-basis)、或者特殊值(none、auto、initial)

none:元素会根据自身宽高来设置尺寸。它是完全非弹性的:既不会缩短,也不会伸长来适应 flex 容器。相当于将属性设置为flex: 0 0 auto

auto:会伸长并吸收 flex 容器中额外的自由空间,也会缩短自身来适应 flex 容器。这相当于将属性设置为 flex: 1 1 auto

initial:它会缩短自身以适应 flex 容器,但不会伸长并吸收 flex 容器中的额外自由空间来适应 flex 容器。

  • 当flex为双值时,第一个数必须为无单位数(代表flex-grow)、第二个数为一个无单位数(flex-shrink)或一个有效宽度(flex-basis)

5 一道笔试题

  • 以下布局在页面上的宽度比是?
/*父元素*/
.flex{
    display: flex;
    width: 200px;
    height: 100px;
    margin:0 auto;
    background-color: #000;
}

/*子元素*/
.left{
    flex:3 2 50px;
    background-color: orange;
}

/*子元素*/
.right{
    flex:2 1 200px;
    background-color: cyan;
}

从上面我们可以看到子元素的flex值太复杂,其实我们可以先不看前面两值,先看最后一值(flex-basis)。如果所有子元素的flex-basis之和小于父元素之和考虑第一个值,如果所有子元素的flex-basis之和大于父元素之和考虑第二个值。上面所有子元素宽度50px+200px=250px大于父元素宽度200px,所以考虑第二个值也就是子元素left和子元素right的flex-shrink属性比2:1,超出部分50px这样处理left的宽度缩小为:50px-50px*(50px*2/(50px*2+200px*1)) = 33.34;right的宽度为:200px-50px*(200px*2/(50px*2+200px*1)) = 166.66。 所以上面题目答案为33.34:166.66 = 1:5

 

标签:Flex,flex,元素,100px,宽度,left,属性,深刻理解,200px
From: https://blog.51cto.com/u_14627797/7809093

相关文章

  • Asp.net core中HttpResponse常用属性及Status code
    在ASP.NETCore中,HttpResponse表示HTTP响应,其中包括一些常用的属性和方法,用于设置HTTP响应的各种属性。HTTP响应通常由一个HTTP状态码,HTTP头(headers),和HTTP主体(body)组成。以下是一些常用的HttpResponse属性和一些常见的HTTP状态码及其含义:HttpResponse常用属性:StatusCode:用......
  • 图扑 HT for Web 风格属性手册教程
    图扑软件明星产品HTforWeb是一套纯国产化独立自主研发的2D和3D图形界面可视化引擎。HTforWeb(以下简称HT)图元的样式由其Style属性控制,并且不同类型图元的Style属性各不相同。为了方便查询和理解图元的Style属性,以及更加便捷地应用和理解每个属性的作用,图扑HT提......
  • 为什么 CSS flex 布局中没有 `justify-items` 和 `justify-self`?
    为什么CSSflex布局中没有justify-items和justify-self?为什么在CSSflex布局中存在align-items和align-self,却没有justify-items和justify-self呢?要解答这个问题,首先需要理解主轴(mainaxis)和交叉轴(crossaxis)之间的差异。1.主轴和交叉轴的区别在没有折行的情况......
  • 表单元素的enctype属性
    表单元素的enctype属性指定的是表单数据的编码方式,该属性有3个值:1)application/x-www-form-urlencoded:这是默认编码方式,它只处理表单域里的value属性值,采用这种编码方式的表单会将表单域的值处理成URL编码方式。2)multipart/form-data:这种编码方式的表......
  • 数据库的字段属性
    Unsigned:无符号的整数声明了该列不能声明为负数zerofill:0填充的不足的位数使用0来填充 int(3)  ,5=005自增:通常理解为自增,自动在上一条的基础上+1(默认)通常用来设计唯一的主键~index,必须是整数类型可以自定义设计主键自增的起始值......
  • 在ts时使用axios请求类型定义增加属性
    1.需求在后台请求中有一些请求数据量比较大无法一下返回,需要增加loading动画,为了方便控制想在请求的时候增加一个参数isLoading,默认关闭,传真值时开启动画。这便需要拓展axios中增加个性化参数配置。但是如何进行类型的定义呢?2.操作 如上,在做左边增加了isLoading参数,代码......
  • 总结selenium 中 js 更改隐藏属性
    第一种多个元素被隐藏时通过js修改对比照片这个是没隐藏的 对比照片 这个是隐藏的 driver=webdriver.Chrome()#urlurl=r"http://127.0.0.1:5000/"driver.get(url)print("已打开网页")#执行js脚本,将元素的display属性设置为block,......
  • 浮动属性 清浮动
    浮动效果:1.见缝插针,第一行位置不够时,并不会另起一行,哪有位置补在哪2.文字不会因为盒子进行浮动被覆盖3.谁先进行浮动,谁在最旁边浮动的作用:1.定义网页中其他文本如何围绕该元素显示2.让竖着拍的东西横着来<style>.red{......
  • 属性选择器
    #属性选择器是以[]作为标志的 方法一:[username]{/*把所有含有属性名是username的标签背景色改为红色*/background-color:red;} 方法二:[username='jason']{/*找到所有属性名是username并且属性值是jason的标签*/color:orange;} 方法三:inpu......
  • Vue组件各个属性执行顺序问题
    转自:https://blog.csdn.net/m0_62763606/article/details/131694339       在制作波动短视频效果时,在data中定义了一个变量,默认值为null。后来该变量在mounted中被赋值,而后在watch侦听属性中使用立即侦听时使用了该变量却显示为null,后发现这关系到各个组件属性执行顺序问......