美文网首页
Flex弹性布局

Flex弹性布局

作者: 新新_6261 | 来源:发表于2018-07-19 22:05 被阅读0次

    一、基本概念

    注意: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;
        }
    

    相关文章

      网友评论

          本文标题:Flex弹性布局

          本文链接:https://www.haomeiwen.com/subject/zzdxmftx.html