js雪花特效

思路:

1. 设置一个div —— 当做雪花出生的地图

2. 获取它的宽高 —— 雪花产生的随机坐标在 div 宽高范围内

3. 设置雪花对象 —— 用来装雪花的大小、透明度、坐标、移动速度等属性

4. 设置定时器 —— 每隔相应时间(100ms)产生一个随机坐标的雪花,并添加移动速度

5. 设置第二个定时器 —— 监听雪花移动的距离,超出预设范围(整个屏幕)后移除雪花对象 和 定时器

贴出js代码,写得有那么一些乱,求各位大佬修改!



const Dot = {
/*
    // 点的x坐标
    dotX: 0,
    // 点的y坐标
    dotY:0,
    // 点的大小
    dotSize:2,
    // 点的透明度
    dotOpacity:0.5,
    // 创建点的dom结构
    dotDom:'',
    // 挂载点的dom结构
    allDom:'',
    // 点移动的速度
    dotSpeed:0.5,
*/
    creatDot: () => {
        const allDom = document.getElementById('sky');
        // 确定位置坐标
        const { dotX, dotY } = Dot.dotPosFun()
        const dotSize = Dot.dotSizeFun()
        const dotOpacity = Dot.dotOpacityFun()
        // console.log(dotSize,dotOpacity)
        const dotDom = document.createElement('div');
        dotDom.setAttribute('class','dot')
        // dotDom.setAttribute('data-id',time)
        dotDom.style.top = `-${dotY}px`
        dotDom.style.left = `${dotX}px`
        dotDom.style.width = `${dotSize}px`
        dotDom.style.height = `${dotSize}px`
        dotDom.style.opacity = `${dotOpacity}`
        allDom.appendChild(dotDom)
        const dotSpeed = dotOpacity
        var newTop = Number(-dotY)
        Dot.dotMove(newTop,dotSpeed,dotDom)
    },
    // 点的随机位置
    dotPosFun: () => {
        // const pageY = document.body.clientHeight
        const pageY = document.getElementById("sky").clientHeight
        const pageX = document.body.clientWidth
        // console.log(pageX,pageY)
        const dotX = Dot.randomNum(0,pageX)
        const dotY = Dot.randomNum(0,pageY)
        return { dotX, dotY }
    },

    // 点的随机大小
    dotSizeFun: () => {
        const dotSize = Dot.randomNum(0,5)
        // console.log(typeof(dotSize))
        return dotSize
    },

    // 点的随机透明度
    dotOpacityFun: () => {
        const dotOpacityNum = Dot.randomNum(1,10)
        const dotOpacity = Number(`0.${dotOpacityNum}`)
        return dotOpacity
    },

    // 随机产生一个数
    randomNum: (...arguments) => { 
        // arguments[0] = minNum
        // arguments[1] = maxNum
        switch(arguments.length){ 
            case 1: 
                return parseInt(Math.random()*arguments[0]+1,10); 
            break; 
            case 2: 
                return parseInt(Math.random()*(arguments[1]-arguments[0]+1)+arguments[0],10); 
            break; 
            default: 
                return 0; 
            break; 
        }
    },

    // 点的移动
    dotMove: (newTop,dotSpeed,dotDom) => {
        // pageY 控制雪花落到页面底部往上100px处消失
        const pageY = document.body.clientHeight - 100
        const moveInterval = setInterval(function(){
            // 雪花在页面顶部0px以外,-20px以内的地方产生
            newTop = newTop + dotSpeed*20
            dotDom.style.top = `${newTop}px`
                if(newTop >= pageY){
                    document.getElementById('sky').removeChild(dotDom)
                    clearInterval(moveInterval)
                }
        },1000)
    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值