flex布局是现在前端基本上都会运用的一种布局,基本上用到比较多的是父元素设置display:flex,两个子元素,一个设置固定宽度,另一个设置为flex:1(这里都指flex-direction为row),flex属性其实是:flex-grow,flex-shrink以及flex-basis三个属性的简写,详细的这里不做多的说明,这里主要说一下flex-shrink,这个值指所有的子元素如果宽度之和大于父元素,则根据所占比例去各自减少各自应该减少的部分,比如说父元素宽度为200px,有两个子元素A,B,宽度都设为了200px,flex-shrink值分别设为2,3,此时A,B加起来宽度为400px,超出了父元素的宽度,此时A,B的实际宽度为别为:200 -(400 - 200)* 2/5 = 120px,200 -(400 - 200)* 3/5 = 80px。

根据比例减少这个,可以让我们运用到一些算法上,例如固定金额随机发固定数量的红包,具体的算法思想就是,随机生成0~1的小数,先算出随机金额,然后将所有比例相加,得到一个总的比例,这里可能小于1也可能大于1,如果小于1,则根据比例所占的总比例去相应的减少或增加。具体的代码附上:

    function randMoney(total, num) {
        const perMoney = []; // 最终随机金额
        const perScale = []; // 随机比例
        if (num === 1) {
            perMoney.push(total);
        } else {
            for (let i = 0; i < num; i++) {
                let randRatio = Math.random();
                if (randRatio === 0) { // 这里如果得出比例等于0则要重新随机所以直接i--,当然这里也可以用while循环
                    i--;
                } else {
                    perScale.push(randRatio);
                }
            }
            // 得到总比例
            const totalScale = perScale.reduce((pre, item) => { 
                return Number(pre) + Number(item);
            });
            let changeMoney = totalScale > 1 ? total * (totalScale - 1) : total * (1 - totalScale); // 超出或不足的金额值
            perScale.forEach((item) => {
                let originMoney = total * item; // 根据最初的比例得到的金额
                let changeMoneyItem = changeMoney * (item / totalScale); // 差值金额
                let itemMoney = totalScale > 1 ? originMoney - changeMoneyItem : originMoney + changeMoneyItem; // 得到最终的按比例计算过的金额
                perMoney.push(itemMoney.toFixed(2));
            });
        }
        console.log(`${total}随机分为${num}个红包,金额分别是:${perMoney.toString()}`);
    }

  

最新文章

  1. [jquery]模仿radio单项选择
  2. C#连接数据库SQL,并转换成list形式
  3. 一个想了好几天的问题——关于8086cpu自己编写9号中断不能单步的问题
  4. Hibernate各种主键生成策略与配置详解《转》
  5. 头文件定义和ARM指令
  6. ZOJ 1610 Count the Colors (线段树区间更新)
  7. npm使用过程中的一些错误解决办法及npm常用命令
  8. 如何编译libcurl
  9. Winform 无边框随意拖动【转载】
  10. Thanks
  11. Linux下安装MySQL-5.7
  12. 配置nginx支持path_info模式
  13. SpringMVC框架五:图片上传与JSON交互
  14. win10常用命令和设置总结
  15. Scala--文件和正则表达式
  16. TreeMap(红黑树)源码分析
  17. 【转】DSL
  18. [UE4]把枪抽象为一个类
  19. 在centos6.5下用nginx无法连接zabbix与mysql的解决办法
  20. 2-sat基础题 BZOJ 1823

热门文章

  1. 在Java中,负数的绝对值竟然不一定是正数!!!
  2. map 和 unordered_map
  3. mybatis的增删改查返回值小析(六)
  4. 解决VS2017调试卡住的问题
  5. 素数(质数)(Java版)
  6. 忘记oracle的sys和system的密码
  7. php cookie赋值使用
  8. (原创)[.Net] 进程间通信框架(基于共享内存)——SimpleMMF
  9. ORACLE ORA-00933: SQL 命令未正确结束,
  10. Vulhub-DC-2靶场