弹性盒布局

1.弹性元素

+ 从元素类型分类

=> 行内元素 inline

=> 块级元素 block

=> 行内块级元素 inline-block

=> 弹性元素 flex(弹性元素不弹自己, 弹儿子)

2.弹性盒子:是用来控制子元素的布局的。

约定:

+ 我们管写了 display: flex(形成弹性盒子的语句) 的元素叫做 弹性父元素(容器)

+ 管写了 display: flex 的元素的直系子元素叫做 弹性子元素(所有弹性盒子里面的子元素)

特点:

        1.元素如果变成弹性盒子,里面的子元素默认会横向排列

        2.当父元素变成弹性盒子之后。子元素无论是什么元素类型都能直接设置宽高

        3.margin:auto是生效的

        4.如果子元素总宽度大于父元素,那么是不会超出父盒子,也不会自动换行,而是会挤压。

3.当一个元素开启了弹性布局以后, 会在浏览器出现一些默认弹性情况

1. 会生成一条主轴

=> 主轴方向是从左到右

        以下五点均是父元素身上的属性

                ①主轴到底在哪个方向需要我们去设定。

                        如果主轴为横向的,那么侧轴就是纵向的

                        如果主轴为纵向的,那么侧轴就是横向的。

                        元素默认情况下都是沿着主轴排列的。   

                ② 如何设置主轴: flex-direction

                        row====将主轴设置为横向,元素会从左到右横向排列====默认值(常用)

                        row-reverse===元素会从右到左排列

                        column==将主轴设置为纵向,元素会从上到下纵向排列(常用)

                        column-reverse==从下到上排列

                   ③.设置子元素在主轴的对齐方式:justify-content

                        flex-start===元素放在主轴的起点

                        flex-end===元素放在主轴的终点

                        center===元素放在主轴的中间====常用

                        space-between===元素的2端对齐(第一个和最后一个会贴边,中间元素间距自动分配)===常用

                        space-around===中间元素的间距是贴边元素间距的2倍===常用

                        space-evenly===元素与元素的间距完全是一样的

                    ④设置子元素在侧轴(交叉轴)的对齐方式:align-items

                        flex-start====元素放在侧轴的起点

                        flex-end=====元素放在侧轴的终点

                        center=====元素放在侧轴的中间====常用

                        baseline===元素基线对齐(这个不做研究,大多数情况下和flex-start效果一样)

                        stretch====拉伸,要想看到效果子元素一定不能定宽度或者高度

                            如果侧轴在纵向,就不能定高度

                            如果侧轴在横向,就不能定宽度

                    ⑤如何让子元素换行flex-wrap

                        nowrap===不换行,默认值

                        wrap===换行

                        wrap-reverse===反向换行

        写在子元素身上的属性:

                1.align-self====控制自己在侧轴上的对齐方式(想当都调整谁,就给谁写)

                        flex-end

                        center

                        baseline

                        stretch

            2.order:排序,控制子元素的排列顺序,数字越大越往后排,默认0,支持负数

                        注意:不带单位

                        非必要不调整

            3.flex:数字;   用来分配剩余空间的

            4.flex-shrink:======元素是否挤压,一般用于制作移动端的横向滚动。

                        a)0=====不挤压

                       b)1=====挤压(默认值)

     

    5.多行对齐方式(对于单行子元素,该属性不起作用。)align-content

        flex-start===多行元素统一放在起点,行与行之间没有间距

        flex-end===多行元素统一放在终点,行与行之间没有间距

        center===多行元素统一放在中间,行与行之间没有间距

        space-between===第一行和最后一行贴边,中间行间距自动分配

        space-around====中间间距是贴边间距的2倍

2. 会生成一条侧轴

=> 侧轴方向是从上到下

=> 侧轴永远垂直于主轴

3. 弹性子元素在主轴方向上的排列方式

=> 默认从主轴开始方向向主轴结束方向排列

4. 尺寸问题

=> 当弹性子元素不设置宽高的时候

=> 主轴方向尺寸默认是元素内容的尺寸, 如果没有内容, 那么就是 0

=> 侧轴方向尺寸默认是侧轴长度, 父元素盒子长度

5. 弹性元素排列

=> 默认永不换行

=> 当子元素超出父元素范围的时候, 会默认挤压子元素内容区域

=> 当挤压到内容区域, 不能继续挤压的时候, 直接溢出父盒子

6. 允许换行以后, 会出现多条临时侧轴

=> 换多少行, 出现多少个临时侧轴

=> 多条临时侧轴的长度是一致的

4.书写在弹性父元素身上的样式

1. 主轴方向调整

=> 样式: flex-direction

=> 取值:

-> 默认: row 横向从左到右, 侧轴从上到下

-> row-reverse 横向从右到左, 侧轴从上到下

-> column 纵向从上到下, 侧轴从左到右

-> column-reverse 纵向从下到上, 侧轴从左到右

=> 注意:

-> 主轴可以有四种方向选择

-> 侧轴只能是 从左到右 或者 从上到下

2. 元素在主轴上的排列方式

=> 样式: justify-content

=> 取值:

-> 默认: flex-start 把所有元素当做一个整体排列在主轴开始位置

-> flex-end 把所有元素当做一个整体排列在主轴的结束位置

-> center 把所有元素当做一个整体排列在主轴居中的位置

-> space-between 把所有元素空余位置均分放在每两个元素之间(6个元素, 5个空)

-> space-around 把所有元素空余位置均分放在每个元素的两边(6个元素, 12个空)

-> space-evenly 把所有元素空余位置坐一个绝对均分(6个元素, 7个空)

(注意: space-evenly, 安卓不好使, ios 好使)

3. 允许换行

=> 样式: flex-wrap

=> 取值:

-> 默认: no-wrap 不允许换行

-> wrap 允许换行

-> wrap-reverse 允许换行并反转

4. 当行时侧轴的排列方式

=> 样式: align-items

=> 取值:

-> 默认: flex-start 在侧轴开始排列

-> flex-end 在侧轴结束排列

-> center 在侧轴居中位置排列

=> 注意: 当弹性子元素是多行的时候, 这个样式是有效果的

-> 当多行的时候使用 align-items 是以每一个临时侧轴为基准进行位置调整

5. 多行时侧轴的排列方式

=> 样式: align-content

=> 取值:

-> flex-start 把所有行元素当做一个整体排列在整体侧轴开始位置

-> flex-end 把所有行元素当做一个整体排列在整体侧轴结束位置

-> center 把所有行元素当做一个整体排列在整体侧轴居中位置

-> space-between 把所有行空余位置均分放在每两行之间(3行, 2个空)

-> space-around 把所有行空余位置均分放在每行两边(3行, 6个空)

-> space-evenly 把所有行空余位置绝对均分(3行, 4个空)

=> 注意: 当弹性子元素为单行的时候, 这个样式是没有效果的       

<!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: 0;
      padding: 0;
      list-style: none;
    }

    ul {
      width: 1000px;
      height: 800px;
      background-color: skyblue;

      /* 开启弹性布局方式 */
      display: flex;

      /* 调整主轴方向 */
      /* flex-direction: column-reverse; */

      /* 元素在主轴方向上的排列方式 */
      justify-content: space-between;

      /* 主轴方向允许换行 */
      flex-wrap: wrap;

      /* 单行时侧轴排列方式 */
      align-items: flex-end;

      /* 多行时侧轴排列方式 */
      /* align-content: space-evenly; */
    }

    li {
      width: 100px;
      height: 100px;
      background-color: pink;
      font-size: 50px;
      line-height: 100px;
      color: #fff;
      text-align: center;
    }
  </style>
</head>
<body>

  <ul>
    <li>1</li>
    <li>2</li>
    <li>3</li>
    <li>4</li>
    <li>5</li>
    <li>6</li>
    <li>7</li>
    <li>8</li>
    <li>9</li>
    <li>10</li>
    <li>11</li>
    <li>12</li>
    <li>13</li>
    <li>14</li>
    <li>15</li>
    <li>16</li>
    <li>17</li>
    <li>18</li>
    <li>19</li>
    <li>20</li>
    <li>21</li>
    <li>22</li>
    <li>23</li>
    <li>24</li>
    <li>25</li>
    <li>26</li>
    <li>27</li>
    <li>28</li>
    <li>29</li>
    <li>30</li>
    <li>31</li>
    <li>32</li>
  </ul>


</body>
</html>

 效果图: 

                        弹性子元素相关样式

弹性子元素相关的样式

1. 单独调整自己在侧轴上的排列位置

=> 多行的时候, 是单独调整自己在单独侧轴上的排列方式

=> 样式: align-self

=> 取值:

-> flex-start 自己放在侧轴的开始

-> flex-end 自己放在侧轴的结束

-> center 自己放在侧轴的中间

2. 元素顺序排列

=> 样式: order

=> 取值: 一个数字, 数字越大越靠后

3. 元素的默认尺寸设置

=> 样式: flex

=> 取值: 一个数字, 按比例计算

=> 计算方式

-> 当你给多个元素设置了 flex 样式以后

-> 首先计算非固定尺寸以外的数据(以下面结构为例, 剩余尺寸是 600)

-> 计算所有带有 flex 样式的元素的总和作为基数(以下面结构为例, flex 总基数就是 30)

-> 按照每一个元素的 flex 份数开始分配总剩余空间

+ 以下面结构为例

+ 2号元素就占据 600 的 8/30

+ 4号元素就占据 600 的 22/30

=> 注意:

-> 当我们不开启换行的时候, 元素如果超出父元素范围, 会挤压元素

-> 当你有了 flex 的元素, 会优先挤压

-> 挤压到 flex 的元素不能继续挤压了, 才会开始去挤压固定宽度元素

4. 是否允许挤压元素

=> 样式: flex-shrink

=> 取值: 0 or 1

-> 0 表示不参与压缩

-> 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>
    * {
      margin: 0;
      padding: 0;
      list-style: none;
    }

    ul {
      width: 1000px;
      height: 800px;
      background-color: skyblue;

      margin: 50px auto;

      display: flex;

      /* 侧轴方向上的排列 */
      align-items: center;

      /* flex-wrap: wrap; */
    }

    li {
      width: 100px;
      height: 100px;
      background-color: pink;
      font-size: 40px;
      color: #fff;
      /* display: flex;
      justify-content: center;
      align-items: center; */

      line-height: 100px;
      text-align: center;
    }

    /* 单独调整每一个元素自己在侧轴上的位置 */
    /* li:nth-child(2) {
      align-self: flex-start;
    }

    li:nth-child(5) {
      align-self: flex-end;
    } */


    /* li:nth-child(3) {
      order: 9999;
    } */


    li:nth-child(2) {
      /* 表示 2号 li 元素不参与压缩 */
      flex-shrink: 0;
    }
  </style>
</head>
<body>


  <ul>
    <!-- <li style="width: 100px;">1</li>
    <li style="flex: 4;">2</li>
    <li style="width: 100px;">3</li>
    <li style="width: 100px;">4</li>
    <li style="flex: 6;">5</li>
    <li style="width: 100px;">6</li> -->

    <li>1</li>
    <li>2</li>
    <li>3</li>
    <li>4</li>
    <li>5</li>
    <li>6</li>
    <li>7</li>
    <li>8</li>
    <li>9</li>
    <li>10</li>
    <li>11</li>
    <li>12</li>
    <li>13</li>
    <li>14</li>
    <li>15</li>
    <li>16</li>
    <li>17</li>
    <li>18</li>
    <li>19</li>
    <li>20</li>
    <li>21</li>
    <li>22</li>
    <li>23</li>
    <li>24</li>
    <li>25</li>
    <li>26</li>
    <li>27</li>
    <li>28</li>
    <li>29</li>
    <li>30</li>
    <li>31</li>
    <li>32</li>
    <li>33</li>
  </ul>
</body>
</html>

效果图:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我是打工人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值