flex双列布局

最近遇到了这么个布局要求:
  • 两列布局,两列等宽平分父元素宽度,并且两列之间隔5px。
  • 两列等高,高度取决于最高列的高度。

布局展示

查阅了很多资料和很多两列布局的方式,发现了css3中有这么一个新属性,可以完美的完成这项工作。并且为双列布局打开了一个新的世界——flex,弹性盒模型。

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

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

flex的弹性布局可以根据子元素的个数,将容器平分或者按照一定的比例,对子元素进行分配宽度。 可以将任何一个容器都指定为flex布局:

    .box{
      display: flex;
    }

对各个浏览器进行兼容处理:

    .box{
      display: -webkit-flex; /* Safari */
      display: -moz-flex;  /* firefox */
      display: flex;
    }

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

属性:
  • flex-direction: 属性决定主轴的方向(即项目的排列方向)
    .box {
      flex-direction: row | row-reverse | column | column-reverse;
    }
属性值 描述 备注
row 横向排列 方向从左到右
row-reverse 横向排列 方向从右到左
column 纵向排列 方向从上到下
column-reverse 纵向排列 方向从下到上
  • flex-wrap:决定项目是否排在一条轴线上。
    .box{
      flex-wrap: nowrap | wrap | wrap-reverse;
    }
属性 描述 备注
nowrap 项目排在一条轴线上,不换行 默认属性
wrap 项目换行 项目第一行在上面
wrap-reverse 项目换行 项目第一行在下面
  • flex-flow:是flex-direction 和 flex-wrap的简写形式。
    .box {
      flex-flow: <flex-direction> || <flex-wrap>;
    }
  • align-items:属性定义项目在交叉轴上如何对齐。
    .box {
      align-items: flex-start | flex-end | center | baseline | stretch;
    }
属性 描述 备注
flex-start 交叉轴的起点对齐 上对齐
flex-end 交叉轴的终点对齐 底部对齐
center 交叉轴的中点对齐 中线对齐
baseline 文字基线对齐 按照文字的底线对齐
stretch 项目未设置高度或者设置为auto,占满整个容器的高度 默认属性

根据flex这一属性,便可以完美的实现等高布局的要求,为布局提供了一个新的方法。

以上属性使用在容器上,下面的方法将使用在项目上:

  • order: 属性定义项目的排列顺序。数值越小的越靠前,默认值为0。
    .item {
      order: <integer>;
    }
  • flex-grow:属性定义项目的放大比例。默认为0.

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

  • flex-shrink: 属性定义了项目的缩小比例,默认为1.

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

  • flex-basis:属性定义了在分配多余空间之前,项目占据的主轴空间(main size)。
    .item {
      flex-basis: <length> | auto; /* default auto */
    }

注:当该属性设置为固定的数值时,例如250px,该项目则占据固定的宽度。

  • flex(建议使用该属性代替上面3个属性): 为flex-grow, flex-shrink 和 flex-basis的简写,默认值为0 1 auto。后两个属性可选。
    .item {
      flex: none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ]
    }

简写: flex: 1; 将项目平分容器的空间。


根据上面的属性整理,便可以很容易的解决项目平分、等高的新需求。然而有一个问题还没有解决,就是『间隔5px』。

再深入学习flex,发现flex果然特别的给力,它不仅能够自动推算属性值、计算宽度。而且可以通过设定某一个项目的宽度,其他的项目自动计算宽度的功能。于是,可以在任意一个项目上添加属性:

margin-left: 5px;

浏览器会自动计算剩余空间的大小,并平分给两个项目。代码如下:

.flow-tip {
      display: flex;
      flex-flow: row;
   }
.flow-list-up,
.flow-list-down {
    flex: 1;
    background-color: #e4e4e4;
    border-radius: 2px;
    padding: 8px;
    &.ui-state-hover {
        opacity: 0.6;
    }
}
.flow-list-down {
    margin-left: 5px;
}

results matching ""

    No results matching ""