JS实现放烟花效果


Posted in Javascript onMarch 10, 2020

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

<!DOCTYPE html>
<html>
 <head>
 <meta charset="UTF-8">
 <title>放烟花——欣欣博客</title>
 <style>
 html,body{overflow:hidden;}
 body,div,p{margin:0;padding:0;}
 body{background:#000;font:12px/1.5 arial;color:#7A7A7A;}
 .fire {
 width: 3px;
 height: 30px;
 background: white;
 position: absolute;
 } 
 .spark {
 position: absolute;
 width: 6px;
 height: 6px;
 }
 </style>
 <script src="move.js"></script>
 <script>
 οnlοad=function(){
 document.οnclick=function(e){
  e =e||event;
  var coord ={
  x:e.clientX,
  y:e.clientY
  };
  new Fire(coord).init().launch();
 }
 
 function Fire(coord){
  var self = this;
  //初始化
  this.init=function(){
  this.ball = document.createElement("div");
  this.ball.className="fire";
  this.ball.style.left = coord.x+"px";
  this.ball.style.top= window.innerHeight +"px";
  document.body.appendChild(this.ball);
  return this;
  }
  //发射
  this.launch=function(){
  
  animate(this.ball,{left:coord.x,top:coord.y,height:3},{callback:function(){
  self.explode();
  }});  
  return this;
  }
  //爆炸
  this.explode=function(){
  this.destory();
  var count = randomInt(30,50);
  for(var i =0;i<count;i++){
  new Spark(coord).init().parabola();
  }
  }
  //销毁
  this.destory = function(){
  this.ball.remove();
  }
 }
 function Spark(coord){
  var self = this;
  this.init=function(){
  this.box = document.createElement("div");
  this.box.className="spark";
  this.box.style.backgroundColor="#"+randomColor();
  console.log(this.box.style.backgroundColor)
  this.box.style.left = coord.x+"px";
  this.box.style.top = coord.y+"px";
  this.box.speedX = randomInt(-20,20);
  this.box.speedY = randomInt(-20,10);
  document.body.appendChild(this.box);
  return this;
  }
  this.parabola=function(){
  
  this.timer =setInterval(function(){
  if(self.box.offsetTop >window.innerHeight){
  clearInterval(self.timer);
  self.destroy();
  return;
  }
  self.box.style.left = self.box.offsetLeft + self.box.speedX +"px";
  self.box.style.top = self.box.offsetTop +self.box.speedY++ +"px";
  
  },30)
  
  }
  this.destory=function(){
  this.box.remove();
  }
  
  
 }
 
 //随机整数
 function randomInt(min,max){
  return Math.round(Math.random()*(max-min)+min);
 }
 //随机颜色
 function randomColor(){
  var R = Math.round( Math.random()*255 ).toString(16);
  var G = Math.round( Math.random()*255 ).toString(16);
  var B = Math.round( Math.random()*255 ).toString(16);
  return (R.length<2?"0"+R:R) + (G.length<2?"0"+G:G)+ (B.length<2?"0"+B:B);
 }
 }
 </script>
 </head>
 <body>
 
 </body>
</html>

move.js

/**
 * 
 * @param {Object} obj 目标对象
 * @param {Object} json 要改变的属性
 * @param {Object} extend {buffer,callback} 当buffer为true时为弹性运动
 * callback会在运动结束时,被执行
 * animate(obj, {top:500, left: 300}, {callback:function(){}, buffer: true})
 */
function animate(obj, json, extend){
 extend = extend || {};
 if(obj.isMoving){
 return;
 } else {
 stop();
 obj.isMoving = true;
 }
 //obj = Object.assgin(obj,extend);
 obj.buffer = extend.buffer;
 obj.callback = extend.callback;
 obj.timerlist = {};
 //为每一个属性添加一个定时器
 for(var attr in json){
 (function(attr){
 obj.timerlist[attr] = {speed:0};
 obj.timerlist[attr].timer = setInterval(function(){
 //首先得到当前值
 var iNow = 0;
 if(attr == "opacity"){
  iNow = getStyle(obj, attr) * 100; 
 } else {
  iNow = getStyle(obj, attr);
 }
 var speed = obj.timerlist[attr].speed;
 //根据目标值,计算需要的速度
 if(obj.buffer==true){
  speed += (json[attr] - iNow)/5;
  speed *= 0.75;
 } else {
  speed = (json[attr] - iNow)/5;
 }
 //当无限接近目标值时,停止定时器
 if(Math.abs(iNow - json[attr]) < 0.5){
  clearInterval(obj.timerlist[attr].timer);
  delete obj.timerlist[attr];
  if(getObjLength(obj.timerlist)==0){//所有定时器已停止
  stop();
  obj.callback ? obj.callback() : "";
  }
 } else {
  //根据速度,修改当前值
  if(attr == "opacity"){
  obj.style.opacity = (iNow+speed)/100;
  obj.style.filter = 'alpha(opacity=' + parseFloat(iNow+speed) + ')'; 
  } else {
  obj.style[attr] = iNow+speed+"px";
  }
  obj.timerlist[attr].speed = speed;
 }
 }, 30);
 })(attr);
 }
 
 function clearTimer(){
 for(var i in obj.timerlist){
 clearInterval(obj.timerlist[i]);
 }
 }
 function getStyle(obj, attr){
 if(obj.currentStyle){
 return isNaN(parseFloat(obj.currentStyle[attr])) ? obj.style[attr]=0 : parseFloat(obj.currentStyle[attr]);
 } else {
 return isNaN(parseFloat(getComputedStyle(obj, null)[attr])) ? obj.style[attr]=0 : parseFloat(getComputedStyle(obj, null)[attr]);
 }
 }
 function getObjLength(obj){
 var n = 0;
 for(var i in obj){
 n++;
 }
 return n;
 }
 function stop(){
 clearTimer();//清除所有定时器
 obj.isMoving = false;
 }
}

更多JavaScript精彩特效分享给大家:

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

Javascript 相关文章推荐
JS实现屏蔽shift,Ctrl,alt等功能键的方法
Jun 01 Javascript
纯js代码制作的网页时钟特效【附实例】
Mar 30 Javascript
jQuery用noConflict代替$的实现方法
Apr 12 jQuery
js事件委托和事件代理案例分享
Jul 25 Javascript
微信小程序下拉刷新界面的实现
Sep 28 Javascript
vue-cli脚手架-bulid下的配置文件
Mar 27 Javascript
jQuery实现checkbox全选功能完整实例
Jul 12 jQuery
Angular2使用SVG自定义图表(条形图、折线图)组件示例
May 10 Javascript
微信小程序如何利用getCurrentPages进行页面传值
Jul 01 Javascript
vue中获取滚动table的可视页面宽度调整表头与列对齐(每列宽度不都相同)
Aug 17 Javascript
微信小程序wx.getUserInfo授权获取用户信息(头像、昵称)的实现
Aug 19 Javascript
vue使用v-model进行跨组件绑定的基本实现方法
Apr 28 Vue.js
JS实现烟花爆炸效果
Mar 10 #Javascript
JS Web Flex弹性盒子模型代码实例
Mar 10 #Javascript
JS实现网页烟花动画效果
Mar 10 #Javascript
keep-alive不能缓存多层级路由菜单问题解决
Mar 10 #Javascript
JS关闭子窗口并且刷新上一个窗口的实现示例
Mar 10 #Javascript
Vue动态加载图片在跨域时无法显示的问题及解决方法
Mar 10 #Javascript
Vue项目打包压缩的实现(让页面更快响应)
Mar 10 #Javascript
You might like
PHP 处理TXT文件(打开/关闭/检查/读取)
2013/05/13 PHP
PHP中SSO Cookie登录分析和实现
2015/11/06 PHP
js 鼠标点击事件及其它捕获
2009/06/04 Javascript
Jquery日期选择datepicker插件用法实例分析
2015/06/08 Javascript
JavaScript中的getMilliseconds()方法使用详解
2015/06/10 Javascript
详解JavaScript函数
2015/12/01 Javascript
jQuery实现div拖拽效果实例分析
2016/02/20 Javascript
jQuery实现背景弹性滚动的导航效果
2016/06/01 Javascript
Vuex之理解Store的用法
2017/04/19 Javascript
通过Nodejs搭建网站简单实现注册登录流程
2019/06/14 NodeJs
vue实现路由监听和参数监听
2019/10/29 Javascript
VUE-ElementUI 自定义Loading图操作
2020/11/11 Javascript
前端 javascript 实现文件下载的示例
2020/11/24 Javascript
[02:36]DOTA2英雄基础教程 帕格纳
2014/01/20 DOTA
[03:05]《我与DAC》之xiao8:DAC与BG
2018/03/27 DOTA
python发送邮件接收邮件示例分享
2014/01/21 Python
python基于Tkinter库实现简单文本编辑器实例
2015/05/05 Python
Django 2.0版本的新特性抢先看!
2018/01/05 Python
Python装饰器原理与简单用法实例分析
2018/04/29 Python
用pycharm开发django项目示例代码
2019/06/13 Python
python迭代器常见用法实例分析
2019/11/22 Python
Python-jenkins模块之folder相关操作介绍
2020/05/12 Python
python3检查字典传入函数键是否齐全的实例
2020/06/05 Python
python使用布隆过滤器的实现示例
2020/08/20 Python
Python getsizeof()和getsize()区分详解
2020/11/20 Python
匡威荷兰官方网站:Converse荷兰
2018/10/24 全球购物
Kipling意大利官网:世界著名的时尚休闲包袋品牌
2019/06/05 全球购物
泰国Robinson百货官网:购买知名品牌的商品
2020/02/08 全球购物
C语言编程练习
2012/04/02 面试题
店铺转让协议书(2014版)
2014/09/23 职场文书
群众路线教育实践活动学习笔记
2014/11/05 职场文书
党员示范岗材料
2014/12/19 职场文书
先进班组事迹材料
2014/12/25 职场文书
乡镇团委工作总结2015
2015/05/26 职场文书
教师学期述职自我鉴定
2019/08/16 职场文书
MySQL中distinct与group by之间的性能进行比较
2021/05/26 MySQL