css弹性布局(display:flex)

display:flex相关属性:

容器属性:
	1.flex-direction:控制主轴是哪一根,控制主轴的方向。
		属性值:
			row:				主轴是从左往右的x轴.
		   	row-reverse:		主轴是从右往左的x轴.
		   	column:				主轴是从上往下的y轴.
		   	column-reverse:		主轴是从下往上的y轴.
		   	
	2.富裕空间管理:只决定富裕空间的位置,不会给项目分配空间。
		(1)justify-content:管理主轴富裕空间。
				属性值:
					flex-start:			富裕空间在主轴的正方向.
					flex-end:			富裕空间在主轴的反方向.
					center:				富裕空间在主轴两边.
					space-between:		富裕空间在每个项目之间.
					space-around: 	  	富裕空间在项目两边和项目之间.
		(2)align-items:管理侧轴富裕空间。
				属性值:
					flex-start:			富裕空间在侧轴的正方向.
					flex-end:			富裕空间在侧轴的反方向.
					center:				富裕空间在侧轴两边.
					baseline:			项目基线对齐.
					stretch:			等高布局(项目没有高度).
					
	3.flex-wrap:控制的是侧轴的方向(项目总长度大于容器长度的时候,项目的宽度会自行收缩不换行,flex-wrap可以设置他进行换行以及侧轴方向)。
		属性值:
			nowrap:			不换行.
			wrap:			侧轴方向由上而下(flex-shrink失效).
			wrap-reverse:	侧轴方向由下而上(flex-shrink失效).
		侧轴富裕空间的管理:
			单行单列(不换行)时:
					align-content无效.
			多行多列(换行)时:
					align-items无效.
		注意:align-self 优先级高最高。
			
	4.align-content:多行/列时侧轴富裕空间的管理(把多行/列看成一个整体)。
		属性值:
			flex-start:			富裕空间在侧轴的正方向.
			flex-end:			富裕空间在主侧轴的反方向.
			center:				富裕空间在侧轴两边.
			space-between:		富裕空间在每个项目之间.
			space-around: 	  	富裕空间在项目两边和项目之间.
			注意:要设置flex-wrap换行(属性值不为nowrap),align-content的效果才会生效。
			
	5.flex-flow:flex-direction和flex-wrap的简写属性(本质上控制了主轴和侧轴分别是哪一根,以及它们的方向)。
		属性值:
			参数1(flex-direction):
				row:				主轴是从左往右的x轴.
		   		row-reverse:		主轴是从右往左的x轴.
		   		column:				主轴是从上往下的y轴.
		   		column-reverse:		主轴是从下往上的y轴.
			参数2(flex-wrap):
				nowrap:			不换行.
				wrap:			侧轴方向由上而下(flex-shrink失效).
				wrap-reverse:	侧轴方向由下而上(flex-shrink失效).

项目属性:
	1.order:控制项目的排列顺序(默认值为0)。
		属性值:number.
		注意:如果几个项目的order值相等,则根据元素先后顺序依次排列。
		
	2.align-self:项目自身侧轴富裕空间的管理。
		属性值:
			flex-start:			富裕空间在侧轴的正方向.
			flex-end:			富裕空间在侧轴的反方向.
			center:				富裕空间在侧轴两边.
			baseline:			项目与容器基线对齐.
			stretch:			项目与容器等高布局(项目没有高度).
			
	3.flex-basis:伸缩规则计算的基准值(默认值auto,拿width或height的值)。
	
	4.flex-grow:弹性空间管理(弹性因子,默认值为0)。
		属性值:number.
		注意:容器大小大于项目大小总和时该属性才生效。
		计算规则:
			(1)可用空间 = (容器大小 - 所有相邻项目flex-basis的总和)。
				var a = 容器大小 - flex-basis和.
			(2)可扩展空间 = (可用空间 / 所有相邻项目flex-grow的总和)。
				var b = a / flex-grow和.
			(3)每项扩展空间的计算 = (可扩展空间 * 每项flex-grow值)。
				var c = b * flex-grow.
			(4)每项伸缩后大小 = (伸缩基准值flex-basis + 每项扩展空间)。
				var d = flex-basis + c.
				
	5.flex-shrink:收缩因子(默认值为1)。
		属性值:number.
		注意:容器大小小于项目大小总和时该属性才生效,并且元素不能换行,否则没有效果。
		计算规则:
			(1)计算收缩因子与基准值乘的总和:
				var a = 每一项flex-shrink * flex-basis之和.
			(2)计算收缩因数:收缩因数 =(项目的收缩因子 * 项目基准值)/ 第一步计算总和:
				var b = (flex-shrink * flex-basis)/a.
			(3)每项移除空间的计算:移除空间 = 项目收缩因数 x 溢出的空间(容器大小-项目大小总和) 
				var c =	b * 溢出的空间.
			(4)每项伸缩后大小的计算:每项伸缩后大小 = 项目大小 - 移除空间。
				var d = flex-basis - c.
	6.flex:简写属性。
		flex属性是flex-grow,flex-shrink,flex-basis的简写,对应的默认值分别为0,1,auto。

演示模板HTML代码:

   <div id="box">
	<div class="inner">1</div>
	<div class="inner">2</div>
	<div class="inner">3</div>
	<div class="inner">4</div>
	<div class="inner">5</div>
   </div>

css代码:

   *{
     margin:0;
	 padding:0;
   }
   #box{
     width:400px;
	 height:300px;
	 border:1px solid;
	 margin:100px auto;
	 display:flex;
   }
   .inner{
     width:50px;
	 height:50px;
	 background:pink;
	 text-align:center;
	 line-height:50px;
   }

页面效果:
在这里插入图片描述

容器属性

1.flex-direction:控制主轴是哪一根,控制主轴的方向

flex-direction:row

   #box{
     width:400px;
	 height:300px;
	 border:1px solid;
	 margin:100px auto;
	 display:flex;
	 flex-direction:row
   }

页面效果:
flex-direction:row
flex-direction:row-reverse
页面效果:
flex-direction:row-reverse
flex-direction:column
页面效果:
flex-direction:column
flex-direction:column-reverse
页面效果:
flex-direction:column-reverse

2.justify-content:管理主轴富裕空间

justify-content:flex-start

   #box{
     width:400px;
	 height:300px;
	 border:1px solid;
	 margin:100px auto;
	 display:flex;
	 flex-direction:row;
	 justify-content:flex-start
   }

页面效果:
justify-content:flex-start

justify-content:flex-end
页面效果:
justify-content:flex-end
justify-content:center
页面效果:
justify-content:center
justify-content:space-between
页面效果:
justify-content:space-between
justify-content:space-around
页面效果:
justify-content:space-around

3.align-items:管理侧轴富裕空间

align-items:flex-start

   #box{
     width:400px;
	 height:300px;
	 border:1px solid;
	 margin:100px auto;
	 display:flex;
	 flex-direction:row;
	 justify-content:flex-start;
	 align-items:flex-start
   }

页面效果:
align-items:flex-start
align-items:flex-end
页面效果:
align-items:flex-end
align-items:center
页面效果:
align-items:center
align-items:baseline

   #box{
     width:400px;
	 height:300px;
	 border:1px solid;
	 margin:100px auto;
	 display:flex;
	 flex-direction:row;
	 justify-content:flex-start;
	 align-items:baseline
   }
   #box > .inner:nth-child(2){
     line-height:100px
   }

页面效果:
align-items:baseline
align-items:stretch

   #box{
     width:400px;
	 height:300px;
	 border:1px solid;
	 margin:100px auto;
	 display:flex;
	 flex-direction:row;
	 justify-content:flex-start;
	 align-items:stretch
   }
/*    #box > .inner:nth-child(2){
     line-height:100px
   } */
   .inner{
     width:50px;
	 /* height:50px; */
	 background:pink;
	 text-align:center;
	 line-height:50px;
   }

页面效果:
align-item:stretch
提醒:只要能准确分辨主轴,侧轴和它们的方向,就能更快的设置富裕空间的位置。

4.flex-wrap:控制的是侧轴的方向

   #box{
     width:100px;
	 height:300px;
	 border:1px solid;
	 margin:100px auto;
	 display:flex;
	 flex-direction:row;
	 justify-content:flex-start;
	 align-items:flex-start
   }
   .inner{
     width:50px;
	 height:50px;
	 background:pink;
	 text-align:center;
	 line-height:50px;
   }

当我们把容器的宽度调成100px(小于项目的总宽度)的时候。
页面效果:
在这里插入图片描述
每个项目的宽度会自动收缩。
设置flex-wrap:nowrap的效果跟着一样。

flex-wrap:wrap

   #box{
     width:100px;
	 height:300px;
	 border:1px solid;
	 margin:100px auto;
	 display:flex;
	 flex-direction:row;
	 justify-content:flex-start;
	 align-items:flex-start;
	 flex-wrap:wrap
   }

页面效果:
flex-wrap:wrap
flex-wrap:wrap-reverse
页面效果:
flex-wrap:wrap-reverse

5.align-content:多行/列时侧轴富裕空间的管理(把多行/列看成一个整体)

注意:要设置flex-wrap换行(属性值不为nowrap),align-content的效果才会生效。
属性值更justify-content的属性值一样。

align-content:flex-start

   #box{
     width:100px;
	 height:300px;
	 border:1px solid;
	 margin:100px auto;
	 display:flex;
	 flex-direction:row;
	 justify-content:flex-start;
	 align-items:flex-start;
	 flex-wrap:wrap;
	 align-content:flex-start
   }
   .inner{
     width:50px;
	 height:50px;
	 background:pink;
	 text-align:center;
	 line-height:50px;
   }

页面效果:
align-content:flex-start
align-content:flex-end
页面效果:
align-content:flex-end
align-content:center
页面效果:
align-content:center
align-content:space-between
页面效果:
align-content:space-between
align-content:space-around
页面效果:
align-content:space-around

6.flex-flow:flex-direction和flex-wrap的简写属性(本质上控制了主轴和侧轴分别是哪一根,以及它们的方向)

flex-flow一共两个参数,参数1代表flex-direction,参数2代表flex-wrap,只写一个代表只设置主轴。

   #box{
     width:100px;
	 height:300px;
	 border:1px solid;
	 margin:100px auto;
	 display:flex;
	 flex-direction:row;
	 justify-content:flex-start;
	 align-items:flex-start;
	 flex-wrap:wrap;
	 align-content:space-around
   }

这段样式的效果是:
在这里插入图片描述
我们用flex-flow设置一下:

   #box{
     width:100px;
	 height:300px;
	 border:1px solid;
	 margin:100px auto;
	 display:flex;
	 /* flex-direction:row; */
	 justify-content:flex-start;
	 align-items:flex-start;
	 /* flex-wrap:wrap; */
	 align-content:space-around;
	 flex-flow:row wrap
   }

页面效果:
在这里插入图片描述
可以看见效果跟刚才是一样的。

我们把flex-flow:row wrap第二个参数改成wrap-reverse看看:
在这里插入图片描述
可以看见现在侧轴的方向是从下到上了。

项目属性

1.order:控制项目的排列顺序(默认值为0)

注意:如果几个项目的order值相等,则根据元素先后顺序依次排列。

   #box{
     width:400px;
	 height:300px;
	 border:1px solid;
	 margin:100px auto;
	 display:flex;
   }
   .inner{
     width:50px;
	 height:50px;
	 background:pink;
	 text-align:center;
	 line-height:50px;
	 order:1;
   }

页面效果:
在这里插入图片描述
因为现在每个项目的order都是1,排列顺序是按照元素的先后顺序来的,如果改成这样:

   #box > .inner:nth-child(1){
     order:2;
   }
   #box > .inner:nth-child(2){
     order:5;
   }
   #box > .inner:nth-child(3){
     order:1;
   }
   #box > .inner:nth-child(4){
     order:3;
   }
   #box > .inner:nth-child(5){
     order:4;
   }

页面效果:
在这里插入图片描述
可以看见这次项目的排列顺序是根据order的值来进行排列的。

2.align-self:项目自身侧轴富裕空间的管理

justify-content、align-items、align-content都是对所有项目进行富裕空间管理的,而align-self可以对自身进行富裕空间管理,下面让我们一起来看一下。

align-self:flex-start

   #box{
     width:400px;
	 height:300px;
	 border:1px solid;
	 margin:100px auto;
	 display:flex;
	 flex-direction:row;
	 justify-content:center;
	 align-items:center;
   }
   .inner{
     width:50px;
	 height:50px;
	 background:pink;
	 text-align:center;
	 line-height:50px;
   }
   #box > .inner:nth-child(2){
     align-self:flex-start
   }

页面效果:
align-self:flex-start
align-self:flex-end
页面效果:
align-self:flex-end
align-self:center
页面效果:
align-self:center
align-self:baseline
页面效果:
align-self:baseline
align-self:stretch
去掉项目的高度才有效果。

   .inner{
     width:50px;
	 /* height:50px; */
	 background:pink;
	 text-align:center;
	 line-height:50px;
   }

页面效果:
align-self:stretch

3.flex-basis:伸缩规则计算的基准值(默认值auto,拿width或height的值)

flex-basis可以设置项目自身的大小(以主轴为准)。

   #box{
     width:400px;
	 height:300px;
	 border:1px solid;
	 margin:100px auto;
	 display:flex;
	 flex-direction:row;
	 justify-content:center;
	 align-items:center;
   }
   .inner{
     width:50px;
	 height:50px;
	 background:pink;
	 text-align:center;
	 line-height:50px;
   }
   #box > .inner:nth-child(2){
     flex-basis:100px
   }

页面效果:
flex-basis:100px
可以看见只有2号项目设置了flex-basis,宽度变成了100,我们把主轴变成y轴试试:

   #box{
     width:400px;
	 height:300px;
	 border:1px solid;
	 margin:100px auto;
	 display:flex;
	 flex-direction:column;
	 justify-content:center;
	 align-items:center;
   }

页面效果:
在这里插入图片描述

4.flex-grow:弹性空间管理(弹性因子,默认值为0)

注意:容器大小大于项目大小总和时该属性才生效。
没设置flex-grow之前:

   #box{
     width:400px;
	 height:300px;
	 border:1px solid;
	 margin:100px auto;
	 display:flex;
	 flex-direction:row;
	 justify-content:flex-start;
	 align-items:flex-start;
   }
   .inner{
     width:50px;
	 height:50px;
	 background:pink;
	 text-align:center;
	 line-height:50px;
   }

页面效果:
在这里插入图片描述
设置flex-grow:1

   .inner{
     width:50px;
	 height:50px;
	 background:pink;
	 text-align:center;
	 line-height:50px;
	 flex-grow:1
   }

页面效果:
flex-grow
可以看见每个项目的宽度都变成了80px,根据开头的计算规则我们可以算出最后的结果:

(1)可用空间 = (容器大小 - 所有相邻项目flex-basis的总和)。
		150 = 400 - 50*5.
(2)可扩展空间 = (可用空间 / 所有相邻项目flex-grow的总和)。
		30 = 150 / 5.
(3)每项扩展空间的计算 = (可扩展空间 * 每项flex-grow值)。
		30 = 30 * 1.
(4)每项伸缩后大小 = (伸缩基准值flex-basis + 每项扩展空间)。
		80 = 50 + 30.

这个比较简单,我们把2号项目的flex-basis设置成100px,3号项目的flex-grow设置为3,再来计算一下看看是否正确:

   #box{
     width:400px;
	 height:300px;
	 border:1px solid;
	 margin:100px auto;
	 display:flex;
	 flex-direction:row;
	 justify-content:flex-start;
	 align-items:flex-start;
   }
   .inner{
     width:50px;
	 height:50px;
	 background:pink;
	 text-align:center;
	 line-height:50px;
	 flex-grow:1
   }
   #box > .inner:nth-child(2){
   	 flex-basis:100px;
   }
   #box > .inner:nth-child(3){
   	 flex-grow:3;
   }

首先我们可以知道1、4、5项目的大小一样,2号项目是一个大小,3号项目又是另一个大小:

(1)可用空间 = (容器大小 - 所有相邻项目flex-basis的总和)。
		100 = 400 - 100 + 50*4.
(2)可扩展空间 = (可用空间 / 所有相邻项目flex-grow的总和)。
		可扩展空间 = 100 / 7(1,2,4,5的flex-grow为1,3的flex-grow为3,相加为7)
(3)每项扩展空间的计算 = (可扩展空间 * 每项flex-grow值)。
		1,4,5项目 = (100 / 7) * 1
		2项目 = (100 / 7) * 1
		3项目 = (100 / 7) * 3
(4)每项伸缩后大小 = (伸缩基准值flex-basis + 每项扩展空间)。
		1,4,5项目 = 50 + (100 / 7) * 1		四舍五入为:64.28
		2项目 = 100 + (100 / 7) * 1			四舍五入为:114.28
		3项目 = 50 + (100 / 7) * 3			四舍五入为:92.86

我们来看下效果是不是这样:
在这里插入图片描述
可以看见计算出来的结果都是对的。

5.flex-shrink:收缩因子(默认值为1)

注意:容器大小小于项目大小总和时该属性才生效,并且元素不能换行,否则没有效果。

   #box{
     width:200px;
	 height:300px;
	 border:1px solid;
	 margin:100px auto;
	 display:flex;
	 flex-direction:row;
	 justify-content:flex-start;
	 align-items:flex-start;
   }
   .inner{
     width:50px;
	 height:50px;
	 background:pink;
	 text-align:center;
	 line-height:50px;
	 flex-shrink:1
   }

页面效果:
flex-shrink
可以看见每个项目的宽度由原来的50px变成了40px,根据开头的计算规则我们可以算出最后的结果:

(1)计算收缩因子与基准值乘的总和:
		250 = 1 * 50 * 5
(2)计算收缩因数:收缩因数 =(项目的收缩因子 * 项目基准值)/ 第一步计算总和:
		0.2 = 1 * 50 / 250
(3)每项移除空间的计算:移除空间 = 项目收缩因数 x 溢出的空间(项目大小总和 - 容器大小) 
		10 = 0.2 * (50 * 5 - 200)
(4)每项伸缩后大小的计算:每项伸缩后大小 = 项目大小 - 移除空间。
		40 = 50 - 10

这个比较简单,我们把2号项目的flex-basis设置成100px,3号项目的flex-shrink设置为3,再来计算一下看看是否正确:

   #box{
     width:200px;
	 height:300px;
	 border:1px solid;
	 margin:100px auto;
	 display:flex;
	 flex-direction:row;
	 justify-content:flex-start;
	 align-items:flex-start;
   }
   .inner{
     width:50px;
	 height:50px;
	 background:pink;
	 text-align:center;
	 line-height:50px;
	 flex-shrink:1
   }
   #box > .inner:nth-child(2){
   	 flex-basis:100px;
   }
   #box > .inner:nth-child(3){
   	 flex-shrink:3;
   }

首先我们可以知道1、4、5项目的大小一样,2号项目是一个大小,3号项目又是另一个大小:

(1)计算收缩因子与基准值乘的总和:
		400 = (1 * 50 * 3) + (1 * 100 * 1) + (3 * 50 * 1)
(2)计算收缩因数:收缩因数 =(项目的收缩因子 * 项目基准值)/ 第一步计算总和:
		1,4,5项目 0.125 = 1 * 50 / 400
		2项目     0.25 = 1 * 100 / 400
		3项目     0.375 = 3 * 50 / 400
(3)每项移除空间的计算:移除空间 = 项目收缩因数 x 溢出的空间(项目大小总和 - 容器大小) 
		1,4,5项目 12.5 = 0.125 * ((50 * 4 + 100) - 200)
		2项目     25 = 0.25 * ((50 * 4 + 100) - 200)
		3项目     37.5 = 0.375 * ((50 * 4 + 100) - 200)
(4)每项伸缩后大小的计算:每项伸缩后大小 = 项目大小 - 移除空间。
		1,4,5项目 50 - 12.5 = 37.5
		2项目     100 - 25 = 75
		3项目     50 - 37.5 = 12.5

我们来看下效果是不是这样:
flex-shrink
可以看见计算出来的结果都是对的。

6.flex:简写属性

flex属性是flex-grow,flex-shrink,flex-basis的简写,对应的默认值分别为0,1,auto,通常用于等比例布局。

css代码:

	#box{
	  width:400px;
	  height:300px;
	  border:1px solid;
	  margin:100px auto;
	  display:flex;
	}
	#box > .inner{
	  height:50px;
	  background:red;
	  font:20px/50px '微软雅黑';
	  text-align:center;
	  flex:1;
	}

HTML代码:

  <div id="box">
	<div class="inner">1</div>
	<div class="inner">2</div>
	<div class="inner">3</div>
	<div class="inner">4</div>
	<div class="inner">5</div>
  </div>

页面效果:
flex简写
可以看见在未设置项目宽度的情况下,flex属性能实现项目的等比例布局,我们打开浏览器的调试模式看下。
在这里插入图片描述
可以看见只flex只设置一个参数的情况下,后面两个参数采用的是默认值(因为没有宽度所有项目的基准值flex-basis为0)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值