CSS中的Flex布局

web.jpeg

Flex 弹性布局


概念

  • Flex 是 Flexible Box 的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性。
  • FlexBox布局更多的用到移动端,PC端除了盒子模型布局,也支持FlexBox布局 , FlexBox布局将会是成为未来开发的主流技术,将在移动端体现的最明显。
  • 对浏览器的兼容性
93.png
.box{
  display: flex;
}

//行内元素布局
.box{
  display: inline-flex;
}

// Webkit内核浏览器
ox{
  display: -webkit-flex; /* Safari */
  display: flex;
}

  • 采用 Flex 布局的元素,称为Flex 容器(flex container),简称"容器"。它的所有子元素自动成为容器成员,称为Flex 项目(flex item),简称"项目"
flex.jpg
  • 容器默认存在两根轴:水平的主轴main axis)和垂直的交叉轴cross axis)。主轴的开始位置(与边框的交叉点)叫做main start,结束位置叫做main end;交叉轴的开始位置叫做cross start,结束位置叫做cross end
    项目默认沿主轴排列。单个项目占据的主轴空间叫做main size,占据的交叉轴空间叫做cross size

注意:主轴和交叉轴,其实是可以相互转化的,下面介绍的flex-direction属性,就可以改变主轴和交叉轴

所以felx的布局要从2个方面着手,"容器" 和 "项目"`

容器的属性有6个

flex-direction决定item在主轴的排列方向(水平方向/垂直方向).
flex-wrap 决定item在主轴的方向上是否换行.
flex-flowflex-directionflex-wrap 的综合属性
justify-content定义 item的在主轴对齐方式
align-items定义item在交叉轴的对象方式
align-content 定义了 多行item 在多根轴线的对齐方式 是一个整体的属性值

flex的属性 这是在容器盒子上

  • flex-direction属性 决定主轴的方向 (水平方向的例子)
  • flex-direction: row | row-reverse | column| column-reverse;
row.png
  • flex-direction属性 决定主轴的方向 (垂直方向的例子)
column.png
  • flex-wrap属性 是否换行
  • flex-wrap: nowrap | wrap | wrap-reverse;
wrap.png
  • justify-content属性 是在主轴的上的对齐方式
  • justify-content: flex-start | flex-end | center | space-between | space-around;
justify-content属性 .png

align-items 属性 实在交叉轴上(侧轴)的对齐方式

  • { align-items: flex-start 交叉轴起点 | flex-end 交叉轴终点 | center 居中| baseline 基线| stretch 如果项目未设置高度或设为auto,将占满整个容器的高度; 如果项目设置高度,stretch就会失效 }
FireShot Capture 001 - Document - localhost.png
align-content属性 定义多行排列的(和flex-wrap属性搭配使用) 对齐方式 把其看成一个整体
  • align-content: flex-start | flex-end | center | space-between | space-around | stretch;
火狐截图_2018-05-25T05-22-11.850Z.png

项目属性6个

order: 定义项目的排列顺序。数值越小,排列越靠前,默认为0。
flex-grow:定义项目的放大比例,默认为0,即如果存在剩余空间,也不放大
flex-shrink: 定义了项目的缩小比例,默认为1,即如果空间不足,该项目将缩小
flex-basis: 定义了在分配多余空间之前,项目占据的主轴空间(main size)
flex:属性是flex-grow, flex-shrink 和 flex-basis的简写,默认值为0 1 auto
align-self:允许单个项目有与其他项目不一样的对齐方式,可覆盖align-items属性,
默认值为auto,表示继承父元素的align-items属性,如果没有父元素,则等同于stretch。

伸缩项/项目属性: flex-grow 定义项目的放大比例,默认为0,即如果存在剩余空间,也不放大

用于控制当所有伸缩项的宽度总和小于伸缩容器宽度的时候如何扩充自己, 以便于所有伸缩项宽度的总和能够填满整个伸缩容器。
默认情况下flex-grow的取值是0, 表示我们设置的宽度是多少就按照多少来显示, 不进行任何的扩充
注意点:
只有当所有伸缩项的宽度总和小于伸缩容器宽度的时候flex-grow这个属性才有效

flex-grow缩小的公式
1.利用伸缩容器宽度 - 所有伸缩项的宽度 = 剩余空间

          600 - 300 = 300
2.利用剩余空间 / 所有需要扩充份数的总和 = 每一份的大小
          300 / (1 + 4 + 8) = 23.07
 3.利用当前伸缩项的宽度 + 需要的份数的宽度
          第一个伸缩项 = 100 + (1 * 23.07) = 123.07
          第二个伸缩项 = 100 + (4 * 23.07) = 192.28
          第三个伸缩项 = 100 + (8 * 23.07) = 284.56
 <style>
        *{
            margin: 0;
            padding: 0;
        }
        ul{
            list-style: none;
            width: 600px;
            height: 600px;
            border: 1px solid #000;
            margin: 100px auto;
            display: flex;
            flex-direction: column;
        }
        ul>li{
            width: 100px;
            height: 100px;
            line-height: 100px;
            text-align: center;
            font-size: 30px;
            background: red;
        }
        ul>li:nth-child(1){
            /*
            在伸缩项中有一个flex-grow属性, 用于控制当所有伸缩项的宽度总和小于伸缩容器宽度的时候如何扩充自己, 以便于所有伸缩项宽度的总和能够填满整个伸缩容器
            默认情况下flex-grow的取值是0, 表示我们设置的宽度是多少就按照多少来显示, 不进行任何的扩充
            注意点:
            只有当所有伸缩项的宽度总和小于伸缩容器宽度的时候flex-grow这个属性才有效

            flex-grow缩小的公式
            1.利用伸缩容器宽度 - 所有伸缩项的宽度 = 剩余空间
              600 - 300 = 300
            2.利用剩余空间 / 所有需要扩充份数的总和 = 每一份的大小
              300 / (1 + 4 + 8) = 23.07
            3.利用当前伸缩项的宽度 + 需要的份数的宽度
              第一个伸缩项 = 100 + (1 * 23.07) = 123.07
              第二个伸缩项 = 100 + (4 * 23.07) = 192.28
              第三个伸缩项 = 100 + (8 * 23.07) = 284.56
            */
            flex-grow: 1;
        }
        ul>li:nth-child(2){
            background: green;
            flex-grow: 4;
        }
        ul>li:nth-child(3){
            background: blue;
            flex-grow: 8;
        }
    </style>
</head>
<body>
<ul>
    <li>1</li>
    <li>2</li>
    <li>3</li>
</ul>
</body>
</html>
image.png

注意:如果 容器里面的元素 设置的flex-grow 总和小于 1,那么就是 剩余空间 * flex-grow的值
比如: 剩余空间是300 设置的flex-grow的值为 0.2 那么300 * 0.2 就是要扩充的值

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

用于控制当所有伸缩项的宽度总和大于伸缩容器宽度的时候如何缩小自己, 以便于所有伸缩项宽度的总和能够填满整个伸缩容器
默认情况下flex-shrink的取值是1, 表示当所有伸缩项宽度的总和大于伸缩容器宽度的时候等比缩小自己
注意点:
只有当所有伸缩项的宽度总和大于伸缩容器宽度的时候flex-shrink这个属性才有效

           flex-shrink扩充的公式
            1.利用所有伸缩项的宽度总和 - 伸缩容器宽度 = 溢出的宽度
            900 - 600 = 300
            2.计算权重值
            利用每一个伸缩项需要的份数 * 当前伸缩项的宽度 然后再相加
            1 * 300 + 4 * 300 + 8 * 300 = 3900
            3.计算每个伸缩项需要缩小的范围
            溢出的宽度 * 当前伸缩项的宽度 * 当前伸缩项需要的份数 / 权重值
            300 * 300 * 1 / 3900 = 23.07
            第一个伸缩项宽度 = 300 - 23.07 = 276.9
            300 * 300 * 4 / 3900 = 92.3
            第二个伸缩项宽度 = 300 - 92.3 = 207.6
 <style>
        *{
            margin: 0;
            padding: 0;
        }
        ul{
            list-style: none;
            width: 600px;
            height: 600px;
            border: 1px solid #000;
            margin: 100px auto;
            display: flex;
        }
        ul>li{
            width: 300px;
            height: 100px;
            line-height: 100px;
            text-align: center;
            font-size: 30px;
            background: red;
        }
        ul>li:nth-child(1){
            /*
            在伸缩项中有一个flex-shrink属性, 用于控制当所有伸缩项的宽度总和大于伸缩容器宽度的时候如何缩小自己, 以便于所有伸缩项宽度的总和能够填满整个伸缩容器
            默认情况下flex-shrink的取值是1, 表示当所有伸缩项宽度的总和大于伸缩容器宽度的时候等比缩小自己
            注意点:
            只有当所有伸缩项的宽度总和大于伸缩容器宽度的时候flex-shrink这个属性才有效


            flex-shrink扩充的公式
            1.利用所有伸缩项的宽度总和 - 伸缩容器宽度 = 溢出的宽度
            900 - 600 = 300
            2.计算权重值
            利用每一个伸缩项需要的份数 * 当前伸缩项的宽度 然后再相加
            1 * 300 + 4 * 300 + 8 * 300 = 3900
            3.计算每个伸缩项需要缩小的范围
            溢出的宽度 * 当前伸缩项的宽度 * 当前伸缩项需要的份数 / 权重值
            300 * 300 * 1 / 3900 = 23.07
            第一个伸缩项宽度 = 300 - 23.07 = 276.9
            300 * 300 * 4 / 3900 = 92.3
            第二个伸缩项宽度 = 300 - 92.3 = 207.6
            */
            flex-shrink: 1;
        }
        ul>li:nth-child(2){
            background: green;
            flex-shrink: 4;
        }
        ul>li:nth-child(3){
            background: blue;
            flex-shrink: 8;
        }
    </style>
image.png
火狐截图_2018-05-25T06-29-53.292Z.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容