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 index()方法使用代码
Jun 02 Javascript
读jQuery之五(取DOM元素)
Jun 20 Javascript
iframe的onreadystatechange事件在firefox下的使用
Apr 16 Javascript
jquery实现树形菜单完整代码
Dec 29 Javascript
jquery对Json的各种遍历方法总结(必看篇)
Sep 29 Javascript
JScript实现地址选择功能
Aug 15 Javascript
利用three.js画一个3D立体的正方体示例代码
Nov 19 Javascript
JS实现碰撞检测的方法分析
Jan 19 Javascript
js判断输入框不能为空格或null值的实现方法
Mar 02 Javascript
微信小程序 wepy框架与iview-weapp的用法详解
Apr 10 Javascript
解决Vue打包后访问图片/图标不显示的问题
Jul 25 Javascript
js实现简单扫雷
Nov 27 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
为IP查询添加GOOGLE地图功能的代码
2010/08/08 PHP
定义php常量的详解
2013/06/09 PHP
PHP可变函数的使用详解
2013/06/14 PHP
php结合mysql与mysqli扩展处理事务的方法
2016/06/29 PHP
php安装扩展mysqli的实现步骤及报错解决办法
2017/09/23 PHP
在 Laravel 中 “规范” 的开发短信验证码发送功能
2017/10/26 PHP
js读写cookie实现一个底部广告浮层效果的两种方法
2013/12/29 Javascript
JS cookie中文乱码解决方法
2014/01/28 Javascript
javascript的动态加载、缓存、更新以及复用(一)
2014/06/09 Javascript
JavaScript输出当前时间Unix时间戳的方法
2015/04/06 Javascript
jQuery实现将页面上HTML标签换成另外标签的方法
2015/06/09 Javascript
JavaScript实现模仿桌面窗口的方法
2015/07/18 Javascript
原生JS实现瀑布流插件
2018/02/06 Javascript
Koa2 之文件上传下载的示例代码
2018/03/29 Javascript
vue3.0 CLI - 2.4 - 新组件 Forms.vue 中学习表单
2018/09/14 Javascript
微信小程序实现卡片层叠滑动效果
2019/06/21 Javascript
[00:32]DOTA2上海特级锦标赛 Ehome战队宣传片
2016/03/03 DOTA
Python处理RSS、ATOM模块FEEDPARSER介绍
2015/02/18 Python
用Python实现一个简单的能够发送带附件的邮件程序的教程
2015/04/08 Python
浅谈PYTHON 关于文件的操作
2019/03/19 Python
python实现Dijkstra算法的最短路径问题
2019/06/21 Python
python 通过手机号识别出对应的微信性别(实例代码)
2019/12/22 Python
PyTorch中的Variable变量详解
2020/01/07 Python
pycharm 使用anaconda为默认环境的操作
2021/02/05 Python
CSS3 @font-face属性使用指南
2014/12/12 HTML / CSS
澳大利亚在线家具店:Luxo Living
2019/03/24 全球购物
英国领先的隐形眼镜在线供应商:Lenstore.co.uk
2019/11/24 全球购物
描述内存分配方式以及它们的区别
2016/10/15 面试题
维德科技C#面试题笔试题
2015/12/09 面试题
小学生自我评价100字(15篇)
2014/09/18 职场文书
国家领导干部党的群众路线教育实践活动批评与自我批评材料
2014/09/23 职场文书
公司财务会计主管应聘求职信
2014/09/26 职场文书
银行开户授权委托书格式
2014/10/10 职场文书
2019自荐信范文集锦!
2019/07/03 职场文书
导游词之河姆渡遗址博物馆
2019/10/10 职场文书
pandas中对文本类型数据的处理小结
2021/11/01 Python