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 相关文章推荐
jquery下操作HTML控件的实现代码
Jan 12 Javascript
经典海量jQuery插件 大家可以收藏一下
Feb 07 Javascript
js图片向右一张张滚动效果实例代码
Nov 23 Javascript
jquery插件unobtrusive实现片段式加载
Jun 15 Javascript
jQuery Ajax 上传文件处理方式介绍(推荐)
Jun 30 Javascript
jQuery实现简单倒计时功能的方法
Jul 04 Javascript
基于canvas的二维码邀请函生成插件
Feb 14 Javascript
完美实现js拖拽效果 return false用法详解
Jul 28 Javascript
Angular实现的简单查询天气预报功能示例
Dec 27 Javascript
关于js对textarea换行符的处理方法浅析
Aug 03 Javascript
webpack4 升级迁移的实现
Sep 12 Javascript
JavaScript实现电灯开关小案例
Mar 30 Javascript
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集成FCK的函数代码
2008/09/27 PHP
PHP 采集程序 常用函数
2008/12/18 PHP
11个PHP 分页脚本推荐
2011/08/15 PHP
PHP循环函数使用介绍之PHP基础入门教程
2013/09/21 PHP
3个PHP多维数组转为一维数组的方法实例
2014/03/13 PHP
JQuery对checkbox操作 (循环获取)
2011/05/20 Javascript
firebug的一个有趣现象介绍
2011/11/30 Javascript
Jquery实现鼠标移上弹出提示框、移出消失思路及代码
2013/05/19 Javascript
jquery实现可关闭的倒计时广告特效代码
2015/09/02 Javascript
javascript类型系统——日期Date对象全面了解
2016/07/13 Javascript
ES6新特征数字、数组、字符串
2016/10/01 Javascript
NODE.JS跨域问题的完美解决方案
2016/10/20 Javascript
Bootstrap简单表单显示学习笔记
2016/11/15 Javascript
js实现交通灯效果
2017/01/13 Javascript
详解CommonJS和ES6模块循环加载处理的区别
2018/12/26 Javascript
ElementUI radio组件选中小改造
2019/08/12 Javascript
python中urllib模块用法实例详解
2014/11/19 Python
在Python中操作列表之List.pop()方法的使用
2015/05/21 Python
详解如何使用Python编写vim插件
2017/11/28 Python
django实现用户登陆功能详解
2017/12/11 Python
TensorFlow实现MLP多层感知机模型
2018/03/09 Python
详解Numpy中的广播原则/机制
2018/09/20 Python
Django 博客实现简单的全文搜索的示例代码
2020/02/17 Python
关于tensorflow softmax函数用法解析
2020/06/30 Python
阿迪达斯希腊官方网上商店:adidas希腊
2019/04/06 全球购物
为什么UNION ALL比UNION快
2016/03/17 面试题
会计应聘求职信范文
2013/12/17 职场文书
运动会广播稿30字
2014/01/21 职场文书
精彩的演讲稿开头
2014/05/08 职场文书
如何写股份合作协议书
2014/09/11 职场文书
加强作风建设工作总结
2014/10/23 职场文书
县级领导干部开展党的群众路线教育实践活动工作汇报
2014/10/25 职场文书
农村党建工作汇报材料
2014/10/27 职场文书
基层党员学习党的群众路线教育实践活动心得体会
2014/11/04 职场文书
mysql查询的控制语句图文详解
2021/04/11 MySQL
Redis实现短信验证码登录的示例代码
2022/06/14 Redis