首页 > 代码库 > 弹性盒布局学习总结

弹性盒布局学习总结

  近期在做移动端的项目过程中,经常听到有人说用弹性盒布局来写比较快,因为我一直用的是传统的百分比布局(好吧,不敢否认我还是喜欢用拿手的,但是不要鄙视我对新技术的热情),因此一直也想抽空学习下弹性盒布局,看看他到底是何方神圣,能够用到哪些场合,还有浏览器兼容性到底怎么样

一、语法

 应用flex布局,首先要设定一个flex容器(flex container),它的子元素就自动成为flex容器的成员,称为flex项目(flex item)。

.flex_container{
    display:flex;                 /* 块元素 */
    display:inline-flex;         /* 行内元素 */
    display:-webkit-flex;       /* safari */
}

注意:处于flex布局内的成员其clear、float、vertical-align属性将失效

(在此借用阮大神的一张图):

技术分享

1.设置在父容器上的六大属性

1)  flex-direction:决定了主轴的方向

.flex_container {
  flex-direction: row | row-reverse | column | column-reverse;
}
  • row(默认值):主轴为水平方向,起点在左端。
  • row-reverse:主轴为水平方向,起点在右端。
  • column:主轴为垂直方向,起点在上沿。
  • column-reverse:主轴为垂直方向,起点在下沿。

 

2) flex-wrap:决定了项目在轴上一行排列不下时是否换行

    .flex_container{
      flex-wrap: nowrap | wrap | wrap-reverse;
    }
  • nowrap:默认不换行,所有项目在一行显示
  • wrap:一行显示不完则换行显示,第一行在最上面
  • wrap-reverse:第一行开始在最下方

 

3)flex-flow:flex-direction和flex-wrap两属性的简写,默认值为row no-wrap

.flex_container {
  flex-flow: <flex-direction> || <flex-wrap>;
}

 

4)justify-content:定义了项目在主轴上的对齐方式

    .flex_container {
      justify-content: flex-start | flex-end | center | space-between | space-around;
    }
  • flex-start(默认值):左对齐
  • flex-end:右对齐
  • center: 居中
  • space-between:两端对齐,项目之间的间隔都相等。
  • space-around:每个项目两侧的间隔相等。所以,项目之间的间隔比项目与边框的间隔大一倍。

5)align-items:定义项目在交叉轴上如何对齐

.flex_container{
  align-items: flex-start | flex-end | center | baseline | stretch;
}
  • flex-start:交叉轴的起点对齐。
  • flex-end:交叉轴的终点对齐。
  • center:交叉轴的中点对齐。
  • baseline: 项目的第一行文字的基线对齐。
  • stretch(默认值):如果项目未设置高度或设为auto,将占满整个容器的高度。

6)align-content:定义了项目在多根轴线上的对齐方式(如果一根轴线不起作用)

    .flex_container {
      align-content: flex-start | flex-end | center | space-between | space-around | stretch;
    }
  • flex-start:与交叉轴的起点对齐。
  • flex-end:与交叉轴的终点对齐。
  • center:与交叉轴的中点对齐。
  • space-between:与交叉轴两端对齐,轴线之间的间隔平均分布。
  • space-around:每根轴线两侧的间隔都相等。所以,轴线之间的间隔比轴线与边框的间隔大一倍。
  • stretch(默认值):轴线占满整个交叉轴。

2.项目的六大属性

1)order:定义了项目的排列顺序,数值越小排列越靠前,默认为0.

2)flex-grow:定义了项目的放大比例,默认为0,即存在剩余空间也不放大

    .item {
      flex-grow: <number>; /* default 0 */
    }

注意:如果所有项目的flex-grow:1,则他们将等分剩余空间;如果一个项目的flex-grow属性为2,其他项目都为1,则前者占据的剩余空间将比其他项多一倍。

3)flex-shrink:定义了项目的缩小比例,默认为1,即如果空间不足,将缩小适应空间

.item {
  flex-shrink: <number>; /* default 1 */
}

注意:如果所有项目的flex-shrink属性都为1,当空间不足时,都将等比例缩小。如果一个项目的flex-shrink属性为0,其他项目都为1,则空间不足时,前者不缩小

4)flex-basis:定义在分配剩余空间之前,项目所占据的主轴空间。浏览器根据此特性计算主轴是否有剩余空间,默认值为auto,即项目本来大小

    .item {
      flex-basis: <length> | auto; /* default auto */
    }

注意:若项目设为固定宽高,则占据固定空间,如200px||20%

5)flex:flex-grow、flex-shrink、flex-basis三个属性的缩写,默认值为0 1 auto,后两个属性可选

    .item {
      flex: none | [ <‘flex-grow‘> <‘flex-shrink‘>? || <‘flex-basis‘> ]
    }

注意:none代表(0 0 auto),  auto代表(1 1 auto)

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

    .item {
      align-self: auto | flex-start | flex-end | center | baseline | stretch;
    }

 二、布局

了解了flex的基本语法之后,究竟怎样用好这些语法进行布局了。自己为了练习写出了一个非常不好看low逼的导航条,但是基本的语法都用上了

技术分享

<ul class="flex_container">
        <li><a href="#">新闻</a></li>
        <li><a href="#">娱乐</a></li>
        <li><a href="#">生活</a></li>
        <li><a href="#">科技</a></li>
        <li><a href="#">财经报道</a></li>
 </ul>
.flex_container{
    display: flex;
    flex-grow:row wrap;
    justify-content:space-between;
    width:640px;
    height:50px;
    margin:10% auto;
    background-color:#ccc;
    li{
        display: flex;
        flex:1;
        align-items: stretch;
        justify-content: center;
        background-color:black;
        list-style:none;
        a{
            flex:1;
            text-align: center;
            line-height: 50px;
            color:white;
            text-decoration: none;
        }
    }

    li:last-child{
        flex:2;
    }
}

注意:代码并没有做兼容性处理,可以自己写或者用autoprefixer工具来处理

具体详细布局策略移步至阮大神教程:Flex布局教程:实例篇

三、兼容性 

 浏览器一共支持三个不同版本的语法:

  • 新规范:最新版本的语法,即“display:flex”
  • 中间版本:2011年非官方规范,即“display:flexbox”
  • 老规范:2009年官方规范,即“display:box”

技术分享

  从表中可以看出弹性盒布局在移动端的支持性还是比较好的,不过为了兼容不同的浏览器,建议还是用autoprefixer工具自动补全其不同的前缀。

 

弹性盒布局学习总结