Flex布局(三:Flex计算规则)

15 篇文章 3 订阅

前言

flex计算规则

(一)基本概念

与弹性盒子计算相关的属性有:

margin:外边距
flex-grow: 定义项目的放大比例,默认为0
flex-shrink: 定义项目的缩小比例,默认为1
flex-basis: 定义了在分配多余空间之前,项目占据的主轴空间(main size)。
flex: 是flex-grow, flex-shrink 和 flex-basis的简写,默认值为0 1 auto。后两个属性可选。

(二)当子盒子小于父容器

flex容器每一行的宽度 = 每个子容器的宽度 + 子元素对应轴的margin值


flex-grow(子盒子的伸展值)

flex-grow申明的值为0,不出现伸展的情况

flex-grow申明的值不为0,且子盒子的flex-basis(或width)值之和 < 容器的padding的左边界到右边界的值。那么子盒子会根据申明的flex-grow值去分配剩余的空间。


现在我们举个例子

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>test</title>
    <style>
        .container {
            display: flex;
            width: 400px;
        }

        .container > div {
            height: 40px;
        }

        .first {
            flex: 1 0 0;
            background-color: red;
        }

        .second {
            flex: 2 0 0;
            background-color: blue;
            margin: 0 50px;
        }

        .third {
            flex: 3 0 0;
            background-color: yellow;
        }
    </style>
</head>
<body>
<div class='container'>
    <div class='first'></div>
    <div class='second'></div>
    <div class='third'></div>
</div>
</body>
</html>

上面代码中,我们定义了外层容器width为400px,但是第二个margin为100px。现在flex-basis 属性值为0, 剩下空间为300px。则根据每个盒子flex-grow 属性值及其权重来分配剩余空间

.first宽度 300 *(1/6) = 50px
.second宽度 300 * (2/6) = 100px
.third 宽度 300 *(3/6) = 150

(二)当子盒子超过父容器


  • flex-basis(子盒子的基准值)

可以代替申明width属性

同时声明width属性和flex-basis属性时,会以flex-basis的值来计算

当flex-basis属性值为0,在width有申明的情况下以width来计,width没有的申明的话,则按其内容来计。


  • flex-shrink(子盒子的缩小值)

当flex-shirk的值不为0,且子盒子的flex-basis(或width)值之和 > 容器的padding的左边界到右边界的值。那么子盒子会根据申明的flex-shirk值去缩小当前子盒子的空间。


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>test</title>
    <style>
        .container {
            display: flex;
            width: 200px;
            height: 400px;
            border: 1px solid #c3c3c3;
        }
  
        .first {
            flex-basis: 40px;
            flex-shrink: 1;
            background-color: red;
        }
        .second {
            flex-shrink: 3;
            background-color: blue;
            width: 200px;
        }
        .third {
            flex-basis: 40px;
            flex-shrink: 2;
            background-color: yellow;
        }
    </style>
</head>
<body>
<div class='container'>
    <div class='first'></div>
    <div class='second'></div>
    <div class='third'></div>
</div>
</body>
</html>

上面代码, 父容器定义宽度200px,因为flex-basis可替代width属性的。

所以,子项目宽度为 (200+40+40)= 280px,溢出了80px。

首先计算加上权重的值:1*40 + 3 * 200 + 2 * 40 = 720 px

.first 需要缩小的值:(40 * 1/720) * 80 = 4.44px
.second 需要缩小的值:(200 * 3/720) * 80 = 66.67px
.first 需要缩小的值:(40 * 2/720) * 80 = 8.89px

那么我们就可以分别得到盒子宽度

35.56px 133.33px 31.11px

注意

  • 如果flex-basis的属性未设置,即flex-basis: 0,那么弹性盒子计算多余空间或者溢出空间的宽度是依据其width的值,如果width未设置,那么是其内容的宽度

  • 如果同时设置了flex-basis的属性值和width的值,那么将会忽略width的值

  • flex-basis可设为百分比,是相对于祖先申明为display:flex的元素而言

几种长假的flex取值:

flex:1 ->> flex : 1 1 0%;
flex: none ->> flex: 0 0 auto;
flex: auto ->> flex: 1 1 auto;
flex: 0 auto; 或者 flex: initial -->> flex: 0 1 auto; 即为flex的初始值

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值