博客列表 >css 设置弹性元素的 增长因子,缩减因子,基准尺寸 计算方法

css 设置弹性元素的 增长因子,缩减因子,基准尺寸 计算方法

张浩刚
张浩刚原创
2019年11月06日 16:53:52812浏览

实例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>flex-grow 增长因子</title>
    <style>
        article{display: flex;border: 2px dashed red;height: 60px;width: 600px;}
        article>.item{background: linear-gradient(green,white);border-right: 1px solid blue;width: 100px;}
        article>.item:last-of-type{border-right: 0;}
        
        article:first-of-type>.item{flex-grow:0;}

        article:nth-of-type(2)>:nth-last-of-type(2){flex-grow: 1;}
        /**************************/
        article:nth-of-type(3)>:first-of-type{flex-grow: 1;}
        article:nth-of-type(3)>:nth-of-type(2){flex-grow: 3;}
        article:nth-of-type(3)>:last-of-type{flex-grow: 2;}
        /**
        1、增长因子和为:6
        2、剩余空间为600-300=300px;
        3、第一个元素增长比例1/6=0.1667 ; 第二个 3/6=0.5;第三个 2/6=0.0.3333
        4、第一个元素增长宽度为:300*0.1667=50.01;第二个150px;第三个100px;
        5、增长宽度后,第一个元素宽度为:100+50.01=150.01px;第二个100+150=250px;第三个100+100=200px;
        **/
        /**************************/
        /**************************/
        article:nth-last-of-type(2)>:first-of-type{flex-grow: 0.1;}
        article:nth-last-of-type(2)>:nth-of-type(2){flex-grow: 0.3;}
        article:nth-last-of-type(2)>:last-of-type{flex-grow: 0.6;}
        /**
        1、增长因子和为:1
        2、剩余空间为600-300=300px;
        3、第一个元素增长比例0.1/1=0.1 ; 第二个 0.3/1=0.3;第三个 0.6/1=0.6
        4、第一个元素增长宽度为:300*0.1=30px;第二个90px;第三个180px;
        5、增长宽度后,第一个元素宽度为:130px;第二个190px;第三个280px;
        **/
        /**************************/
        article:last-of-type>:first-of-type{flex-grow: 0.1;width: 120px;}
        article:last-of-type>:nth-of-type(2){flex-grow: 0.3;width: 180px;}
        article:last-of-type>:last-of-type{flex-grow: 0.6;width: 200px;}
        /**
        1、增长因子和为:1
        2、剩余空间为600-(120+180+200)=100px;
        3、第一个元素增长比例0.1/1=0.1 ; 第二个 0.3/1=0.3;第三个 0.6/1=0.6
        4、第一个元素增长宽度为:100*0.1=10px;第二个30px;第三个60px;
        5、增长宽度后,第一个元素宽度为:130px;第二个210px;第三个260px;
        **/
        /**************************/
    </style>
</head>
<body>
    <h2>1. flex-grow:0; 默认值,不增长</h2>
    <article class='demo1'>
        <span class="item">flex-grow1</span>
        <span class="item">flex-grow2</span>
        <span class="item">flex-grow3</span>
    </article>
    <h2>2. 剩余空间全部分配给第二个</h2>
    <article class='demo2'>
        <span class="item">flex-grow1</span>
        <span class="item">flex-grow2</span>
        <span class="item">flex-grow3</span>
        
    </article>
    <h2>3. 全部剩余空间按增长因子在不同弹性元素间分配</h2>
    <p>元素的border边框小幅影响增长宽度</p>
    <article class='demo3'>
        <span class="item">flex-grow1</span>
        <span class="item">flex-grow2</span>
        <span class="item">flex-grow3</span>
    </article>
    <h2>4. 增长因子支持小数, 因为是按增长比例分配</h2>
    <p>元素的border边框小幅影响增长宽度</p>
    <article class='demo4'>
        <span class="item">flex-grow1</span>
        <span class="item">flex-grow2</span>
        <span class="item">flex-grow3</span>
    </article>
    <h2>5.每个弹性元素宽度不同时, 同样适用以上分配规律</h2>
    <p>元素的border边框小幅影响增长宽度</p>
    <article class='demo5'>
        <span class="item">flex-grow1</span>
        <span class="item">flex-grow2</span>
        <span class="item">flex-grow3</span>
    </article>
</body>
</html>

运行实例 »

点击 "运行实例" 按钮查看在线实例

 1.jpg

实例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>flex-shrink 弹性元素的缩减因子</title>
    <style>
        article{display: inline-flex;border: 2px dotted green;width: 600px;height: 60px;box-sizing: border-box;}
        article>span{background:radial-gradient( white,red);line-height: 60px;text-align: center;width: 250px;border-right: solid 1px greenyellow;}
        /**flex-shrink:0; 不缩减,原始宽度**/
        .demo1>.item{flex-shrink:0;}
        /**flex-shrink:1; 默认值**/
        .demo2>.item{flex-shrink:1;}
        /*****************************
        1、缩减因子总和为:3;
        2、需要缩减的空间宽度为:250*3-600=150px;
        3、缩减比例都一样:1/3=0.33333;
        4、因为元素宽度一样,故均缩减:150*0.33333≈49.99995px;
        5、缩减后的宽度均约为:200px
        *****************************/

        /*flex-shrink 不同值*/
        article:nth-of-type(3)>:first-of-type{flex-shrink: 1;}
        article:nth-of-type(3)>:nth-last-of-type(2){flex-shrink: 2;}
        article:nth-of-type(3)>:last-of-type{flex-shrink: 3;}
        /*****************
        1、缩减英子总和为6
        2、超出容器的宽度为250*3-600=150px;
        3、缩减比例:第一个:1/6;第二个2/6;第三个3/6
        4、缩减的宽度,第一个250-150*(1/6);第二个250-150*(2/6);第三个:250-150*(3/6)
        ****************/

        /*flex-shrink 为小数*/
        article:nth-last-of-type(2)>:first-of-type{flex-shrink: 0.1;}
        article:nth-last-of-type(2)>:nth-last-of-type(2){flex-shrink: 0.2;}
        article:nth-last-of-type(2)>:last-of-type{flex-shrink: 0.7;}
        /*****************
        1、缩减英子总和为1
        2、超出容器的宽度为250*3-600=150px;
        3、缩减比例:第一个:0.1/1;第二个0.2/1;第三个0.7/1
        4、缩减的宽度,第一个250-150*0.1;第二个250-150*0.2;第三个:250-150*0.7
        ****************/

        article:last-of-type>:first-of-type{flex-shrink: 0.3;width: 300px;}
        article:last-of-type>:nth-last-of-type(2){flex-shrink: 0.2;width: 200px;}
        article:last-of-type>:last-of-type{flex-shrink: 0.5;width: 400px;}
        /*****************
        1、缩减英子总和为1
        2、超出容器的宽度为900-600=300;
        **缩小比例: 等待缩减空间 / 每个弹性元素的宽度与缩减因子乘积的总和**
        3、缩减比例:300 / (0.3*300 + 0.2*200 + 0.5*400) = 0.909090901
        **计算每个元素的缩减量: 元素宽度 * ( 缩减因子 * 缩减因子的缩减比例)**
        4、缩减的宽度,第一个300*(0.3*0.909090901);第二个200*(0.2*0.909090901);第三个:400*(0.5*0.909090901)
        5、最终宽度,第一个300-81.818181≈218;第二个200-36.36363604≈163;第三个400-90.909≈218
        ****************/
    </style>
</head>
<body>
    <h2>1、所有弹性元素不缩减,以原始宽度显示,缩减因子为: 0</h2>
    <article class="demo1">
        <span class="item">item1</span>
        <span class="item">item2</span>
        <span class="item">item3</span>
    </article>
    <h2>2、所有弹性元素自适应容器宽度且不换行,缩减因子: 1 (默认)</h2>
    <article class="demo2">
        <span class="item">item1</span>
        <span class="item">item2</span>
        <span class="item">item3</span>
    </article>
    <h2>3、当三个弹性元素的缩减因为子不相等时</h2>
    <p>border边距略微影响宽度,缩减比例越小,弹性元素宽度越大</p>
    <article class="demo3">
        <span class="item">item1</span>
        <span class="item">item2</span>
        <span class="item">item3</span>
    </article>
    <h2>4、缩减英子也可以是小数</h2>
    <article class="demo4">
        <span class="item">item1</span>
        <span class="item">item2</span>
        <span class="item">item3</span>
    </article>
    <h2>5、每个弹性元素宽度不一样时</h2>
    <p>a. 计算缩减因子的的缩小比例: 等待缩减空间 / 每个弹性元素的宽度与缩减因子乘积的总和</p>
    <p>b. 计算每个元素的缩减量: 元素宽度 * ( 缩减因子 * 缩减因子的缩减比例)</p>
    <p>b. 最终的宽度:自身宽度 - b (b为上一步的结果)</p>
    <article class="demo5">
        <span class="item">item1</span>
        <span class="item">item2</span>
        <span class="item">item3</span>
    </article>
</body>
</html>

运行实例 »

点击 "运行实例" 按钮查看在线实例

2.jpg

实例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>flex-basis 基准尺寸</title>
    <style>
        article{display: flex;border: 2px dotted green;width: 600px;height: 60px;box-sizing: border-box;}
        article>span{background:radial-gradient( white,red);border-right: solid 1px greenyellow;padding: 20px;box-sizing: border-box;}
        article:first-of-type>.item{flex-basis:content;}
        article:nth-of-type(2)>.item{width: 220px;flex-shrink: 0;}
        article:nth-of-type(3)>.item{flex-basis: auto;}
        article:nth-last-of-type(2)>.item{width: 120px;flex-basis: 160px;}
        article:last-of-type>.item{flex-basis: 30%;}
    </style>
</head>
<body>
    <h2>1. 在未设置弹性元素宽度时, 以内容宽度显示</h2>
    <article>
        <span class="item">item1</span>
        <span class="item">item2</span>
        <span class="item">item3</span>
    </article>
    <h2>2. 存在自定义元素宽度时,则以该宽度显示</h2>
    <article>
        <span class="item">item1</span>
        <span class="item">item2</span>
        <span class="item">item3</span>
    </article>
    <h2>3. 自动状态下, 由浏览器根据预设值自行判定</h2>
    <article>
        <span class="item">item1</span>
        <span class="item">item2</span>
        <span class="item">item3</span>
    </article>
    <h2>4. 当元素存在自定义宽度与基准宽度时, 以基准宽度为准</h2>
    <article>
        <span class="item">item1</span>
        <span class="item">item2</span>
        <span class="item">item3</span>
    </article>
    <h2>5. 弹性元素基准宽度支持百分比设置</h2>
    <article>
        <span class="item">item1</span>
        <span class="item">item2</span>
        <span class="item">item3</span>
    </article>
</body>
</html>

运行实例 »

点击 "运行实例" 按钮查看在线实例

3.jpg

实例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>flex 缩写介绍</title>
    <style>
        article{display: flex;border: 2px dotted green;width: 600px;height: 60px;box-sizing: border-box;}
        article>span{background:radial-gradient( white,red);border-right: solid 1px greenyellow;padding: 20px;box-sizing: border-box;}
        article:first-of-type>.item{flex: initial;/*等价于 flex: 0 1 auto*/}
        article:nth-of-type(2)>.item{flex: auto;/*等价于 flex: 1 1 auto*/}
        article:nth-of-type(3)>.item{flex: none;/*等价于 flex: 0 0 auto*/ width: 180px;}
        article:nth-of-type(4)>.item{flex: 1;/*等价于 flex: 1 1 auto*/ width: 180px;}
        article:nth-last-of-type(2)>.item{flex: 1 0 230px;}
        article:last-of-type>:nth-of-type(2){flex: 0 1 50%;}
    </style>
</head>
<body>
    <h3>
        <p>flex: 如果有多个值,则按以下顺序:</p>
        <p>flex: flex-grow flex-shrink flex-basis</p>
        <p>所以, flex是以上三个属性的缩写, 以后大家尽可能只用它,而不单独使用以上三个属性</p>
        <p>默认状态: flex: 0 1 auto;</p>
        <p>含义: 不增长, 可缩减, 宽度自动</p>
    </h3>
    <h1>简化弹性元素的基本设置</h1>
    <h3>(1): 根据宽度计算,允许缩减适应容器</h3>
    <article>
        <span class="item">item1</span>
        <span class="item">item2</span>
        <span class="item">item3</span>
    </article>
    <h3>(2): 根据宽度计算,元素完全弹性以适应容器</h3>
    <article>
            <span class="item">item1</span>
            <span class="item">item2</span>
            <span class="item">item3</span>
        </article>
    <h3>(3): 元素完全失去弹性, 以原始大小呈现</h3>
    <article>
            <span class="item">item1</span>
            <span class="item">item2</span>
            <span class="item">item3</span>
        </article>
    <h3>(4): 一个数值表示增长因子,其它值默认: flex: 1 1 auto</h3>
    <article>
            <span class="item">item1</span>
            <span class="item">item2</span>
            <span class="item">item3</span>
        </article>
    <h3>(5): 第三个有具体数值时, 以它为计算标准</h3>
    <article>
            <span class="item">item1</span>
            <span class="item">item2</span>
            <span class="item">item3</span>
        </article>
    <h3>(6): 单独设置某一个元素弹性大小 </h3>
    <article>
            <span class="item">item1</span>
            <span class="item">item2</span>
            <span class="item">item3</span>
        </article>
</body>
</html>

运行实例 »

点击 "运行实例" 按钮查看在线实例

4.jpg

5.jpg

flex: initial; = flex: 0 1 auto;

flex: auto; = flex: 1 1 auto; = flex: 1;

flex: none; = flex: 0 0 auto;

总结:明白了flex-grow计算方法,flex-shrink的计算方法,flex-shrink 的弹性元素宽度不一样时,计算方法,有待加强!

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议