十四、flex布局(弹性盒、伸缩盒)

一、浮动布局和flex布局的发展历史

	
	网页布局主要有两种,一种是浮动布局,另一种是flex布局。
		
	+++ 浮动布局
		
			浮动布局是一种传统的布局解决方案。
			它是基于盒状模型,依赖 display + position + float属性。
			它对于那些特殊布局非常不方便,比如,垂直居中就不容易实现。
	
	+++ flex布局
		
			2009年,W3C 提出了一种新的方案----Flex 布局,可以简便、完整、响应式地实现各种页面布局。
			目前,它已经得到了所有浏览器的支持,这意味着,现在就能很安全地使用这项功能。

			
1.1 浮动布局
>>>>>> 宽高度已知
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .outer{
            border: 1px solid red;
            width: 500px;
            height: 500px;
            position: absolute;
            margin: auto; /*必须*/
            left: 0;
            top: 0;
            right: 0;
            bottom: 0;
        }
    </style>
    <body>
    <div class="outer"></div>
    </body>
    
   
</html>

在这里插入图片描述

>>>>>> 自适应高度
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .outer{
            border: 1px solid red;
            width: 500px;
            position: absolute;
            left: 50%;/*先平移50%*/
            top: 50%;
          
            /*平移回来元素宽高的一半*/
            transform: translate(-50%,-50%); 
        }
        .inner{
            height: 200px;
        }
    </style>
    <body>
    <div class="outer">
        <div class="inner"></div>
    </div>
    </body>
    
</html>

在这里插入图片描述

1.2 flex布局
>>>>>> 任何元素都可以设置为flex
	/* 块级元素*/
	div{
	  display: -webkit-flex; /* Safari兼容方案 */
	  display: flex;
	}
	/* 行内元素*/
	span{
	 display: inline-flex;
	}

二、flex布局

2.1 flex布局基本概念


	+++ flex布局:

			1)flex布局表示弹性布局,为盒状模型提供最大的灵活性。
						   它是css中一种布局手段,它主要用于代替浮动来完成页面布局。
		
			2)任何一种元素都可以指定为flex布局

	
	
	+++ 弹性容器:
				1) 采用flex布局的容器就是弹性容器。
				2) 弹性容器中默认存在两条轴,即主轴和侧轴。
								a) 主轴:弹性元素的排列方向称为主轴。
		   	 					b) 侧轴:与主轴垂直的方向为侧轴。

			
	+++ 弹性元素:
	 			1) 弹性容器的直接子元素是弹性元素。
				2) 弹性元素也可以设置为弹性容器。
				
				3) 当设置flex布局之后,
				   弹性元素的float、clear、vertical-align属性都将失效。


2.2 flex布局兼容性问题

1)支持flex布局的浏览器

在这里插入图片描述

2)flex布局兼容性
		
		flex布局:
				1.flex布局对于一些老版本的浏览器兼容性不好。
				
				2.如果是移动端用,flex布局和浮动布局,推荐使用flex布局。
				3.如果是PC端,flex布局要考虑老版本的兼容问题。
				
		

2.2 实现flex布局

		
	1) 实现flex布局需要先指定一个容器,这样容器内部的元素就可以使用 flex 来进行布局。
	2) 任何一个容器都可以被指定为 flex 布局
	
			.container {
			    display: flex | inline-flex;       //可以有两种取值
			}	
			
1)任何一个容器都可以指定为 Flex 布局
		/** 块元素设置flex布局	*/
		div{
		  display: flex;
		}

		/** 行内元素设也可以置flex布局	*/
		span{
		  display: inline-flex;
		}

2)默认情况下弹性元素在容器中自左向右排列,不换行,溢出不缩放
>>>>>>> 未实现flex布局

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>

     <style>

         *{
             margin:0px;
             padding:0px;
             list-style: none;
         }

         
         .wrapper{
             width:1000px;
             height:200px;

             background-color: red;
         }


         .wrapper div{
             width:100px;
             height:100px;
             margin-top: 10px;

             background-color: blue;
             text-align: center;
             line-height: 100px;
             font-size: 16px;;
         }

     </style>

</head>
<body>

      <div class="wrapper">
            <div class="b1">1</div>
            <div class="b2">2</div>
            <div class="b3">3</div>
      </div>  


</body>
</html>

在这里插入图片描述

>>>>>>> 实现flex布局
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>

     <style>

         *{
             margin:0px;
             padding:0px;
             list-style: none;
         }

         
         .wrapper{
             width:1000px;
             height:200px;

             background-color: red;

             display: flex;
         }


         .wrapper div{
             width:100px;
             height:100px;
             margin-top: 10px;

             background-color: blue;
             text-align: center;
             line-height: 100px;
             font-size: 16px;;
         }

     </style>

</head>
<body>

      <div class="wrapper">
            <div class="b1">1</div>
            <div class="b2">2</div>
            <div class="b3">3</div>
      </div>  


</body>
</html>

在这里插入图片描述

三、弹性容器属性


	设置容器的属性:
				 display:flex;
	
				 flex-direction:row(默认值) | row-reverse | column |column-reverse
							 			 	设置主轴的方向,即弹性元素排列方向
							  
				 flex-wrap:nowrap(默认值) | wrap | wrap-reverse
							  			 	设置弹性元素在主轴上是否换行
	
				 justify-content:flex-start(默认值) | flex-end | center |space-between | space-around | space-evenly
										 	设置弹性元素在主轴上的对齐方式
										
				 align-items:stretch(默认值) | center  | flex-end | baseline | flex-start
				 align-content:stretch(默认值) | flex-start | center |flex-end | space-between | space-around | space-evenly
										 	设置弹性元素在副轴上的对齐方式

3.1 flex-direction 设置主轴的方向,即弹性元素的排列方向
	
			flex-direction: row; 设置主轴的方向,即设置弹性元素的排列方向。
				 
					可选值			
					 	  row   			默认值,设置主轴为水平方向,自左向右	
					 	                    弹性元素在容器中水平排列。(自左向右)
											  												 	  							
					 	  row-reverse 	    设置主轴为水平方向,自右向左
					 	  					弹性元素在容器中水平排列(自右向左)
					 	  										 	 					 				
						  column   	 		设置主轴为垂直方向,自上向下
						  					弹性元素在容器中纵向排列(自上向下)	
											
		
						  column-reverse  	设置主轴为垂直方向,自下向上
						  					弹性元素元素在容器中纵向排列(自下向上)
			
								
			1) 如果元素不是弹性盒对象的元素,则 flex-direction 属性不起作用。
			2) 默认情况下弹性元素在弹性容器中自左向右水平排列,不换行

1)设置主轴的方向,即弹性元素的排列方向
	.box {
	     flex-direction: row | row-reverse | column | column-reverse;
	 }
		

在这里插入图片描述

2)案例
>>>>>> row: 默认值,表示沿水平方向,由左到右。
<style>
	div{
		display: flex;
		border: 1px solid #000;
		flex-direction: row;
	}
	p{
		border: 1px solid red;
		width: 100px;
		height: 100px;
		line-height: 100px;
		text-align: center;
		margin-left: 20px;
	}
</style>
<body>
		<div>
			<p>1</p>
			<p>2</p>
			<p>3</p>
		</div>
</body>

在这里插入图片描述

>>>>>> row-reverse :表示沿水平方向,由右到左
<style>
	div{
		display: flex;
		border: 1px solid #000;
		flex-direction: row-reverse;
	}
	p{
		border: 1px solid red;
		width: 100px;
		height: 100px;
		line-height: 100px;
		text-align: center;
		margin-right: 20px;
	}
</style>
<body>
<div>
	<p>1</p>
	<p>2</p>
	<p>3</p>
</div>
</body>

在这里插入图片描述

>>>>>> column:表示垂直方向,由上到下
<style>
	div{
		display: flex;
		border: 1px solid #000;
		flex-direction: column;
	}
	p{
		border: 1px solid red;
		width: 100px;
		height: 100px;
		line-height: 100px;
		text-align: center;
		margin-top: 20px;
		margin-left: 20px;
	}
</style>
<body>
<div>
	<p>1</p>
	<p>2</p>
	<p>3</p>
</div>
</body>

在这里插入图片描述

>>>>>> column-reverse:表示垂直方向,由下到上

在这里插入图片描述

3.2 flex-wrap 设置弹性元素在弹性容器中一行无法显示时处理方式
	
			flex-wrap  设置了弹性元素在弹性容器中一行无法显示时处理方式
			
				可选值:
						nowrap 		 	默认值,弹性元素溢出也不自动换行						
						wrap    		换行。第一行在上方。
						wrap-reverse    换行,第一行在下方。
			
			
			 1) flex-wrap属性定义,如果一条轴线排不下,如何换行。			   
			 2) 默认情况下,弹性元素排在一条直线上,不换行。
			   

	
							
1)设置弹性元素在弹性容器中一行无法显示时换行方式
			.box{
			 	 flex-wrap: nowrap | wrap | wrap-reverse;
			}

a) nowrap:默认值, 不换行,即当主轴尺寸固定时,当空间不足时,弹性元素的尺寸会随之调整而并不会挤到下一行。

说明:设置的项目的宽度就失效了,强行在一行显示

在这里插入图片描述

b) wrap:弹性元素溢出时,沿着副轴的方向换行。换行,第一行在上方

在这里插入图片描述
c) wrap-reverse:换行,第一行在下方

在这里插入图片描述

3)案例
>>>>>> nowrap ,默认值,不换行
		1.默认情况下,弹性元素在容器中水平排列,不会换行。
		  	如果弹性元素超过弹性容器,不会溢出,而是进行缩放。
		  
		 从下图我们可以看到, 容器为水平主轴, 项目本来是100px的宽度, 
		 但是因为不换行(可以通过调整浏览器宽度), 
		 导致项目本身发生等比缩小(如果传统浮动会发生类似换行效果)。
<style>
	div{
		display: flex;
		border: 1px solid #000;
		flex-direction: row;
		flex-wrap: nowrap;
	}
	p{
		border: 1px solid red;
		width: 100px;
		height: 100px;
		line-height: 100px;
		text-align: center;
		margin-left: 20px;
	}
</style>
<body>
<div>
	<p>1</p>
	<p>2</p>
	<p>3</p>
	<p>4</p>
	<p>5</p>
	<p>6</p>
	<p>7</p>
	<p>8</p>
</div>
</body>

在这里插入图片描述
PS
上面布局我们可以看到, 容器为水平主轴, 项目本来是100px的宽度, 但是因为不换行(可以通过调整浏览器宽度), 导致项目本身发生等比缩小(如果传统浮动会发生类似换行效果)。

>>>>>> wrap
<style>
	div{
		display: flex;
		border: 1px solid #000;
		flex-direction: row;
		flex-wrap: wrap;
	}
	p{
		border: 1px solid red;
		width: 100px;
		height: 100px;
		line-height: 100px;
		text-align: center;
		margin-left: 20px;
	}
</style>
<body>
<div>
	<p>1</p>
	<p>2</p>
	<p>3</p>
	<p>4</p>
	<p>5</p>
	<p>6</p>
	<p>7</p>
	<p>8</p>
</div>
</body>

在这里插入图片描述
PS
上面布局我们可以看到, 因为换行, 当水平方向放不下下一个项目就会发生换行, 类似浮动(第一行在上方)。

>>>>>> wrap-reverse
<style>
	div{
		display: flex;
		border: 1px solid #000;
		flex-direction: row;
		flex-wrap: wrap-reverse;
	}
	p{
		border: 1px solid red;
		width: 100px;
		height: 100px;
		line-height: 100px;
		text-align: center;
		margin-left: 20px;
	}
</style>
<body>
<div>
	<p>1</p>
	<p>2</p>
	<p>3</p>
	<p>4</p>
	<p>5</p>
	<p>6</p>
	<p>7</p>
	<p>8</p>
</div>
</body>

在这里插入图片描述
PS
与wrap不同之处在于, 第一行排列在下方。

3)案例2
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>

     <style>

         *{
             margin:0px;
             padding:0px;
             list-style: none;
         }

         
         .wrapper{
             width:200px;
             height:200px;

             background-color: red;

             display: flex;

            
             /** 默认值,不自动换行*/
             /* flex-wrap: nowrap; */
             /** 元素会沿着副轴方向自动换行*/
             /* flex-wrap: wrap; */
             /** 元素会沿着副轴反方向自动换行*/
             flex-wrap: wrap-reverse;


         }


         .wrapper div{
             width:100px;
             height:100px;
             margin-top: 10px;

             background-color: blue;
             text-align: center;
             line-height: 100px;
             font-size: 16px;;
         }

     </style>

</head>
<body>

      <div class="wrapper">
            <div class="b1">1</div>
            <div class="b2">2</div>
            <div class="b3">3</div>
      </div>  


</body>
</html>

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

3.3 flex-flow :flex-direction 和 flex-wrap 的简写形式
	
	flex-flow: flex-direction flex-wrap
	
				1) flex-flow 属性是 flex-direction 和 flex-wrap 属性的复合属性。
				
				2) flex-flow:row nowrap;默认值。
										默认情况下,弹性元素在水平方向自左向右排列,不换行。

3.4 justify-content 设置弹性元素在主轴上的对齐方式

		justify-content 设置弹性元素在主轴上的对齐方式。
	           	 	可选值
			           		 flex-start  默认值,左对齐。
			           		 
			           		 flex-end    右对齐。
			           		 center      居中。
							 space-between	 两端对齐, 弹性元素之间间隔相等。	
							 space-around	 弹性元素之间的间隔相等。所以,弹性元素之间的间隔比弹性元素之间的间隔与边框的间隔大一倍。				
				  


1)设置弹性元素在主轴上的对齐方式

flex-start

在这里插入图片描述
flex-end
在这里插入图片描述

flex-center

在这里插入图片描述

space-between
在这里插入图片描述
space-around
在这里插入图片描述

2)案例
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .outer{
            width:500px;
            height:100px;
            background-color: red;;


            display: flex;

            justify-content:flex-start;
            /* justify-content:flex-end; */
            /* justify-content:center; */
            /* justify-content:space-between; */
            /* justify-content:space-around; */

        }

        .inner{
            width:50px;
            height:50px;
            background-color: blue;
            border:1px solid black;
            text-align: center;
            line-height: 50px;
            font-size: 16px;
        }
    </style>
    <body>
    <div class="outer">
        <div class="inner">1</div>
        <div class="inner">2</div>
        <div class="inner">3</div>
    </div>
    </body>
    
</html>

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.5 align-items 、align-content 设置弹性元素在副轴上对齐方式
	
	+++ align-items  设置弹性元素在副轴上对齐方式
		        
		        可选值 
			        align-items: stretch;	 
			         					  默认值, 沿着侧边轴对齐。
			         					  如果副轴方向带大小的为auto,则会拉伸。
										 		
					align-items:flex-start  元素不会拉伸,沿着副轴起边对齐。
					align-items:flex-end    元素不会拉伸,沿着副轴终边对齐
					align-items:center		元素不会拉伸,居中对齐

			1)弹性元素如果没有设置高度,默认情况下会自动填充。
			2)使用每个弹性元素的 align-self 属性可重写 align-items 属性。
			
	
	+++ align-content  设置多行弹性元素在副轴上对齐方式。
		           	  
		           	  1) 可选值 
		           	  			align-content: stretch;      默认值, 沿着侧边轴对齐。
		           	  										 如果副轴方向带大小的为auto,则会拉伸。
		           	  										 
			           		    align-content: flex-start;  元素不会拉伸,与副轴的起边对齐
			           		 	align-content: flex-end;    元素不会拉伸,与副轴的终边对齐
			           			align-content: center;      元素不会拉伸,与副轴的中边对齐
				
				
				            	align-content:space-around; 元素不会拉伸,空白分配到元素的两侧
								align-content:space-between; 元素不会拉伸,空白均匀分配到元素之间

							

	 +++ align-items 、	align-content的区别
	 	 
		 	 相同点:两者都是设置弹性元素在侧轴上的对齐方式。
		 	
		 	 不同点:align-items设置单行弹性元素在侧轴上的对齐方式。
		 	 		align-content设置多行弹性元素在侧轴上的对其方式。
		 	
	 			
3.4.1 align-items 设置弹性元素在副轴上对齐方式
1)设置弹性元素在侧轴上的对齐方式

在这里插入图片描述

2)未设置高度时,则弹性元素的高度默认填充容器
		align-items: stretch;
						默认值,如果弹性元素设置高度,则会沿着侧轴的起边对齐。
						如果弹性元素未设置高度,则会被拉伸,并沿着起边对齐。
						
>>>>>> 案例1
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .outer{
            width:500px;
            height:350px;
            background-color: red;;
            margin-top:200px;

            display: flex;

            
            flex-wrap:wrap;
            /* align-content: space-around; */
            /* align-items :stretch	; */
            /* justify-content:center; */
        }

        .inner{
            width:100px;
            /* height:100px; */
            background-color: blue;
            border:1px solid black;
            text-align: center;
            line-height: 100px;
            font-size: 16px;
        }
    </style>
    <body>
    <div class="outer">
        <div class="inner">1</div>
        <div class="inner">2</div>
        <div class="inner">3 </div>
        <div class="inner">4 </div>
    </div>
    </body>
    
</html>

在这里插入图片描述

>>>>>> 案例2
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .outer{
            width:500px;
            height:400pt;
            background-color: red;;
            margin-top:200px;

            display: flex;

            
            flex-wrap:wrap;
            /* align-content: stretch; */
            align-items: stretch;
            /* justify-content: space-between; */
        }

        .inner{
            width:100px;
            /* height:100px; */
            background-color: blue;
            border:1px solid black;
            text-align: center;
            line-height: 50px;
            font-size: 16px;

        }


     

    </style>
    <body>
    <div class="outer">
        <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 class="inner">6 </div>
        <div class="inner">7 </div>
        <div class="inner">8 </div>

    </div>
    </body>
    
</html>

在这里插入图片描述

3)案例
>>>>>> 单行元素
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .outer{
            width:500px;
            height:100px;
            background-color: red;;


            display: flex;

            align-items: stretch;
            /* align-items: flex-start; */
            /* align-items: flex-end; */
            /* align-items: center; */
            /* align-items:baseline; */

        }

        .inner{
            width:50px;
            height:50px;
            background-color: blue;
            border:1px solid black;
            text-align: center;
            line-height: 50px;
            font-size: 16px;
        }
    </style>
    <body>
    <div class="outer">
        <div class="inner">1</div>
        <div class="inner">2</div>
        <div class="inner">3</div>
    </div>
    </body>
    
</html>

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

>>>>>> 多行元素
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .outer{
            width:500px;
            height:400pt;
            background-color: red;;
            margin-top:200px;

            display: flex;

            
            flex-wrap:wrap;
            /* align-content: stretch; */
            align-items: stretch;
            /* justify-content: space-between; */
        }

        .inner{
            width:100px;
            /* height:100px; */
            background-color: blue;
            border:1px solid black;
            text-align: center;
            line-height: 50px;
            font-size: 16px;

        }


     

    </style>
    <body>
    <div class="outer">
        <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 class="inner">6 </div>
        <div class="inner">7 </div>
        <div class="inner">8 </div>

    </div>
    </body>
    
</html>

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.4.2 align-content 设置多行弹性元素在副轴上的对齐方式
1)align-content只能设置多行弹性元素,否则无效
>>>>>> 弹性元素在盒子中不换行,设置align-content无效
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .outer{
            width:500px;
            height:150px;
            background-color: red;;
            margin-top:200px;

            display: flex;

            
            /* flex-wrap:wrap; */
            align-content: flex-start;
        }

        .inner{
            width:100px;
            height:100px;
            background-color: blue;
            border:1px solid black;
            text-align: center;
            line-height: 50px;
            font-size: 16px;
        }
    </style>
    <body>
    <div class="outer">
        <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>
    </body>
    
</html>

在这里插入图片描述

>>>>>> 弹性元素在盒子中换行,设置align-content才会有效果
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .outer{
            width:500px;
            height:150px;
            background-color: red;;
            margin-top:200px;

            display: flex;

            
            flex-wrap:wrap;
            align-content: flex-start;
        }

        .inner{
            width:100px;
            height:100px;
            background-color: blue;
            border:1px solid black;
            text-align: center;
            line-height: 50px;
            font-size: 16px;
        }
    </style>
    <body>
    <div class="outer">
        <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>
    </body>
    
</html>

在这里插入图片描述

2)案例
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .outer{
            width:500px;
            height:300px;
            background-color: red;;
            margin-top:200px;

            display: flex;

            
            flex-wrap:wrap;
            align-content: flex-start;
        }

        .inner{
            width:100px;
            height:100px;
            background-color: blue;
            border:1px solid black;
            text-align: center;
            line-height: 50px;
            font-size: 16px;
        }
    </style>
    <body>
    <div class="outer">
        <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>
    </body>
    
</html>

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

四、弹性元素属性

	
	设置弹性元素的属性:
					order:0(默认值) | <integer>
					
					flex-shrink:1(默认值) | <number>
					
					flex-grow:0(默认值) | <number>
					
					flex-basis:auto(默认值) | <length>
					
					flex:none | auto | @flex-grow @flex-shrink @flex-basis
					
					align-self:auto(默认值) | flex-start | flex-end |center | baseline| stretch
					
4.1 order 设置弹性元素的排列顺序
		
	 order属性设置弹性元素排序的位置,默认值为0,数值越小越靠前
	
1) order设置弹性元素的排列顺序,数值越小越靠前。
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .outer{
            width:500px;
            height:300px;
            background-color: red;;
            margin-top:200px;

            display: flex;

            
            /* flex-wrap:wrap; */
            align-content: center;
        }

        .inner{
            width:100px;
            height:100px;
            background-color: blue;
            border:1px solid black;
            text-align: center;
            line-height: 50px;
            font-size: 16px;
        }


        .inner:nth-child(1){
            order:5;
        }

        .inner:nth-child(2){
            order:4;
        }

        .inner:nth-child(3){
            order:3;
        }

        .inner:nth-child(4){
            order:2;
        }

        .inner:nth-child(5){
            order:1;
        }


    </style>
    <body>
    <div class="outer">
        <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>
    </body>
    
</html>

在这里插入图片描述

2) order默认值为0,数值越小,越靠前。
	<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .outer{
            width:500px;
            height:300px;
            background-color: red;;
            margin-top:200px;

            display: flex;

            
            /* flex-wrap:wrap; */
            align-content: center;
        }

        .inner{
            width:100px;
            height:100px;
            background-color: blue;
            border:1px solid black;
            text-align: center;
            line-height: 50px;
            font-size: 16px;
        }


        .inner:nth-child(1){
            order:5;
        }

        .inner:nth-child(2){
            order:4;
        }

        /* .inner:nth-child(3){
            order:3;
        } */

        .inner:nth-child(4){
            order:2;
        }

        /* .inner:nth-child(5){
            order:1;
        } */


    </style>
    <body>
    <div class="outer">
        <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>
    </body>
    
</html>

在这里插入图片描述

4.2 flex-shrink 设置空间不足时,弹性元素在主轴上缩小比例(主轴是水平方向,设置的就是宽度;主轴是垂直,设置的就是高度)
	
	flex-shrink: num;
	
				  1) 设置弹性盒子空间不足时, 弹性元素在主轴上的缩小比例。
				  						
				  						主轴是水平方向,则是设置宽度的缩小比例。
				  						主轴是垂直水平,则是设置高度的缩小比例。		
				  						(以下案例,默认主轴都是水平方向,便于记忆)
		
				  
				  2) 弹性元素的缩小比例按照所有弹性元素设置的来进行统一划分。
				  		
				  3)	
					 flex-shrink: 1; 默认值。
								     当如果空间不足,弹性元素在主轴上的长度将缩小。仅宽度缩小。
				
					 flex-shrink: 0; 不收缩。
								     当空间不足时,弹性元素不会缩小,会溢出。仅宽度缩小。
				
					

1)flex-shrink:1,默认值,所以当空间不足时,弹性元素默认在容器中不溢出,宽度会自动等比例缩小(前提:主轴是水平方向)
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .outer{
            width:400px;
            height:40pt;
            background-color: red;;
            margin-top:200px;

            display: flex;

            
            /* flex-wrap:wrap; */
            align-content: center;
        }

        .inner{
            width:100px;
            height:100px;
            background-color: blue;
            border:1px solid black;
            text-align: center;
            line-height: 50px;
            font-size: 16px;
        }




    </style>
    <body>
    <div class="outer">
        <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>
    </body>
    
</html>

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2)flex-shrink:0,即使空间不足,该弹性元素不会缩小。会溢出
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .outer{
            width:500px;
            height:300px;
            background-color: red;;
            margin-top:200px;

            display: flex;

            
            /* flex-wrap:wrap; */
            align-content: center;
        }

        .inner{
            width:100px;
            height:100px;
            background-color: blue;
            border:1px solid black;
            text-align: center;
            line-height: 50px;
            font-size: 16px;

            /** 默认值*/
            flex-shrink: 0;
        }


    </style>
    <body>
    <div class="outer">
        <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>
    </body>
    
</html>

在这里插入图片描述

2)flex-shrink:3,设置弹性元素的缩小比例
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .outer{
            width:400px;
            height:40pt;
            background-color: red;;
            margin-top:200px;

            display: flex;

            
            /* flex-wrap:wrap; */
            align-content: center;
        }

        .inner{
            width:100px;
            height:100px;
            background-color: blue;
            border:1px solid black;
            text-align: center;
            line-height: 50px;
            font-size: 16px;
        }

        .inner:nth-child(2){
            flex-shrink: 3;
        }


    </style>
    <body>
    <div class="outer">
        <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>
    </body>
    
</html>

在这里插入图片描述

4.3 flex-grow 设置空间剩余时,弹性元素在主轴上的放大比例 (主轴是水平方向,设置的就是宽度;主轴是垂直,设置的就是高度)
	
	flex-grow : num;
	
				  1) 设置弹性盒子空间剩余时, 弹性元素的放大比例。
				  						主轴是水平方向,则是设置宽度的放大比例。
				  						主轴是垂直水平,则是设置高度的放大比例。		

						  	                
				  2) 弹性元素的放大比例按照所有弹性元素设置的来进行统一划分。
		
				  2)	
					 flex-grow : 0; 默认值。
								     当如果空间剩余时,弹性元素也不会放大。
				
					 flex-grow: 1; 放大
								     当空间不足时,弹性元素不会缩小,会溢出。仅宽度放大。
	

1)flex-grow默认值为0,所以当空间剩余时,弹性元素不会放大。
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .outer{
            width:800px;
            height:40pt;
            background-color: red;;
            margin-top:200px;

            display: flex;

            
            /* flex-wrap:wrap; */
            align-content: center;
        }

        .inner{
            width:100px;
            height:100px;
            background-color: blue;
            border:1px solid black;
            text-align: center;
            line-height: 50px;
            font-size: 16px;
        }

      
     


    </style>
    <body>
    <div class="outer">
        <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>
    </body>
    
</html>

在这里插入图片描述

2)弹性元素的放大比例按照所有弹性元素设置的来进行统一划分。
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .outer{
            width:800px;
            height:40pt;
            background-color: red;;
            margin-top:200px;

            display: flex;

            
            /* flex-wrap:wrap; */
            align-content: center;
        }

        .inner{
            width:100px;
            height:100px;
            background-color: blue;
            border:1px solid black;
            text-align: center;
            line-height: 50px;
            font-size: 16px;
        }

        .inner:nth-child(2){
            flex-grow: 2;
        }
     


    </style>
    <body>
    <div class="outer">
        <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>
    </body>
    
</html>

在这里插入图片描述
在这里插入图片描述

3)flex-grow:3。设置弹性盒子的放大比例
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .outer{
            width:800px;
            height:40pt;
            background-color: red;;
            margin-top:200px;

            display: flex;

            
            /* flex-wrap:wrap; */
            align-content: center;
        }

        .inner{
            width:100px;
            height:100px;
            background-color: blue;
            border:1px solid black;
            text-align: center;
            line-height: 50px;
            font-size: 16px;
        }

        .inner:nth-child(2){
            flex-grow: 2;
        }
     
        .inner:nth-child(3){
            flex-grow: 3;
        }

    </style>
    <body>
    <div class="outer">
        <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>
    </body>
    
</html>

在这里插入图片描述

4.4 flex-basis 设置弹性元素在主轴上的长度(主轴是水平方向,设置的就是宽度;主轴是垂直,设置的就是高度)
	  
	 flex-basis: 100px; 
					 
					 1.设置弹性元素在主轴上的长度。(主轴是水平方向,设置的就是宽度;主轴是垂直,设置的就是高度)
					 		 
					 	
					 		  
					 2.
					 	flex-basis:auto;
					 			默认值是auto,表示参考元素自身的宽度和高度。
					  	
					  	flex-basis:100px;
					   			如果设置了该值,即使设置了宽或高,也是以该值为准。
					 		
					

1)flex-basis默认值为auto,则以width为准。(主轴是水平方向,设置的就是宽度;主轴是垂直,设置的就是高度)
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .outer{
            width:800px;
            height:40pt;
            background-color: red;;
            margin-top:200px;

            display: flex;

            
            /* flex-wrap:wrap; */
            align-content: center;
        }

        .inner{
            width:100px;
            height:100px;
            background-color: blue;
            border:1px solid black;
            text-align: center;
            line-height: 50px;
            font-size: 16px;
            /* flex-basis:300px; */

        }

     

    </style>
    <body>
    <div class="outer">
        <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>
    </body>
    
</html>

在这里插入图片描述

2)设置了flex-basis:200px,则width失效。(主轴是水平方向,设置的就是宽度;主轴是垂直,设置的就是高度)
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .outer{
            width:800px;
            height:40pt;
            background-color: red;;
            margin-top:200px;

            display: flex;

            
            /* flex-wrap:wrap; */
            align-content: center;
        }

        .inner{
            width:100px;
            height:100px;
            background-color: blue;
            border:1px solid black;
            text-align: center;
            line-height: 50px;
            font-size: 16px;
            flex-basis:300px;

        }

     

    </style>
    <body>
    <div class="outer">
        <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>
    </body>
    
</html>

在这里插入图片描述

4.5 align-self 单独设置弹性元素的对其方式
   
    align-self: flex-start | flex-end | center | baseline | stretch 
	
			1)align-self是单独设置弹性元素的对齐方式。
			2)align-self只可以覆盖align-items设置的对齐方式。

								
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .outer{
            width:500px;
            height:200pt;
            background-color: red;;
            margin-top:200px;

            display: flex;

            
            flex-wrap:wrap;
            /* justify-content: space-between; */
        }

        .inner{
            width:100px;
            height:50px;
            background-color: blue;
            border:1px solid black;
            text-align: center;
            line-height: 50px;
            font-size: 16px;

        }

        .inner:nth-child(2){
            align-self: flex-end;
        }


     

    </style>
    <body>
    <div class="outer">
        <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 class="inner">6 </div>
        <div class="inner">7 </div>
        <div class="inner">8 </div>

    </div>
    </body>
    
</html>

在这里插入图片描述

4.6 flex可以设置所有元素的三个属性
	
	 flex可以设置所有元素的三个属性。
					flex:增长  缩减  基础;
			
			
			flex:1 1 auto;
			
			flex: inherit; 默认值,相当于  flex:0,1,auto; 只能减
			flex: auto;	   相当于  flex:1,1,auto; 可增可减
			flex: none;	   相当于  flex:0,0,auto; 不增不减 。表示弹性元素没有弹性,不会缩放,也会渐。



1.2 天猫弹性盒(自适应案例)
		天猫弹性盒子
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>

    <style>

        *{
            margin:0px ;
            padding:0px;
            list-style: none;

            font-size: 13px;;
        }

        .nav{
            width:100%;
            /* background-color: red;; */
        }
       

        /** 设置每一行的容器*/
        .nav-inner{
            display: flex; 
            justify-content:space-around;
        }

        .item{
            width:10%;
            /* flex:auto; */
            text-align: center;
        }

        

        .item img{
            /** 设置图片宽度和父元素宽度一致*/
            width:100%;
        }

       

    </style>
</head>
<body>

    <div class="nav">
        
            <div class="nav-inner">          
                <div class="item">
                    <a>
                        <img  src="1.png">
                        <span>天猫</span>
                    </a>
                </div>
                <div class="item">
                    <a>
                        <img  src="2.png">
                        <span>聚划算</span>
                    </a>
                </div>
                <div class="item">
                    <a>
                        <img  src="3.png">
                        <span>天猫国际</span>
                    </a>
                </div>
                <div class="item">
                    <a>
                        <img  src="4.png">
                        <span>外贸</span>
                    </a>
                </div>
                <div class="item">
                    <a>
                        <img  src="5.png">
                        <span>飞猪</span>
                    </a>
                </div>
               
            </div>

            <div class="nav-inner">          
                <div class="item">
                    <a>
                        <img  src="1.png">
                        <span>天猫</span>
                    </a>
                </div>
                <div class="item">
                    <a>
                        <img  src="2.png">
                        <span>聚划算</span>
                    </a>
                </div>
                <div class="item">
                    <a>
                        <img  src="3.png">
                        <span>天猫国际</span>
                    </a>
                </div>
                <div class="item">
                    <a>
                        <img  src="4.png">
                        <span>外贸</span>
                    </a>
                </div>
                <div class="item">
                    <a>
                        <img  src="5.png">
                        <span>飞猪</span>
                    </a>
                </div>
               
            </div>


    </div>
    
</body>
</html>

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值