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 相关文章推荐
javascript实现2048游戏示例
May 04 Javascript
DOM基础教程之模型中的模型节点
Jan 19 Javascript
完美实现仿QQ空间评论回复特效
May 06 Javascript
jquery实现带缩略图的可定制高度画廊效果(5种)
Aug 28 Javascript
JavaScript数组和对象的复制
Mar 21 Javascript
js实现简单数字变动效果
Nov 06 Javascript
vue 动态绑定背景图片的方法
Aug 10 Javascript
vue项目刷新当前页面的三种方法
Dec 04 Javascript
three.js实现炫酷的全景3D重力感应
Dec 30 Javascript
el-select数据过多懒加载的解决(loadmore)
May 29 Javascript
使用easyui从servlet传递json数据到前端页面的两种方法
Sep 05 Javascript
Vue实现导入Excel功能步骤详解
Jul 03 Vue.js
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
《雄兵连》系列首部大电影《烈阳天道》:可能是因为期望值太高了
2020/08/18 国漫
探讨如何把session存入数据库
2013/06/07 PHP
使用phpQuery采集网页的方法
2013/11/13 PHP
PHP中使用FFMPEG获取视频缩略图和视频总时长实例
2014/05/04 PHP
PHP mkdir()无写权限的问题解决方法
2014/06/19 PHP
php curl上传、下载、https登陆实现代码
2017/07/23 PHP
JS 非图片动态loading效果实现代码
2010/04/09 Javascript
屏蔽网页右键复制和ctrl+c复制的js代码
2013/01/04 Javascript
JS判断两个时间大小的示例代码
2014/01/28 Javascript
使用script的src实现跨域和类似ajax效果
2014/11/10 Javascript
使用jQuery实现两个div中按钮互换位置的实例代码
2017/09/21 jQuery
layui中layer前端组件实现图片显示功能的方法分析
2017/10/13 Javascript
node.js文件上传重命名以及移动位置的示例代码
2018/01/19 Javascript
Vue中的无限加载vue-infinite-loading的方法
2018/04/08 Javascript
TypeScript基础入门教程之三重斜线指令详解
2018/10/22 Javascript
微信小程序判断页面是否从其他页面返回的实例代码
2019/07/03 Javascript
el-table树形表格表单验证(列表生成序号)
2020/05/31 Javascript
[01:38]完美世界高校联赛决赛花絮
2018/12/02 DOTA
Python中列表(list)操作方法汇总
2014/08/18 Python
Python cookbook(数据结构与算法)对切片命名清除索引的方法
2018/03/13 Python
简单实现python数独游戏
2018/03/30 Python
Python2.7 实现引入自己写的类方法
2018/04/29 Python
Python中Numpy mat的使用详解
2019/05/24 Python
在pytorch中对非叶节点的变量计算梯度实例
2020/01/10 Python
Python定时器线程池原理详解
2020/02/26 Python
HTML5离线缓存Manifest是什么
2016/03/09 HTML / CSS
HTML5新增的表单元素和属性实例解析
2014/07/07 HTML / CSS
SQL语言面试题
2013/08/27 面试题
教师自荐信范文
2013/12/09 职场文书
高一物理教学反思
2014/01/24 职场文书
管理部副部长岗位职责范文
2014/03/09 职场文书
大学生就业自我推荐信
2014/05/10 职场文书
管理工程专业求职信
2014/08/10 职场文书
酒店开业主持词
2015/07/02 职场文书
CSS 一行代码实现头像与国旗的融合
2021/10/24 HTML / CSS
基于Redission的分布式锁实战
2022/08/14 Redis