简单的收集金币动画

1,175 阅读1分钟

使用的html加js写的,可以封装成组件

image.png

image.png

image.png

image.png

image.png

image.png

完整代码

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        * {
            padding: 0;
            margin: 0;
        }

        body {
            background: #000;
            position: relative;
            height: 100vh;
        }

        .box {
            width: 375px;
            height: 700px;
            background: #fff;
            border: 25px;
            position: absolute;
            top: 50%;
            left: 50%;
            transform: translate(-50%, -50%);
        }

        .total {
            position: absolute;
            top: 5px;
            left: 50%;
            transform: translateX(-50%);
            width: 50px;
            height: 20px;
            background: red;
        }

        .species {
            position: absolute;
            top: 0;
            left: 0;
            bottom: 0;
            right: 0;
            z-index: 999;
        }

        .speciesstyle {
            position: absolute;
            border-radius: 20px;
            background: rgb(255, 241, 50);
        }
    </style>
</head>

<body>
    <div class="box">
        <!-- 金币飞向 -->
        <div class="total"></div>
    </div>

    <script>

        /**
         * 目前使用的是添加蒙层的操作,金币动画执行过程中无法点击其他操作
         * 需要可以改成其他方式
         * 参数不多,可以改成其他框架组件,都差不多
         */

        let showSetlits = false; //是否已存在
        let R = 80; // 扩散半径
        let time = 0.5; //扩散过度时间
        let time2 = 1; // 收集过度时间
        let w = 20; // 金币大小
        let Num = 8 //金币数量

        const open = document.getElementsByClassName('box')[0] //获取页面信息
        const total = document.getElementsByClassName('total')[0] // 获取金币最终飞向

        // 点击生成金币,可替换成点击某个元素,替换坐标即可
        open.onclick = function (event) {
            // 金币执行过程中不在添加新的事件
            if (showSetlits) return
            let {
                offsetX,
                offsetY
            } = event
            setlits(offsetX, offsetY)
        };
        // 计算金币群生成位置
        function setlits(X, Y) {
            var species = document.createElement('div');
            species.className = 'species'
            for (i = 0; i < Num; i++) {
                var div = document.createElement('div');
                div.className = 'speciesstyle'
                div.style.width = w + 'px',
                    div.style.height = w + 'px',
                    div.style.left = X + 'px',
                    div.style.top = Y + 'px',
                    div.style.transform = 'translate(0%, 0%)',
                    div.style.transition = `${time}s`
                species.appendChild(div);
            }
            open.appendChild(species)
            showSetlits = true
            setTimeout(() => {
                clickss(X, Y)
            }, 0)
        }
        // 计算金币扩散范围和坐标
        function clickss(X, Y) {
            const specielist = document.getElementsByClassName('speciesstyle')
            const num = specielist.length
            const center = {
                x: X,
                y: Y
            }
            for (i = 0; i < num; i++) {
                // 有规律的扩散
                // const xz = center.x + Math.floor(Math.random() * (R- R + 1))+ R * Math.sin(2 * Math.PI * i / num)
                // const yz = center.y + Math.floor(Math.random() *  (R- R + 1)) + R  * Math.cos(2 * Math.PI * i / num)

                // 按照圆形计算并给予随机数,看起来才没有那么有规律  随机扩散
                const xz = center.x + Math.floor(Math.random() * ((R * 1.1) - (R * 0.6) + 1)) + (0.6 * R) * Math.sin(2 * Math.PI * i / num)
                const yz = center.y + Math.floor(Math.random() * ((R * 1.1) - (R * 0.6) + 1)) + (0.6 * R) * Math.cos(2 * Math.PI * i / num)

                // 赋值
                specielist[i].style.transform = `translate(${xz - (X + w / 2)}px, ${yz - (Y + w / 2)}px)`
            }
            // 扩散结束,进行飞向终点计算
            setTimeout(() => {
                for (i = 0; i < num; i++) {
                    specielist[i].style.transition = `${time2}s`
                    specielist[i].style.transform = `translate(0,0)`
                    specielist[i].style.left = total.offsetLeft + 'px'
                    specielist[i].style.top = total.offsetTop + 'px'
                }
                // 结束清除蒙层
                setTimeout(() => {
                    remove()
                }, (Number(time2) + 0.5) * 1000) //飞行时间结束

            }, (Number(time) + 0.5) * 1000) //扩散时间结束
        }

        // 清除dom
        function remove() {
            const species = document.getElementsByClassName('species')[0].remove()
            showSetlits = false
        }
    </script>
</body>

</html>

没有设置随机数的扩散是这样的

Snipaste_2022-04-07_12-35-46.png

下面是效果图

QQ录屏20220407132118 00_00_00-00_00_30.gif