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 模拟气泡屏保效果代码
Jul 10 Javascript
jquery实现弹出div,始终显示在屏幕正中间的简单实例
Mar 08 Javascript
简化版手机端照片预览组件
Apr 13 Javascript
一个Js文件函数中调用另一个Js文件函数的方法演示
Aug 14 Javascript
Vue2.0系列之过滤器的使用
Mar 01 Javascript
JavaScript类数组对象转换为数组对象的方法实例分析
Jul 24 Javascript
微信小程序在ios下Echarts图表不能滑动的问题解决
Jul 10 Javascript
layui实现数据表格隐藏列的示例
Oct 25 Javascript
微信小程序实现下滑到底部自动翻页功能
Mar 07 Javascript
JS实现碰撞检测效果
Mar 12 Javascript
详解react组件通讯方式(多种)
May 06 Javascript
关于JavaScript回调函数的深入理解
Jun 27 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 和 XML: 使用expat函数(一)
2006/10/09 PHP
Windows下利用Gvim写PHP产生中文乱码问题解决方法
2011/04/20 PHP
php中3种方法统计字符串中每种字符的个数并排序
2012/08/27 PHP
php使用strtotime和date函数判断日期是否有效代码分享
2013/12/25 PHP
深入讲解PHP Session及如何保持其不过期的方法
2015/08/18 PHP
浅析php静态方法与非静态方法的用法区别
2016/05/17 PHP
利用PHP生成CSV文件简单示例
2016/12/21 PHP
详解yii2实现分库分表的方案与思路
2017/02/03 PHP
IE 上下滚动展示模仿Marquee机制
2009/12/20 Javascript
使用IE6看老赵的博客 jQuery初探
2010/01/17 Javascript
经典海量jQuery插件 大家可以收藏一下
2010/02/07 Javascript
JavaScript 以对象为索引的关联数组
2010/05/19 Javascript
jQuery 幻灯片插件(带缩略图功能)
2011/01/24 Javascript
纯JavaScript代码实现移动设备绘图解锁
2015/10/16 Javascript
JS与jQ读取xml文件的方法
2015/12/08 Javascript
JSONP和批量操作功能的实现方法
2016/08/21 Javascript
浅谈Angular文字折叠展开组件的原理分析
2017/11/24 Javascript
简单的Vue异步组件实例Demo
2017/12/27 Javascript
JavaScript中set与get方法用法示例
2018/08/15 Javascript
vue基础之v-bind属性、class和style用法分析
2019/03/11 Javascript
vue 百度地图(vue-baidu-map)绘制方向箭头折线实例代码详解
2020/04/28 Javascript
Python多线程编程(四):使用Lock互斥锁
2015/04/05 Python
Python基于PycURL自动处理cookie的方法
2015/07/25 Python
Python内建模块struct实例详解
2018/02/02 Python
django 解决manage.py migrate无效的问题
2018/05/27 Python
Python实现ping指定IP的示例
2018/06/04 Python
python特性语法之遍历、公共方法、引用
2018/08/08 Python
Python3实现获取图片文字里中文的方法分析
2018/12/13 Python
详解python中list的使用
2019/03/15 Python
在Python中获取操作系统的进程信息
2019/08/27 Python
python实现布隆过滤器及原理解析
2019/12/08 Python
五个2015 年最佳HTML5 框架
2015/11/11 HTML / CSS
HTML5离线应用与客户端存储的实现
2018/05/03 HTML / CSS
师范教师毕业鉴定
2014/01/13 职场文书
水利学院求职自荐书
2014/02/01 职场文书
经济贸易系毕业生求职信
2014/05/31 职场文书