js实现烟花特效


Posted in Javascript onMarch 02, 2020

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

1.概述

在网页背景中实现鼠标点击出现模拟烟花爆炸的特效

2.思路

1.获取鼠标点击位置,底端创建烟花节点。
2.为烟花添加css属性,烟花节点从下至上运动。
3.运动至鼠标位置时移除烟花节点,同时生成多个烟花碎片。
4.为不同的烟花碎片随机生成不同的颜色、运动速度、运动方向。
5.烟花碎片超出屏幕显示部分时移除。

3.代码部分

<!DOCTYPE html>
<html lang="en">
 
<head>
 <meta charset="UTF-8">
 <meta name="viewport" content="width=device-width, initial-scale=1.0">
 <title>Document</title>
 <style>
 * {
  padding: 0;
  margin: 0;
 }
 
 html,
 body {
  width: 100%;
  height: 100%;
  background-color: black;
  overflow: hidden;
 }
 </style>
</head>
 
<body>
 <script src="move.js"></script>
 <script>
 
 class Firework {
  constructor(x, y) {//x,y鼠标的位置
  this.x = x;//将水平位置赋值给this.x属性。
  this.y = y;//将垂直位置赋值给this.y属性。
  this.ch = document.documentElement.clientHeight;//可视区的高度
  }
  init() {
  //1.创建烟花节点。
  this.firebox = document.createElement('div');
  this.firebox.style.cssText = `width:5px;height:5px;background:#fff;position:absolute;left:${this.x}px;top:${this.ch}px;`;
  document.body.appendChild(this.firebox);
  this.firemove();//创建完成,直接运动。
  }
  //2.烟花节点运动
  firemove() {
  bufferMove(this.firebox, { top: this.y }, () => {
   document.body.removeChild(this.firebox);
   //当烟花节点消失的时候,创建烟花碎片
   this.createfires()
  });
  }
  //3.当前鼠标点击的位置,随机产生30-60个盒子。(随机颜色)
  createfires() {
  for (let i = 1; i <= this.rannum(30, 60); i++) {
   this.fires = document.createElement('div');
   this.fires.style.cssText = `width:5px;height:5px;background:rgb(${this.rannum(0, 255)},${this.rannum(0, 255)},${this.rannum(0, 255)});position:absolute;left:${this.x}px;top:${this.y}px;`;
   document.body.appendChild(this.fires);
   this.fireboom(this.fires);//设计成一个一个运动,等到循环结束,出现整体结果。
  }
  }
  //4.烟花碎片运动。
  fireboom(obj) {
  //存储当前obj的初始值。
  let initx = this.x;
  let inity = this.y;
 
  //随机产生速度(水平和垂直方向都是随机的,符号也是随机的)。
  let speedx = parseInt((Math.random() > 0.5 ? '-' : '') + this.rannum(1, 15));
  let speedy = parseInt((Math.random() > 0.5 ? '-' : '') + this.rannum(1, 15));
 
  obj.timer = setInterval(() => {
   initx += speedx;
   inity += speedy++; //模拟重力加速度(垂直方向比水平方向快一些)
   if (inity >= this.ch) {
   document.body.removeChild(obj);
   clearInterval(obj.timer);
   }
   obj.style.left = initx + 'px';
   obj.style.top = inity + 'px';
  }, 1000 / 60);
 
  }
  //随机区间数
  rannum(min, max) {
  return Math.round(Math.random() * (max - min) + min);
  }
 }
 
 
 document.onclick = function (ev) {
  var ev = ev || window.event;
  //ev.clientX,ev.clientY//获取的鼠标的位置
  new Firework(ev.clientX, ev.clientY).init();
 }
 </script>
</body>
 
</html>

4.Move.js

function getStyle(obj, attr) {
 if (window.getComputedStyle) {
 return window.getComputedStyle(obj)[attr];
 } else {
 return obj.currentStyle[attr];
 }
}
function bufferMove(obj, json, fn) {
 let speed = 0;
 clearInterval(obj.timer);
 obj.timer = setInterval(function () {
 var flag = true;
 for (var attr in json) {
  var currentValue = null;
  if (attr === 'opacity') {
  currentValue = Math.round(getStyle(obj, attr) * 100);
  } else {
  currentValue = parseInt(getStyle(obj, attr));
  }
  speed = (json[attr] - currentValue) / 10;
  speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);
 
  if (currentValue !== json[attr]) {
  if (attr === 'opacity') {
   obj.style.opacity = (currentValue + speed) / 100;
   obj.style.filter = 'alpha(opacity=' + (currentValue + speed) + ')';//IE
  } else {
   obj.style[attr] = currentValue + speed + 'px';
  }
  flag = false;
  }
 }
 if (flag) {
  clearInterval(obj.timer);
  fn && typeof fn === 'function' && fn();
 }
 }, 10);
}

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

Javascript 相关文章推荐
JS类库Bindows1.3中的内存释放方式分析
Mar 08 Javascript
JavaScript实现select添加option
Jul 03 Javascript
详解AngularJS1.6版本中ui-router路由中/#!/的解决方法
May 22 Javascript
vue购物车插件编写代码
Nov 27 Javascript
vue如何引入sass全局变量
Jun 28 Javascript
layer弹出层父子页面事件相互调用方法
Aug 17 Javascript
RequireJS用法简单示例
Aug 20 Javascript
微信小程序实现form表单本地储存数据
Jun 27 Javascript
vue实现下拉加载其实没那么复杂
Aug 13 Javascript
JS合并两个数组的3种方法详解
Oct 24 Javascript
JS数据类型STRING使用实例解析
Dec 18 Javascript
VueX模块的具体使用(小白教程)
Jun 05 Javascript
ES6使用 Array.includes 处理多重条件用法实例分析
Mar 02 #Javascript
JS造成内存泄漏的几种情况实例分析
Mar 02 #Javascript
JavaScript HTML DOM 元素 (节点)新增,编辑,删除操作实例分析
Mar 02 #Javascript
JavaScript中break、continue和return的用法区别实例分析
Mar 02 #Javascript
Vue Router的手写实现方法实现
Mar 02 #Javascript
ES6中Set和Map用法实例详解
Mar 02 #Javascript
Vue父组件向子组件传值以及data和props的区别详解
Mar 02 #Javascript
You might like
把77A收信机改造成收音机
2021/03/02 无线电
一个ubbcode的函数,速度很快.
2006/10/09 PHP
php使用COPY函数更新配置文件的方法
2015/06/18 PHP
yii2框架中使用下拉菜单的自动搜索yii-widget-select2实例分析
2016/01/09 PHP
Yii2中datetime类的使用
2016/12/17 PHP
PHP如何根据文件头检测文件类型实例代码
2018/10/14 PHP
在Laravel中使用MongoDB的方法示例
2019/11/11 PHP
javascript eval和JSON之间的联系
2009/12/31 Javascript
JavaScript代码复用模式详解
2014/11/07 Javascript
js数组去重的5种算法实现
2015/11/04 Javascript
jQuery多级联动下拉插件chained用法示例
2016/08/20 Javascript
Bootstrap CSS组件之分页(pagination)和翻页(pager)
2016/12/17 Javascript
Bootstrap3 多个模态对话框无法显示的解决方案
2017/02/23 Javascript
vue获取当前激活路由的方法
2018/03/17 Javascript
Vue SPA单页应用首屏优化实践
2018/06/28 Javascript
Vue结合后台导入导出Excel问题详解
2019/02/19 Javascript
react中Suspense的使用详解
2019/09/01 Javascript
vue实现整屏滚动切换
2020/06/29 Javascript
JavaScript经典案例之简易计算器
2020/08/24 Javascript
Chrome插件开发系列一:弹窗终结者开发实战
2020/10/02 Javascript
一起深入理解js中的事件对象
2021/02/06 Javascript
shell命令行,一键创建 python 模板文件脚本方法
2018/03/20 Python
python中使用zip函数出现错误的原因
2018/09/28 Python
python实现雪花飘落效果实例讲解
2019/06/18 Python
详解Python可视化神器Yellowbrick使用
2019/11/11 Python
Python 写了个新型冠状病毒疫情传播模拟程序
2020/02/14 Python
Python PIL库图片灰化处理
2020/04/07 Python
毕业生求职简历中的自我评价
2013/10/18 职场文书
警察思想汇报
2014/01/04 职场文书
搞笑获奖感言
2014/01/30 职场文书
二年级学生评语大全
2014/04/23 职场文书
充分就业社区汇报材料
2014/05/07 职场文书
党员个人剖析材料(四风问题)
2014/10/07 职场文书
python如何做代码性能分析
2021/04/26 Python
python 实现体质指数BMI计算
2021/05/26 Python
python模板入门教程之flask Jinja
2022/04/11 Python