Flex布局基础知识

Flex布局

今天在学习css的时候,学到了一个新的布局方式:Flex布局(弹性盒布局)。本人认为挺重要的,首写博客来巩固一下自己今天所学的有关Flex布局的知识,并与大家分享,内容如有错误,欢迎大家来给我指点一下。


> 本章节使用的基础代码(开启flex之前)

<style>
        .wrapper{
            width: 800px;
            border: red solid 5px;
        }
        .box1,.box2,.box3{
            width: 100px;
            height: 100px;
        }
        .box1{
            background-color: royalblue;
        }
        .box2{
            background-color:yellow;
        }
        .box3{
            background-color: salmon;
        }
    </style>
<body>
    <div class="wrapper">
        <div class="box1">1</div>
        <div class="box2">2</div>
        <div class="box3">3</div>
    </div>
    
</body>

初始效果

Flex简介

Flex布局又称弹性盒布局,是css布局中的一个手段。主要是代替浮动来完成页面布局。
在没有Flex布局的时候,css主要是通过Float来水平布局,但是因为Float是为了文字排版才出现的一种技术,因此会有很多问题。例如:高度塌陷的问题。
可以这样理解,Flex布局之所以被称为弹性盒布局是因为flex可以使元素具有弹性,可随页面大小的变化而变化。
Flex有一个缺点就是浏览器的兼容性不够好。例如对于IE是失效的

弹性容器

要使用Flex布局,必须将元素设置为弹性容器。

/* 开启弹性布局的两种方式 */
  display: flex;         /*设置为块级的弹性容器*/
  display: inline-flex; /*设置为行内的弹性容器*/
  /*两者的主要区别在于在弹性容器是否会占据页面一行
	设置为块级的弹性容器后,弹性容器外的元素会在其的下一行出现。
	设置为行内的弹性容器且弹性容器并未占满一行,弹性容器外的元素会在其的后面出现*/

对.wrapper设置为弹性容器后效果如下
可见其水平排列效果

弹性元素

弹性容器的子元素就是弹性元素。注意:子孙元素不行。
一个元素既可以是弹性容器也可以是弹性元素。

<div class="wrapper">/*在给wrapper设置弹性容器*/
        <div class="box1"> /*box1,box2,box3即为弹性元素*/
            <div class="box4"></div> /*box4是wrapper的子孙元素,不是弹性元素*/
        </div>
        <div class="box2"></div>
        <div class="box3"></div>
    </div>

主轴与纵轴

先提前介绍一个弹性容器样式:flex-direction 指定弹性元素在弹性容器内的排列方向

/*flex-direction: 指定弹性元素在弹性容器内的排列方向 默认值:row 
    			row:水平排列(自左向右排列) 
	            row-reverse:反向水平排列(自右向左排列)
	            column:纵向排列(自上向下排列)
	            column-reverse:反向纵向排列(自下向上排列)*/
 flex-direction:column-reverse;

主轴:弹性元素的排列方向为主轴
侧轴:与弹性元素垂直的轴称为侧轴
如:当flex-direction:row时,主轴方向为自左向右 侧轴就是自上向下
当flex-direction:column-reverse时,主轴方向为自下向上 侧轴就是自右向左
按此类推
当flex-direction:row时:
在这里插入图片描述
当flex-direction:column-reverse;
在这里插入图片描述

弹性容器样式

弹性容器样式是为弹性容器设置的属性。

1.上面已经讲过的flex-direction

  1. flex-wrap:设置弹性元素是否在弹性容器内自动换行 默认值:nowrap
    nowrap:元素不会自动换行
    wrap:元素沿着侧轴方向换行
    wrap-reverse:元素沿着侧轴的反方向换行`
    这就是上面判断主轴和侧轴的作用
.wrapper{
            width: 200px;
            border: red solid 5px;
            /* 开启弹性布局的两种方式 */
            display: flex;
            flex-direction:row;

            /*flex-wrap:设置弹性元素是否在弹性容器内自动换行 默认值:nowrap
            nowrap:元素不会自动换行
            wrap:元素沿着侧轴方向换行
            wrap-reverse:元素沿着侧轴的反方向换行
              */
            flex-wrap: wrap;
        }
        .box1,.box2,.box3{
            width: 100px;
            height: 100px;
            /*先设置弹性元素不收缩*/
		    flex-shrink: 0;
        }
        .box1{
            background-color: royalblue;
        }
        .box2{
            background-color:yellow;
        }
        .box3{
            background-color: salmon;
        }

以主轴方向为row为例。
flex-wrap: nowrap;很明显看到其内部弹性元素不会换行
很明显看到其不会换行
flex-wrap: wrap;很明显看到内部弹性元素自上到下换行
在这里插入图片描述
flex-wrap:wrap-reverse;很明显看到内部弹性元素自下到上换行
在这里插入图片描述

flex-flow: 是上面两个属性direction和wrap的简写属性
如:flex-flow: column wrap;设置主轴方向是从上到下, 元素沿着侧轴方向换行。

justify-content: 分配主轴上的空白空间,改变主轴元素的排列方式
可选项:
flex-start:元素沿主轴起边开始排列
flex-end:元素沿主轴终边开始排列
center:元素居中排列
space-around:空白分布到两侧
space-between:空白均匀分布到元素之间
space-envenly: 空白均匀分布在元素单侧(此项兼容性不高,如IE浏览器不兼容)
justify-content: flex-start;
在这里插入图片描述
justify-content: flex-end;
在这里插入图片描述
justify-content: center;
在这里插入图片描述
justify-content: space-around;
在这里插入图片描述
justify-content: space-between;
在这里插入图片描述
justify-content: space-envenly;
在这里插入图片描述

align-items: 每个元素在侧轴上的对齐方式
可选项:
stretch 默认值,在同一行每个元素之间的高度相同,不同行的高度可不同
flex-start 沿侧轴的起始边对齐,不会伸展
flex-end 沿侧轴的末尾边对齐
center 居中对齐
align-items: stretch;的情况
在这里插入图片描述
align-items: flex-start ;的情况
在这里插入图片描述
align-items: flex-end ;的情况在这里插入图片描述
align-items: center;的情况
在这里插入图片描述

align-content: 分配侧轴上的空白空间
可选项:
flex-start:元素沿侧轴起边开始排列
flex-end:元素沿侧轴终边开始排列
center:元素居中排列
space-around:空白分布到两侧
space-between:空白均匀分布到元素之间
space-envenly: 空白均匀分布在元素单侧(此项兼容性不高,如IE浏览器不兼容)
跟justify-content:差不多。只不过一个是在主轴一个是在侧轴

align-items 和align-content的区别
根据上面我们可以发现align-items和align-content都是对侧轴进行作用的。align-items和align-content有相同的功能,但是align-items是对侧轴上的每个元素进行作用。align-content则是对``整个容器进行作用且align-content属性只适用于多行的flex容器。
举个例子理解一下
flex-flow: row wrap;/*给容器设置方向并换行使其成为多行容器*/
在这里插入图片描述
align-items:center;
下面就是设置了align-items:center且没有设置align-content的情况。
在这里插入图片描述
不设置align-items,设置align-content:center;的情况
在这里插入图片描述
通过上面这组可以对比到他们两个方式的不同,align-items是给每个元素的每一行都进行居中。而align-content这是对这整个容器的元素进行居中排列。

若同时设置align-items:center; align-content:center;效果会是跟只设置align-content:center;的效果一样。这说明了对于有多行的flex容器,align-content的优先级大于align-items。
若设置弹性容器不进行换行,设置align-content会不起作用,这说明了align-content属性只适用于多行的flex容器。

弹性元素样式

弹性元素样式是为弹性元素设置的属性

flex-grow: 指定弹性元素的伸展系数 默认值:0
当没有给弹性元素设定flex-grow时,弹性元素不伸展,即等于0
flex-grow:1 弹性元素伸展,且均匀伸展填充满空位
同时可以分别给每个弹性容器内的弹性元素分别设置flex-grow,使每个弹性元素按不同比例伸展。、

.box1,.box2,.box3{
            width: 100px;
            height: 100px;
            flex-grow: 0;
        }

flex-grow: 0;的情况
在这里插入图片描述
flex-grow:1的情况
在这里插入图片描述
分别给每个弹性元素设置flex-grow

.box1{
            background-color: royalblue;
            flex-grow: 1;
        }
        .box2{
            background-color:yellow;
            flex-grow: 2;
        }
        .box3{
            background-color: salmon;
            flex-grow: 3;
        }

效果如下:
解释:这个弹性容器warpper的总宽度设定为800px,原先box1,box2,box3都是宽度高度为100px。
所以就会剩下500px的空白。因为设置了flex-grow不为0,所以box1的宽度会是100px+500*(1/6)px,box2的宽度会是100px+500*(2/6)px,box3的宽度会是100px+500*(3/6)px。

在这里插入图片描述

flex-shrink: 指定弹性元素的收缩系数 默认值:1
flex-shrink:1 当弹性元素的宽度或者高度超过弹性容器的高度和宽度的时候,弹性容器下的弹性元素会均匀收缩
当flex-shrink:0 弹性元素不收缩,就会溢出父类元素。
同样也可以分别对每个的弹性元素设置不同的flex-shrink. flex-shrink越大,收缩越大。

/*已将父类wrapper的width设为200px*/
        .box1,.box2,.box3{
            width: 100px;
            height: 100px;
			flex-shrink: 1; 
        }

flex-shrink:1的情况
在这里插入图片描述
flex-shrink:0的情况
在这里插入图片描述
分别给每个弹性元素设置flex-shrink的情况
在这里插入图片描述

flex-basis:设置元素在主轴上的基础长度。

flex:可以设置弹性元素的三个样式(flex-grow,flex-shrink,flex-basis)
例如:flex:1,1,auto;

order:设置弹性元素的排列顺序
根据下图可以观察到设置order后,.box3排在了第一,box2排在了最后,改变了元素的排列顺序

       .box1{
            background-color: royalblue;
            order: 2;
        }
        .box2{
            background-color:yellow;
            order: 3;
        }
        .box3{
            background-color: salmon;
            order: 1;
        }

在这里插入图片描述

align-self:用来覆盖当前弹性元素的align-items属性,就是我们可以单独的给一个弹性元素设置不同的align-items属性。
举个例子:
当前整个情况是这样子的,每个元素都是在每一行处于居中位置。
在这里插入图片描述
当我们在给box1(蓝色那个元素)设置align-self:flex-end;后可以观察到蓝色的元素到达了当行的底部,即单独改变了box1的布局情况
在这里插入图片描述

原创文章 1 获赞 1 访问量 88

猜你喜欢

转载自blog.csdn.net/weixin_46064091/article/details/105371982