用js实现一个炫酷的烟花效果

时间:2024-10-02 19:37:57

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

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

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

目录

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

2.获取节点

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

3.1首先先设置fire的样式

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

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

4.小烟花的实现

4.1设置samll-fire的样式

4.2设置小烟花的属性


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

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

2.获取节点

  1. //获取节点
  2. var app = document.getElementById('container');
  3. //给app设置一个绑定事件
  4. app.onclick = function(event) {
  5. var e = event || window.event
  6. //获得鼠标点击的位置的坐标
  7. var pos = {
  8. cy: e.offsetY,
  9. cx: e.offsetX
  10. }
  11. new Fire(app, pos)
  12. }

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

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

  1. // 构造函数
  2. function Fire(app, pos) {
  3. //把属性设置成变量
  4. this.app = app;
  5. this.pos = pos;
  6. //创建一个大的div
  7. this.bf = document.createElement('div');
  8. //设置一个类名
  9. this.bf.className = 'fire';
  10. //设置样式
  11. this.bf.style.left = this.pos.cx + 'px';
  12. this.bf.style.background = this.getColor();
  13. this.app.appendChild(this.bf);
  14. //调用运动函数
  15. this.move(this.bf, {
  16. top: this.pos.cy
  17. }, () => {
  18. this.bf.remove();
  19. this.smallFire();
  20. })
  21. }
'
运行

3.1首先先设置fire的样式

这是fire的初始样式

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

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

  1. //获得一个随机数方法
  2. Fire.prototype.rand = function(min, max) {
  3. return Math.round(Math.random() * (max - min) + min);
  4. }
  5. //获得一个随机颜色的方法
  6. Fire.prototype.getColor = function() {
  7. let sum = '#';
  8. for (let i = 0; i < 6; i++) {
  9. sum += this.rand(0, 15).toString(16)
  10. }
  11. return sum;
  12. }

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

  1. Fire.prototype.move = function(ele, target, cb) {
  2. // clearInterval(times);
  3. let times = setInterval(function() {
  4. // (this);
  5. var onOff = true;
  6. // 遍历运动的方向和目标
  7. for (let attr in target) {
  8. // attr 表示运动的属性
  9. // (attr);
  10. // 获取元素属性的实时值
  11. let tmpVal = parseInt(this.getPos(ele, attr))
  12. // 计算speed
  13. // (tmpVal, attr);
  14. let speed = (target[attr] - tmpVal) / 10;
  15. // 取整
  16. speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);
  17. // 停止计时器,当一个属性运动到位置,设置开关状态
  18. if (tmpVal == target[attr]) onOff = true;
  19. // 让元素动起来
  20. ele.style[attr] = tmpVal + speed + 'px';
  21. }
  22. // 判断开关状态,清除定时器
  23. for (var moveAttr in target) {
  24. // 如果不相等,就说明有属性没有运动到位置,定时器不能停止
  25. if (target[moveAttr] !== parseInt(this.getPos(ele, moveAttr))) {
  26. onOff = false;
  27. break;
  28. }
  29. }
  30. if (onOff) {
  31. clearInterval(times);
  32. cb && cb();
  33. }
  34. // (1111);
  35. }.bind(this), 30)
  36. }
  37. // 获取元素的实时位置的函数
  38. Fire.prototype.getPos = function(obj, attr) {
  39. if (obj.currentStyle) { // 获取css的样式
  40. return obj.currentStyle[attr];
  41. } else {
  42. return getComputedStyle(obj)[attr]
  43. }
  44. }

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

4.小烟花的实现

4.1设置samll-fire的样式

这是samll-fire的初始属性

  1. .small-fire {
  2. width: 10px;
  3. height: 10px;
  4. position: absolute;
  5. border-radius: 50%;
  6. }

4.2设置小烟花的属性

  1. //小烟花
  2. Fire.prototype.smallFire = function() {
  3. //首先我们设置小烟花的数量
  4. let num = this.rand(50, 60)
  5. //遍历 给每一个小烟花设置不同的样式
  6. for (let i = 0; i < num; i++) {
  7. let sf = document.createElement('div');
  8. sf.className = 'small-fire';
  9. sf.style.left = this.pos.cx + 'px';
  10. sf.style.top = this.pos.cy + 'px';
  11. sf.style.background = this.getColor();
  12. //(sf);
  13. //追加到页面中
  14. this.app.appendChild(sf);
  15. //使小烟花的运动轨迹成圆周运动
  16. //var top = parseInt(( / 180 * 360 / num * i) * r) + ;
  17. //var left = parseInt(( / 180 * 360 / num * i) * r) + ;
  18. //给小烟花一个随机的位置,可以是在画布里面的任意一个位置
  19. let top = this.rand(0, this.app.offsetHeight - sf.offsetHeight);
  20. let left = this.rand(0, this.app.offsetWidth - sf.offsetWidth);
  21. //调用运动函数
  22. this.move(sf, {
  23. top: top,
  24. left: left
  25. }, function() {
  26. sf.remove();
  27. })
  28. }
  29. }