zoukankan      html  css  js  c++  java
  • flex布局中flex属性运用在随机发红包的算法上

        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()}`);
        }

      

  • 相关阅读:
    ExtJS专题(十):layout布局的使用(3)
    ExtJS专题(十一):lTree的Treepanel使用
    ExtJS专题(四):ExtJS组件的属性
    ExtJS专题(七):ExtJS面板Panel中视图区ViewPort的使用
    ExtJS专题(二):ExtJS类库和组件介绍
    ExtJS专题(十):layout布局的使用(1)
    EXtJS专题(九):ExtJS对话框的使用
    ExtJS专题(五):ExtJS面板Panel的使用
    ExtJS专题(三):ExtJS组件的使用
    ExtJS专题(八):ExtJS窗口Window的使用
  • 原文地址:https://www.cnblogs.com/demeter/p/14229021.html
Copyright © 2011-2022 走看看