CruxF / Blog

个人博客,记载学习的点点滴滴,怕什么技术无穷,进一寸有一寸的欢喜:sparkles:
63 stars 19 forks source link

flexbox布局属性分析和小demo #9

Closed CruxF closed 4 years ago

CruxF commented 6 years ago

什么是flexbox布局?

flexbox的出现是为了解决逐渐复杂的web布局问题,因为这种布局方式很灵活。容器的子元素可以任意方向进行排列。 flex布局模型不同于块模型布局和内联模型布局,块和内联模型的布局计算依赖于块和内联的流方向,而flex布局依赖于flex directions。简单的说:flexbox是布局模块,而不是一个简单的属性,它包含父元素(flex container)和子元素(flex items)的属性。

flexbox布局属性全解析

强大且灵活的flexbox布局,让广大的前端开发者省去了解决盒子浮动所带来的苦恼。在如今手机端开发成为主流时代的,这种布局尤为重要,下面我们一起看看flexbox布局中各种属性所发挥的作用。

1、display(flex container)属性

这个属性是在父元素中设置的,当父元素设置了该属性,那么默认其中的子元素横向布局,就和浮动布局一般,下面来看代码:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title></title>
    <style>
      .box {
        display: flex;
        display: -webkit-flex;
      }
      .item1, .item2, .item3 {
        background: #FFA500;
        padding: 10px;
        height: 100px;
        width: 80px;
        margin-top: 10px;
        margin-right: 10px;
        text-align: center;
      }
    </style>
  </head>
  <body>
    <div class="box">
      <div class="item1">row1</div>
      <div class="item2">row2</div>
      <div class="item3">row3</div>
    </div>
  </body>
</html>

点击我看演示效果哦。

2、flex-direction(flex container)属性

这个属性在父元素中定义,作用是改变子元素的布局方向,主要有以下几个属性值:

下面贴一部分代码:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title></title>
    <style>
      .box {
        display: flex;
        display: -webkit-flex;
        flex-direction: column;
      }
      .item1, .item2, .item3 {
        background: #FFA500;
        padding: 10px;
        height: 100px;
        width: 80px;
        margin-top: 10px;
        margin-right: 10px;
        text-align: center;
      }
    </style>
  </head>
  <body>
    <div class="box">
      <div class="item1">row1</div>
      <div class="item2">row2</div>
      <div class="item3">row3</div>
    </div>
  </body>
</html>

更详细戳我看效果啊,具体实现请看demo中的网页源代码

3、order(flex items)属性

这个属性是定义在子元素中,作用是改变子元素在布局流中的位置。在父元素定义了布局方式为flex时,各个子元素的默认order值为0,当子元素order值设置为负值时向前排序,设置为正值向后排序,设置为0时为正常排序,下面请看代码:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title></title>
    <style>
      .box {
        display: flex;
        display: -webkit-flex;
      }
      .item1, .item2, .item3 {
        background: #FFA500;
        padding: 10px;
        height: 100px;
        width: 80px;
        margin-top: 10px;
        margin-right: 10px;
        text-align: center;
      }
      .item2 {
        order: 1;
      }
    </style>
  </head>
  <body>
    <div class="box">
      <div class="item1">order1</div>
      <div class="item2">order2</div>
      <div class="item3">order3</div>
    </div>
  </body>
</html>

点击这里看效果哦。

4、flex-wrap(flex container)属性

这个属性定义在父元素中,它的作用是设置子元素在页面缩小时,到底是在一行显示还是换行显示,主要有以下几个属性值:

下面贴核心代码,默认源代码请到项目源地址或者网页上查看,不说第二次了

.boxThree {
    display: flex;
    display: -webkit-flex;
    flex-wrap: wrap-reverse;
 }

点击我查看效果

5、flex-flow(flex container)属性

这个属性定义在父元素中,它是flex-direction和flex-wrap这两个属性的缩写版本,但是在这场景下,flex-direction的属性值只能为row或者row-reverse,下面列举3种组合:

还有几种组合方式,大家可以去尝试一下,在这里不全部举出,下面贴出某一段核心代码:

.boxTwo {
    display: flex;
    display: -webkit-flex;
    flex-flow: row-reverse wrap;
}

点击我查看效果

6、justify-content(flex container)属性

这个属性定义在父元素中,它的作用是让子元素以怎样的方式横向布局显示,主要有下面几个属性值:

下面贴出某一段核心代码:

.boxThree {
    display: flex;
    display: -webkit-flex;
    justify-content: center;
}

点击我查看效果

7、align-content(flex container)属性

这个属性定义在父元素中,十分怪异的一个属性,它有以下几个使用的前提:

属性值与justify-content类似,相比只是多了个stretch。下面贴出某段核心代码:

.boxSix {
    display: flex;
    display: -webkit-flex;
    flex-direction: column;
    flex-wrap: wrap;
    align-content: stretch;
    height: 300px;
    width: 800px;
    border: 1px solid #ccc;
}

点击我查看效果

8、align-items(flex container)属性

这个属性定义在父元素中,是一个十分常用的属性,它的作用是改变子元素纵向布局的方式,主要有以下几个属性值:

下面贴出某段核心代码:

.boxFour {
    display: flex;
    display: -webkit-flex;
    align-items: baseline;
    height: 300px;
    width: 800px;
    border: 1px solid brown;
}

点击我查看效果

9、align-sef(flex items)属性

这个属性定义在子元素中,它的作用是改变某个子元素在纵轴方向的布局方式,主要有以下几个属性值:

下面贴出某段核心代码:

.item14 {
    height: 190px;
    font-size: 28px;
    align-self: baseline;
}

点击我查看效果

10、flex-grow(flex-items)属性

这个属性定义在子元素中,是非常实用的一个属性,它的作用是让子元素以几倍宽度拉伸,属性值的类型为number,下面贴出全部代码:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>flex-grow</title>
    <style>
      .box {
        display: flex;
        display: -webkit-flex;
      }
      .item1, .item2, .item3 {
        background: #FFA500;
        padding: 10px;
        height: 100px;
        margin-right: 10px;
        text-align: center;
        flex: 1;
      }
      .item1 {
        flex-grow: 2;
      }
      .item2 {
        flex-grow: 4;
      }
    </style>
  </head>
  <body>
    <div class="box">
      <div class="item1">两倍宽度</div>
      <div class="item2">四倍宽度</div>
      <div class="item3">一倍宽度</div>
    </div>
  </body>
</html>

点击我查看效果

11、flex-shrink(flex items)属性

这个属性定义在子元素中,它的作用就是让子元素在页面缩小时宽度如何变化,属性值为number,默认值是1。当值为2时,说明页面缩小时,该子元素将相对缩小两倍;当值为0时,页面缩小时,该子元素宽度不会发生改变。下面请看全部代码:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>flex-shrink</title>
    <style>
      .box {
        display: flex;
        display: -webkit-flex;
      }
      .item1, .item2, .item3 {
        background: #FFA500;
        padding: 10px;
        height: 100px;
        width: 400px;
        margin-right: 10px;
        text-align: center;
      }
      .item2 {
        flex-shrink: 0;
      }
    </style>
  </head>
  <body>
    <div class="box">
      <div class="item1">flex-shrink</div>
      <div class="item2">flex-shrink</div>
      <div class="item3">flex-shrink</div>
    </div>
  </body>
</html>

点击我查看效果

12、flex-basis(flex items)属性

这个属性定义在子元素中,设置弹性盒元素的初始长度,默认值为auto,下面贴代码:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>flex-basis</title>
    <style>
      .box {
        display: flex;
        display: -webkit-flex;
      }
      .item1, .item2, .item3 {
        background: #FFA500;
        padding: 10px;
        height: 100px;
        margin-right: 10px;
      }
      .item2 {
        flex-basis: 0;
      }
    </style>
  </head>
  <body>
    <div class="box">
      <div class="item1">flex-shrink</div>
      <div class="item2">flex-shrink</div>
      <div class="item3">flex-shrink</div>
    </div>
  </body>
</html>

如果把类名为item2的内容换成别的,你们看看会出现什么情况?点击我查看上述代码效果

13、flex(flex items)属性

这个属性定义在子元素中,是flex-grow、flex-shrink、flex-basis这三个属性的缩写。默认值为“0 1 auto”,下面请看一段代码:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>flex</title>
    <style>
      .box {
        display: flex;
        display: -webkit-flex;
      }
      .item1, .item2, .item3 {
        background: #FFA500;
        padding: 10px;
        height: 100px;
        margin-right: 10px;
        text-align: center;
        flex: 1;
      }
      .item2 {
        flex: 2 0 auto;
      }
    </style>
  </head>
  <body>
    <div class="box">
      <div class="item1">flex</div>
      <div class="item2">flex-double</div>
      <div class="item3">flex</div>
    </div>
  </body>
</html>

点击我查看效果

尾声

终于把flexbox布局的那些玩意探究的差不多了,真的是累,花了近一整天的时间,不过收获却是巨大的,之前对flexbox布局还是迷迷糊糊的,经过这次的总结和探究,算是进一步深入理解了。对flexbox布局的完全掌握我认为还是得经常将它运用在项目之中,多踩踩兼容的坑,同时也能将它熟记于心。