Flex ,弹性布局

113 阅读4分钟

Flex 是Flexible Box的缩写,用来为盒状模型提供最大的灵活性。

  • 任何一个容器都可以指定为 Flex 布局;
  • 行内元素也可以使用 Flex 布局;

注意:

设为 Flex 布局以后,子元素的 float、clear 和 vertical-align 属性将失效。

本文章主要示例align-item 和 align-comtent 属性 和 项目属性

基本概念

采用 Flex 布局的元素,成为 Flex 容器(flex container),简称”容器“。它的所有子元素自动成为容器成员,成为 Flex 项目(flex item),简称”项目“。

flex_bg.png

如上图

  • flex-direction决定了主轴(main axis)的方向,下面会说到这个容器属性;
  • 容器默认存在两根轴 :水平的主轴 (main axis)和垂直的交叉轴 (cross axis)。主轴的开始位置(与边框的交叉点)叫做main start,结束的位置叫做main end;
  • 交叉轴开的围追叫做cross start,结束的位置叫做 cross end。
  • 项目默认沿着主轴排列。单个项目占据的主轴空间叫做 main size,占据的交叉轴叫做 cross size。

把元素设置成弹性布局

display: flex;

// 把元素的css属性dispaly,设置成flexdisplay: flex;

容器属性,6个

  1. flex-direction,属性决定主轴的方向(即项目的排列方向)
  • flex-direction,有四个取值row(默认值)、row-reverse、columncolumn-reverse
    
  • row(默认值):主轴为水平方向,起点在左端。
  • row-reverse:主轴为水平方向,起点在右端。
  • column:主轴为垂直方向,起点在上沿。
  • column-reverse:主轴为垂直方向,起点在下沿。
      1. 主轴方向默认是水平方向,从左到右,如下图

image.png 1. 2.flex-direction: row-reverse;主轴方向由水平方向,从右到左,如下图

image.png

  • flex-direction属性,示例代码如下:
<!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-direction属性决定主轴的方向(即项目的排列方向)</title>
    <style>
        .container {
            width: 600px;
            height: 300px;
            margin: 0 auto;
            background: pink;
            display: flex;
            /* 默认是 row */
            flex-direction: row;
            /* 当排列水平反转 从右到左 */
            /* flex-direction: row-reverse; */
        }

        .childitem {
            width: 100px;
            height: 100px;
            background: honeydew;
            border: 1px solid snow;

        }
    </style>
</head>
<body>

    <div class="container">

        <div class="childitem">
            1
        </div>
        <div class="childitem">
            2
        </div>
        <div class="childitem">
            3
        </div>
        <div class="childitem">
            4
        </div>
        <div class="childitem">
            5
        </div>
    </div>
    
</body>
</html>
  1. flex-wrap 默认 nowrap 不换行
  • 这里的示例图用的还是上方的代码。
  • 代码如下,这里只改了.container里的属性
.container {
    width: 600px;
    height: 300px;
    margin: 0 auto;
    background: pink;
    display: flex;
    /* 不换行 */
    /* flex-wrap: nowrap; */
    /* 换行 */
    flex-wrap: wrap;
} */

    1. flex-wrap: nowrap;默认不换行,如图,可以看到子元素缩小了。

image.png

    1. flex-wrap: wrap;换行,如图,可以看到子元素又变回原来设置的大小。

image.png

- `下面直接示例,align-item 和 align-comtent 属性`

3. flex-flow属性是flex-direction属性和flex-wrap属性的简写形式,默认值为 row nowrap 4. justify-content 属性定义了项目在主轴上的对齐方式。 5. align-items 属性定义项目在交叉轴上对齐方式

  • 这里展示的是多行,这样容易看到和align-content的区别,重点就是多行
  • 使用align-items时效果如下 image.png
  • 代码如下
.container {
    width: 600px;
    height: 300px;
    margin: 0 auto;
    background: pink;
    display: flex;
    flex-wrap: wrap;
    align-items: center;
 }

  1. align-content属性定义了多根轴线的对齐方式。如果项目只有一根轴线,该属性不起作用。
  • 当align-content 设置成center
  • 使用align-content时效果如下 image.png
  • 代码如下
.container {
    width: 600px;
    height: 300px;
    margin: 0 auto;
    background: pink;
    display: flex;
    flex-wrap: wrap;
    align-content: center;
}

项目的属性,6个(理解)

  1. order属性定义项目的排列顺序,数值越小,排列越靠前,默认为0。

  2. flex-grow 属性定义项目的放大比例,默认为0,即如果存在剩余空间,也不放大。(理解:当容器项目少的时候 单个项目不设置其他属性要铺满 不合理)

  3. flex-shrink属性定义了项目的缩小比例,默认为1,即若果空间不足,该项目将缩小.(理解:因为flex-wrap默认是不换行,所以当容器项目多的时候单个项目要随着缩小)

  4. flex-basis属性定义了在分配多余空间之前,项目占据的主轴空间(main size)。浏览器根据这个属性,计算主轴是否有多余的空间。 它的默认值为auto,即项目的本来大小。

  5. flex 属性是flex-frow、flex-shrink 和flex-basis 的简写,默认值为 0 1 auto;

  6. align-self属性允许单个项目有与其他项目不一样的对齐方式,可覆盖align-items属性。默认值auto,表示继承父元素的 align-items属性,如果没有 父元素,则等同于strectch。

flex,语法推荐阮老师的flex语法教程