Flex布局详解

一.Flex布局初体验

1.1 传统布局与Flex布局对比

传统布局:
(1)兼容性好
(2)布局繁琐
(3)局限性,不能在移动端很好的布局
flex布局:(1)操作方便,布局极为简单,移动端应用广泛

(2)pc端浏览器支持情况较差
(3)IE11或更低版本,不支持或仅部分支持
建议:
(1)pc端页面使用传统布局
(2)移动端或者是不考虑兼容性问题的pc端,使用flex弹性布局

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>Flex布局title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }        
        div {
            display: flex;
            justify-content: space-between;
            width: 60%;
            height: 300px;
            background-color: pink;
        }
       
        div span {
            flex: 1;
            /* width: 150px; */
            height: 100px;
            background-color: red;
            margin-right: 10px;
        }
    style>
head>

<body>
    <div>
        <span>leftspan>
        <span>centerspan>
        <span>rightspan>
    div>
body>

html>

效果如下:

二 Flex布局原理

flex是flexible Box的缩写,顾名思义就是弹性布局,用来为盒子模型提供最大的灵活性,任何一个容器都可以指定为flex布局。

使用时应该注意些什么?

  1.伸缩布局=弹性布局=伸缩盒布局=弹性盒布局=flex布局

  2.在父级元素设置为flex布局后,子元素的float、clear、vertical-align属性都将失效,所以在使用flex布局时,不应该先设置完子元素布局后再使用。

  3.采用Flex布局的元素,称为flex容器,它的所有子元素自动成为容器成员,简称‘项目’

总结Flex布局

  就是通过给父盒子添加flex属性,来控制子盒子的位置与排列方式。

三.Flex布局父级常见属性

3.1.以下是父级元素6个常见的属性设置

  • flex-direction:设置主轴的方向
  • justify-content:设置主轴上的子元素的排列方式
  • flex-wrap:设置子元素是否换行
  • algin-content:设置侧轴上的子元素的排列方式(相对多行来说)
  • align-items:设置侧轴上的子元素的排列方式(相对单行来说)
  • flex-flow:复合属性,相当于同时设置了flex-direction与flex-wrap

3.2 flex-direction:设置主轴的方向

  在flex布局中,是分主轴与侧轴2个方向,即X轴与Y轴

  • 默认方向是X轴,水平向右
  • 默认侧轴方向是Y轴,水平向下
  • 注意:主轴和侧轴是相对的,是会变化的,就是看flex-direction设置的谁为主轴,剩下的就是侧轴。

       

3.3 justify-content主轴上子元素排列方式

  注意:在使用这个属性之前一定得先确定主轴的方向

  

3.3.1试验代码如下

 div {
            /* 给父级元素设计flex布局 */
            display: flex;
            width: 600px;
            height: 300px;
            background-color: pink;
            /* 默认的主轴是x轴 */
            flex-direction: row;
            /* justify-content是设置主轴上子元素的排列方式 */
            /* 1.justify-content: flex-start; */
            /* 2.justify-content: flex-end; */
            /* 设置子元素居中对齐 */
            /* 3.justify-content: center; */
            /* 平分剩余空间 */
            /* 4.justify-content: space-around; */
            /* 先贴边再平均分配剩余空间 */
            justify-content: space-between;
        }
        
        div span {
            width: 150px;
            height: 100px;
            background-color: red;
        }

 
    
 
        left
        center
        right

    
 
 

3.3.2效果如图:

 

3.4 flex-wrap 设置子元素是否换行

默认情况下,项目都在一条轴线上,即是默认是不换行的,如果父级元素的宽度装不下,则会缩小子元素的宽度,装到父元素中

  div {
            display: flex;
            width: 600px;
            height: 300px;
            background-color: pink;
            /* 默认是不换行的 */
            /* flex-wrap: nowrap; */
            /* 子元素换行显示 */
            flex-wrap: wrap;
        }

3.5 algin-items 设置侧轴(默认是y轴)上的子元素的排列(单行),其中(垂直居中使用较多)

试验代码

  div {
            display: flex;
            width: 600px;
            height: 300px;
            background-color: pink;
            justify-content: center;
            /* 侧轴上子元素水平居中 使用较多*/
            align-items: center;
            /* 拉伸,但子元素不要给高度,否则会没效果 */
            /* align-items: stretch; */
        }
 div span {
            width: 150px;
            height: 100px;
            background-color: red;
            margin-left: 10px;
        }
 

效果图:

3.6 algin-items 设置侧轴(默认是y轴)上的子元素的排列多行

试验代码

  div {
            display: flex;
            width: 700px;
            height: 300px;
            background-color: pink;
            /* 换行 */
            flex-wrap: wrap;
            /* 因为有了换行,所以我们用控制子元素对齐的方式algin-content */
            /* align-content: center; */
            /* align-content: space-around; */
             align-content: space-between; 
        }
        
        div span {
            width: 150px;
            height: 100px;
            background-color: red;
            margin: 10px;
        }

效果图:

3.7 flex-flow 是flex-direction与flex-wrap的简写

当你使用这个属性的时候,你可以使用上述两个的属性值,例如:flex-flow: row wrap;(水平排列,多行显示)

 

4.Flex布局常见的子项元素属性

  • flex子项目占的份数
  • algin-self控制子项目自己在侧轴上的排列方式
  • order属性定义子项的排列顺序

4.1flex属性:定义子项目分配的剩余空间,用flex来表示占多少份数

试验代码:

 <style>
        .nav {
            display: flex;
            width: 60%;
            height: 150px;
            background-color: pink;
            margin: 0 auto;
        }
        
        .left {
            width: 100px;
            height: 150px;
            background-color: red;
        }
        
        .center {
            flex: 1;
            background-color: green;
        }
        
        .right {
            width: 100px;
            height: 150px;
            background-color: purple;
        }
    style>
<body>
    <div class="nav">
        <div class="left">leftdiv>
        <div class="center">centerdiv>
        <div class="right">rightdiv>
    div>
body>

效果图如下:

4.2.align-self属性

允许单个子项目有与其他子项目不同的对齐方式。默认值为auto,表示继承父元素的align-items,如果没有父元素等同于stretch。

代码试验:

 <style>
        div {
            display: flex;
            width: 600px;
            height: 300px;
            background-color: pink;
            justify-content: space-between;
        }
        
        div span {
            width: 150px;
            height: 150px;
            background-color: red;
            /* margin-right: 5px; */
        }
        
        div span:nth-child(2) {
            /* 让中间的盒子垂直居中 */
            align-self: center;
        }
    style>

<body>
    <div>
        <span>1span>
        <span>2span>
        <span>3span>

    div>
body>

效果图如下:

4.3 order属性

order属性设置项目排序的位置,默认值为0,数值越小越靠前

注意:与z-index不一样

代码试验;

 <style>
        div {
            display: flex;
            width: 600px;
            height: 300px;
            background-color: pink;
            justify-content: space-between;
        }
        
        div span {
            width: 150px;
            height: 150px;
            background-color: red;
            /* margin-right: 5px; */
        }
        
        div span:nth-child(3) {
            /* 默认是0,-2比0小 */
            order: -2;
        }
        
        div span:nth-child(2) {
            /* 让中间的盒子垂直居中 */
            align-self: center;
            order: -1;
        }
    style>

效果图如下(把3与1互换位置):

 

希望能够对大家与所帮助,如果有错误,还请各位指正,总结不易,谢谢大家哈!

 

posted @ 2021-06-14 18:37  小吴3  阅读(471)  评论(0编辑  收藏  举报