Flex弹性布局

2018-07-19  本文已影响0人  新新_6261

一、基本概念

注意:Flex布局中,float、cleat、vertical-align 属性将失效。

二、容器的属性

//主轴的方向;水平向右,水平向左,垂直向下,垂直向上
flex-direction:row | row-reverse | column | column-reverse

//换行;不换行,第一行在上方,第一行在下方
flex-wrap:nowrap | wrap | wrap-reverse;

//flex-direction属性和flex-wrap属性的简写形式
flex-flow:flex-direction flex-wrap

//对齐方式;左对齐,右对齐,居中,两端对齐,每个项目两侧的间隔相等
justify-content:flex-start | flex-end | center | space-between | space-around;

//交叉轴上的对齐方式;起点对齐,终点对齐,中点对齐,第一行文字的基线对齐,项目未设置高度或设为auto将占满整个容器的高度
align-items:flex-start | flex-end | center | baseline | stretch;

//多根轴线的对齐方式;起点对齐,终点对齐,中点对齐,轴线之间的间隔平均分布,每根轴线两侧的间隔都相等,轴线占满整个交叉轴
align-content:flex-start | flex-end | center | space-between | space-around | stretch;

三、项目的属性

用在flex项目上的属性总共有6个,order || flex-basis || flex-grow || flex-shrink || flex || align-self

例如:
<ul>
        <li>1</li>
        <li>2</li>
        <li>3</li>
</ul>
ul {
    display: flex;  
    width: 600px;
    border: 1px solid red;
}
li { 
    width: 100px;
    height: 100px;
    margin: 8px;
    padding: 4px;
    text-align: center;
    line-height: 100px;
    background-color: #8cacea;
}

(1)、order,顾名思议,顺序的意思,就是在不改变html 结构的情况下,给每一个flex项目重新排序,比如让第一个项目在最后面,它的取值是一个数字,正数,负数,0 都可以,如8。 浏览器在进行重绘时会根据这个数字对flex项目进行重新排列,规则就是从小到大,哪个项目的order 属性大,哪个项目排在后面,反之则在前面,如果有两个flex项目的order值相等,就按照它们在html中定义的结构进行排列。当然,每一个flex项目的order默认取值是0, 表示flex项目会按照html 中定义的结构进行排列。    我们给每一个li 添加一个order 属性,根据规则,第三个项目排在第一位,第二个项目不变,第一个项目排在最后。

li:nth-child(1) {
    order: 3;
}
li:nth-child(2) {
    order: 2;
}
li:nth-child(3) {
    order: 1;
}

(2)、flex-basis 的取值: auto || <length>, length 就是我们平常用的一些属性值,如px, rem.
flex-basic 的默认取值是auto, 如果主轴方向是水平方向(row),它等于flex项目的宽度(width)。如果主轴方向是垂直方向(conlumn), 它等于flex项目的高度(height)。
flex-basis 取值为length, 表示我们可以赋值给它,如150px, 那么它就会覆盖掉flex项目原有的宽度或高度(取决于主轴的方向)。

li:nth-child(1) {
   flex-basis: 100px;
   background: yellow;
}
li:nth-child(2) {
    background: red;
    flex-basis: 200px;
}
li:nth-child(3) {
    flex-basis: auto;
}

(3)、flex-grow默认值为1;平均占满了整个flex container的空间(备注:当设置每一个项目的flex-grow 为1时,一共有3 个元素,整个flex-container会被分成3份,每一个flex-item 各占一份,所以都相同。如果我们其中一个flex-flow设为2. 还是3个元素,那么整个flex container 就分成1+2+1 = 4份,其余2个各1/4, 而第二个占2/4,所以第二个就相对变大了, flex-grow 设置的某个或某些项目相对于其他项目的比例。)

li:nth-child(1) {
    flex-grow: 1;
}
li:nth-child(2) {
    flex-grow: 1;
}
li:nth-child(3) {
    flex-grow: 1;
}

(4)、flex-shrink : shrink 收缩,当所有flex项目的宽度总和超过 flex-contaier容器的时候,每一个项目都会进行收缩。它的默认值是1, 表示每一个项目都会等比例收缩。  如果把某个元素的flex-shrink 设为0, 它就不会进行收缩。 如果把某个flex项目的flex-shrink设置3,和flex-grow 一样,它也是比例,每一个flex item收缩1, 它收缩3, 它比别的项目收缩更严重。

li:nth-child(1) {
    flex-shrink: 0;
}
li:nth-child(2) {
    flex-shrink: 3;
}
flex: 是上面三个属性简写,像边框border属性一样, flex: flex-grow flex-shrink flex-basis,  根据上面的内容,我们很轻松地就可以得出它的默认值为0 1 auto,这和我们平时没有设置这个属性表现一致,flex-basis: auto 表示,它和元素的宽度或高度保持一致,flex-grow等于0,表示如果flex容器有剩余空间,它并不会扩大,flex-shrink为1,如果flex容器空间不足,它会进行收缩。注意这三个属性的排列顺序

(5)、flex 简写形式还有几个关键字: none, auto. flex: none 相当于flex: 0 0 auto, 它表示flex项目跟元素的宽度或高度保持一致,即不收缩也不扩张。flex:auto相当于flex: 1 1 auto;

(6)、align-self: 它决定单个flex项目在侧轴上怎么排列。 align-self 就是在这整体排列的基础上,对单个项目的排列,它的取值为 auto || flex-start || flex-end || center || baseline || stretch; 它的默认取值auto, 就是表示它跟align-item属性保持一致; 如果对这个属性进行设置,它就会覆盖掉align-item属性。

li:nth-child(1){
    align-self: flex-start;
}

四、垂直居中实现

display:flex;
justify-content:center;
align-items:center;

例如:

<div class="vertical-container">
   <div class="small">
   </div>
</div>
.vertical-container{
        height:300px;
        -webkit-display:flex;
        display:flex;
        -webkit-align-items:center;
        align-items:center;
        -webkit-justify-content:center;
        justify-content:center;
        border:1px solid #ccc;
    }
    .small{
        width:100px;
        height:100px;
        background-color:green;
    }
上一篇下一篇

猜你喜欢

热点阅读