欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

js实现炫酷的烟花效果

程序员文章站 2022-03-26 09:17:19
本文实例为大家分享了js实现炫酷的烟花效果的具体代码,供大家参考,具体内容如下我们要理清整个流程的思路。首先建立一块画布,用于展示烟花的效果,然后就要去思考烟花燃放的流程,我们都知道烟花通常都是先有一...

本文实例为大家分享了js实现炫酷的烟花效果的具体代码,供大家参考,具体内容如下

我们要理清整个流程的思路。

首先建立一块画布,用于展示烟花的效果,然后就要去思考烟花燃放的流程,我们都知道烟花通常都是先有一份飞上天,然后再分散成很多个小烟花,并且每一个小烟花都有不同的样式以及运动方式。

所有整体思路就是先建立一个div作为我们的大烟花,当大烟花运动到我们鼠标点击的位置的时候,大烟花就会消失,然后就会产生更多的小烟花,并且这些小烟花的运动轨迹样式各不相同。

1.建立一块画布(div)用于展示烟花的效果

/*给画布设置css样式  */
#container {
        width: 80%;
        height: 600px;
        border: 1px red solid;
        position: relative;
        margin: 20px auto;
        cursor: pointer;
        background: black;
    }
<!-- 设置一个div -->
<div id="container"></div>

2.获取节点

 //获取节点
 var app = document.getelementbyid('container');
        //给app设置一个绑定事件
        app.onclick = function(event) {
                var e = event || window.event
               //获得鼠标点击的位置的坐标
                var pos = {
                    cy: e.offsety,
                    cx: e.offsetx
                }
                new fire(app, pos)
            }

烟花的实现过程:先实现一个大的div运动到鼠标点击的位置,然后在散开成为很多个div

3.先实现大烟花(需要调用随机数方法,随机颜色方法,以及运动函数)

// 构造函数
function fire(app, pos) {
            //把属性设置成变量
            this.app = app;
            this.pos = pos;
            //创建一个大的div
            this.bf = document.createelement('div');
            //设置一个类名
            this.bf.classname = 'fire';
            //设置样式
            this.bf.style.left = this.pos.cx + 'px';
            this.bf.style.background = this.getcolor();
            this.app.appendchild(this.bf);
            //调用运动函数
            this.move(this.bf, {
                top: this.pos.cy
            }, () => {
                this.bf.remove();
                this.smallfire();
            })
        }

3.1首先先设置fire的样式

这是fire的初始样式

 .fire {
        background: red;
        position: absolute;
        /* 设置bottom时,top获取为最大值,减去鼠标点击位置 */
        bottom: 0px;
        width: 6px;
        height: 6px;
    }

3.2设置一个随机数和随机颜色的方法(原型对象)

//获得一个随机数方法
fire.prototype.rand = function(min, max) {
            return math.round(math.random() * (max - min) + min);
        }
 
 
//获得一个随机颜色的方法
 fire.prototype.getcolor = function() {
         let sum = '#';
         for (let i = 0; i < 6; i++) {
               sum += this.rand(0, 15).tostring(16)
           }
             return sum;
           }

3.3封装一个运动函数(原型对象) 

fire.prototype.move = function(ele, target, cb) {
                // clearinterval(times);
                let times = setinterval(function() {
                    // console.log(this);
                    var onoff = true;
                    // 遍历运动的方向和目标
                    for (let attr in target) {
                        // attr 表示运动的属性
                        // console.log(attr);
                        // 获取元素属性的实时值
                        let tmpval = parseint(this.getpos(ele, attr))
                            // 计算speed
                            // console.log(tmpval, attr);
                        let speed = (target[attr] - tmpval) / 10;
                        // 取整
                        speed = speed > 0 ? math.ceil(speed) : math.floor(speed);
                        // 停止计时器,当一个属性运动到位置,设置开关状态
                        if (tmpval == target[attr]) onoff = true;
                        // 让元素动起来
                        ele.style[attr] = tmpval + speed + 'px';
                    }
 
                    // 判断开关状态,清除定时器
                    for (var moveattr in target) {
                        // 如果不相等,就说明有属性没有运动到位置,定时器不能停止
                        if (target[moveattr] !== parseint(this.getpos(ele, moveattr))) {
                            onoff = false;
                            break;
                        }
                    }
                    if (onoff) {
                        clearinterval(times);
                        cb && cb();
                    }
                    // console.log(1111);
                }.bind(this), 30)
            }
            // 获取元素的实时位置的函数
        fire.prototype.getpos = function(obj, attr) {
            if (obj.currentstyle) { // 获取css的样式
                return obj.currentstyle[attr];
            } else {
                return getcomputedstyle(obj)[attr]
            }
        }

通过以上几个步骤我们就可以得到大烟花的运动轨迹,大烟花运动到指定位置后就会消失,并且从消失的地方产生许多小烟花。由前面的分析可以知道,小烟花的运动轨迹和样式各不相同,接下来就是小烟花的实现

4.小烟花的实现

4.1设置samll-fire的样式

这是samll-fire的初始属性

.small-fire {
        width: 10px;
        height: 10px;
        position: absolute;
        border-radius: 50%;
    }

4.2设置小烟花的属性

//小烟花
fire.prototype.smallfire = function() {
            //首先我们设置小烟花的数量
            let num = this.rand(50, 60)
            //遍历 给每一个小烟花设置不同的样式
            for (let i = 0; i < num; i++) {
                let sf = document.createelement('div');
                sf.classname = 'small-fire';
                sf.style.left = this.pos.cx + 'px';
                sf.style.top = this.pos.cy + 'px';
                sf.style.background = this.getcolor();
                //console.log(sf);
                //追加到页面中
                this.app.appendchild(sf);
                //使小烟花的运动轨迹成圆周运动
                //var top = parseint(math.sin(math.pi / 180 * 360 / num * i) * r) + this.pos.cy;
                //var left = parseint(math.cos(math.pi / 180 * 360 / num * i) * r) + this.pos.cx;
                 //给小烟花一个随机的位置,可以是在画布里面的任意一个位置
                 let top = this.rand(0, this.app.offsetheight - sf.offsetheight);
                 let left = this.rand(0, this.app.offsetwidth - sf.offsetwidth);
                //调用运动函数
                this.move(sf, {
                    top: top,
                    left: left
                }, function() {
                    sf.remove();
                })
            }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

相关标签: js 烟花效果