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 相关文章推荐
用jquery ajax获取网站Alexa排名的代码
Dec 12 Javascript
IE浏览器IFrame对象内存不释放问题解决方法
Aug 22 Javascript
BootStrap的弹出框(Popover)支持鼠标移到弹出层上弹窗层不隐藏的原因及解决办法
Apr 03 Javascript
js简单时间比较的方法
Aug 02 Javascript
关于javascript中限定时间内防止按钮重复点击的思路详解
Aug 16 Javascript
BootStrap下拉框在firefox浏览器界面不友好的解决方案
Aug 18 Javascript
JavaScript实现邮箱地址自动匹配功能代码
Nov 28 Javascript
jQuery与js实现颜色渐变的方法
Dec 30 Javascript
浅谈在fetch方法中添加header后遇到的预检请求问题
Aug 31 Javascript
Web开发使用Angular实现用户密码强度判别的方法
Sep 27 Javascript
vue自定义底部导航栏Tabbar的实现代码
Sep 03 Javascript
angular异步验证器防抖实例详解
Mar 31 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
世界上第一台立体声收音机
2021/03/01 无线电
php访问查询mysql数据的三种方法
2006/10/09 PHP
PHP中常用的字符串格式化函数总结
2014/11/19 PHP
php判断linux下程序问题实例
2015/07/09 PHP
php实现背景图上添加圆形logo图标的方法
2016/11/17 PHP
php使用Jpgraph创建折线图效果示例
2017/02/15 PHP
PHP常用操作类之通信数据封装类的实现
2017/07/16 PHP
PHP编程实现计算抽奖概率算法完整实例
2017/08/09 PHP
在TP5数据库中四个字段实现无限分类的示例
2019/10/18 PHP
Javascript学习笔记5 类和对象
2010/01/11 Javascript
JavaScript 类似flash效果的立体图片浏览器
2010/02/08 Javascript
浅析js中取绝对值的2种方法
2013/07/09 Javascript
jquery中map函数遍历数组用法实例
2015/05/18 Javascript
基于AngularJS+HTML+Groovy实现登录功能
2016/02/17 Javascript
JQuery DIV 动态隐藏和显示的方法
2016/06/23 Javascript
JavaScript Base64 作为文件上传的实例代码解析
2017/02/14 Javascript
前端图片懒加载(lazyload)的实现方法(提高用户体验)
2017/08/21 Javascript
angular6 利用 ngContentOutlet 实现组件位置交换(重排)
2018/11/02 Javascript
深入理解令牌认证机制(token)
2019/08/22 Javascript
vue 解决遍历对象显示的顺序不对问题
2019/11/07 Javascript
Python中List.count()方法的使用教程
2015/05/20 Python
K-means聚类算法介绍与利用python实现的代码示例
2017/11/13 Python
解决Python2.7中IDLE启动没有反应的问题
2018/11/30 Python
Python使用pydub库对mp3与wav格式进行互转的方法
2019/01/10 Python
Python控制键盘鼠标pynput的详细用法
2019/01/28 Python
Python-Flask:动态创建表的示例详解
2019/11/22 Python
Hoover胡佛官网:美国吸尘器和洗地机品牌
2019/01/09 全球购物
Made in Design英国:设计家具、照明、家庭装饰和花园家具
2019/09/24 全球购物
大学生个人求职信范文
2013/09/21 职场文书
2014幼儿园教师师德师风演讲稿
2014/09/10 职场文书
反四风对照检查材料
2014/09/22 职场文书
服务整改报告
2014/11/06 职场文书
2015年预备党员自我评价
2015/03/04 职场文书
2019年思想汇报
2019/06/20 职场文书
numpy数据类型dtype转换实现
2021/04/24 Python
漫画「日和酱的要求是绝对的」第3卷封面公开
2022/03/21 日漫