• Flex 布局


    (一)什么是Flex 布局

      Flex 是Flexible Box 的缩写,是一维的弹性布局。

      采用Flex布局的元素,称为Flex容器。

      它的所有子元素自动成为容器成员,称为 Flex item(Flex 项目)。

      既然是容器,就需要一个容器元素,将项目包裹在其中。

      因此,在使用时,需要将容器元素设定为 display:Flex。

     .box{
                display: flex;
                flex-direction:  column;
                justify-content: space-between;
                align-items: center;
            }

    (二)Flex布局的优势

       1、可以轻松的实现水平、垂直居中。

       2、更容易操作内联元素,减少适用position,float属性,实现两端对齐,元素均匀排列等。

       3、减少布局的复杂性。

    (三)Flex 基本概念

      1.主轴与纵轴

         主轴与横轴始终相互垂直。

         水平方向是主轴还是横轴,由 属性 flex-direction 决定。

         默认主轴是水平方向。

      2.main start,main end

        主轴起点与终点。

      3.cross start,cross end

        横轴起点与终点。

    (四)容器属性

       1.flex-direction

        指定了内部元素如何在flex容器中布局,定义了主轴的方向(正方向或反方向)。

    flex-direction: row; /* default value*/
    flex-direction: row-reverse;
    
    /* The direction in which lines of text are stacked */
    flex-direction: column;
    /* Like <column>, but reversed */
    flex-direction: column-reverse;

        
      2.flex-warp

        指定flex元素 单行显示还是多行显示。如果允许换行,可以控制行的堆叠方向。

    flex-wrap: nowrap; /* Default value 元素被摆放到一行,可能会导致容器溢出*/
    flex-wrap: wrap;
    flex-wrap: wrap-reverse;

        

      3.flex-flow

        flex-diretion || flex-wrap 的简写形式。

      4.justify-content

        定义的是 主轴方向 flex项目如何分布。

        这里其实有一个概念 —— 空间分配。

        因为元素项的最终宽度受当前行剩余空间影响,就会像是有弹性一样会膨胀或收缩。

        主轴方向的多余空间是因为  容器宽度 > 元素宽度之和。

    justify-content: center;     /* 居中排列 */
    justify-content: start;      /* 左对齐 */
    justify-content: end;        /* 右对齐*/
    justify-content: flex-start; /* flex items 左对齐,如果子元素是 display:flex,此属性才会右效果*/
    justify-content: flex-end;   /* Pack flex 右对齐*/
    justify-content: left;       /* Pack items from the left */
    justify-content: right;      /* Pack items from the right */
    
    /* Distributed alignment */
    justify-content: space-between; /* 除了第一个和最一个Flex项目的两者间间距相同(两端对齐)*/
    justify-content: space-around;  /* 均匀排列每个元素,每个元素之间间隔相等*/

     space-around 可以实现项与项之间的均匀分布。

      

     在不处理:first-child:last-child的情况下,space-between实现列表项的均匀分布;

      

     

      5.align-items

        定义的是 一个行内,Flex 项目在交叉轴上如何分布。

        属性与 justify-content 一致。

      6.align-content

         定义的是行与行之间,交叉轴方向的Flex项目如何分布。

        因此此属性只适用于多行的flex容器,让容器中所有元素居中,单行的则没有效果。 

            这里所说的行,指的是在一个Flex容器内,由于 flex-wrap:wrap 造成的换行,而不是 第1个Flex容器与第2个Flex容器。

        如下: 当父容器宽度为100px,两个子容器宽度为30px时,此时会显示一行,设置 align-content:center, 并未垂直居中。 

    <style type="text/css">
        #testDiv{
            width: 100px;
            height: 60px;
            display: flex;
            border: 1px solid #db2fff;
            flex-wrap: wrap;
            justify-content: space-around;
            align-content: center;
        }
    
        #One,#Two{
            width: 30px;
            height: 20px;
            border: 1px solid #4fff21;
        }
    </style>
    <div id="testDiv">
        <div id="One"></div>
        <div id="Two"></div>
    </div>
    View Code

            

       当子容器为60px,会变成多行轴线,居中有效,效果图如下

      

      当子容器宽度为30px,使用 align-items:center,效果图如下

      

      当子容器宽度为60px,使用 align-items:center,效果图如下

      

    (四)项目属性

      1.flex-basis

        指定了在主轴方向上的初始大小(如果不使用box-sizing改变盒模型),即宽度或者高度。

        比width的优先级要高,同时设置两者,flex-basis会覆盖width。

      2.flex-grow

        mdn:定义了弹性盒子项的拉伸因子。

        即如果父容器定义了display:flex,子容器便可以根据定义的flex-grow瓜分剩余空间。 

        如果P是父容器,A,B,C是子容器,则剩余空间=P.width-A.with-B.width-C.width。

        如果A flex-grow:1, B flex-grow:2, C flex-grow:3,则表示 剩余空间被分成了6份。

    <style type="text/css">
        .container2{
            display: flex;
            width:600px;
        }
        .container2>div:nth-child(1){
            display: flex;
            justify-content: center;
            align-items: center;
            height: 80px;
            width: 100px;
            flex-basis: 200px;
            background: #f00;
        }
        .container2>div:nth-child(2){
            flex-grow: 1;
            background: #ff8eaa;
        }
    
        .container2>div:nth-child(3){
            flex-grow: 2;
            background: #4669ff;
        }
    </style>
    
    <div class="container2">
        <div>flex-basis: 200px</div>
        <div>flex-grow:1</div>
        <div>flex-grow:2</div>
    </div>
    View Code

      3.flex-shrink

        指定了flex item 的收缩规则,仅仅在默认宽度之和大于容器时,才会发生收缩。

      4.flex

        是flex-grow,flex-shrink,flex-basis的简写。

        初始值为 0 1 auto。

        两个快捷值:auto (1  1 auto) ,none (0 0 auto)

        单值语法: 无单位值 A,表示 flex-grow:A  flex-shrink:1  flex-basis:0%

              有单位值 B,表示 flex-grow=flex-shrink=1,flex-basis=B

        双值语法:一个无单位数 A,一个有单位数 B,则 表示 flex-grow:A, flex-shrink:1 ,flex-basis:B

             都为有单位数 A,B,则 flex-grow:A,flex-shrink:B

        

      5.align-self

        覆盖 algin-items属性,表示此单项目与其他项目不一样的对齐方式。

    (五)Flex 对空间的分配

       1、所有项先按照原始宽度在容器中排列。

        2、如果容器有多余的宽度,则将多余的宽度分配给每个项,比例由 flex-grow 控制。

         例如,父容器宽度为1000px,  A,B flex-grow:1, A的子容器 A1宽度为100px, B子容器宽度为 100%,

           那么,A、B 容器的真正宽度是多少呢?

           剩余空间 1000-100 = 900,因为分配比例一样,则 A,B各得到一半 900/2 =450。

           因此A得到 450 + 100 = 550px, B 得到 450px。

          3、受 min-width,max-width 限制。

  • 相关阅读:
    友链
    利用jenkins插件查看allure报告
    python pyyaml操作yaml配置文件
    数组类型
    接口测试--加密算法
    python赋值,深拷贝和浅拷贝的区别
    RF中在测试用例集上设置标签
    python中json.dump()与json.dumps()的区别
    python 日期与字符串之间的转换
    python operator操作符函数
  • 原文地址:https://www.cnblogs.com/xianrongbin/p/2380554.html
Copyright © 2020-2023  润新知