JS基于面向对象实现的放烟花效果


Posted in Javascript onMay 07, 2015

本文实例讲述了JS基于面向对象实现的放烟花效果。分享给大家供大家参考。具体实现方法如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>js放烟花效果(面向对象版)</title>
<style type="text/css">
html,body{overflow:hidden;}
body,div,p{margin:0;padding:0;}
body{background:#000;font:12px/1.5 arial;color:#7A7A7A;}
a{text-decoration:none;outline:none;}
#tips,#copyright{position:absolute;width:100%;height:50px;text-align:center;background:#171717;border:2px solid #484848;}
#tips{top:0;border-width:0 0 2px;}
#tips a{font:14px/30px arial;color:#FFF;background:#F06;display:inline-block;margin:10px 5px 0;padding:0 15px;border-radius:15px;}
#tips a.active{background:#FE0000;}
#copyright{bottom:0;line-height:50px;border-width:2px 0 0;}
#copyright a{color:#FFF;background:#7A7A7A;padding:2px 5px;border-radius:10px;}
#copyright a:hover{background:#F90;}
p{position:absolute;top:55px;width:100%;text-align:center;}
</style>
<script type="text/javascript">
var fgm = {
 on: function(element, type, handler) {
 return element.addEventListener ? element.addEventListener(type, handler, false) : element.attachEvent("on" + type, handler)
 },
 un: function(element, type, handler) {
 return element.removeEventListener ? element.removeEventListener(type, handler, false) : element.detachEvent("on" + type, handler)
 },
 bind: function(object, handler) {
 return function() {
  return handler.apply(object, arguments) 
 } 
 },
 randomRange: function(lower, upper) {
 return Math.floor(Math.random() * (upper - lower + 1) + lower) 
 },
 getRanColor: function() {
 var str = this.randomRange(0, 0xFFFFFF).toString(16);
 while(str.length < 6) str = "0" + str;
 return "#" + str 
 }
};
//初始化对象
function FireWorks() {
 this.type = 0;
 this.timer = null;
 this.fnManual = fgm.bind(this, this.manual)
}
FireWorks.prototype = {
 initialize: function() {
 clearTimeout(this.timer);
 fgm.un(document, "click", this.fnManual);
 switch(this.type) {
  case 1:
  fgm.on(document, "click", this.fnManual);
  break;
  case 2:
  this.auto();
  break;
 };
 },
 manual: function(event) {
 event = event || window.event;
 this.__create__({
  x: event.clientX,
  y: event.clientY 
 });
 },
 auto: function ()
 {
 var that = this;
 that.timer = setTimeout(function() {  
  that.__create__({
  x: fgm.randomRange(50, document.documentElement.clientWidth - 50),
  y: fgm.randomRange(50, document.documentElement.clientHeight - 150)
  }) 
  that.auto();
 }, fgm.randomRange(900, 1100))
 },
 __create__: function (param)
 {
 var that = this;
 var oEntity = null;
 var oChip = null;
 var aChip = [];
 var timer = null;
 var oFrag = document.createDocumentFragment();
 oEntity = document.createElement("div");
 with(oEntity.style) {
  position = "absolute";
  top = document.documentElement.clientHeight + "px";
  left = param.x + "px";
  width = "4px";
  height = "30px";
  borderRadius = "4px";
  background = fgm.getRanColor();
 };
 document.body.appendChild(oEntity);
 oEntity.timer = setInterval(function() {
  oEntity.style.top = oEntity.offsetTop - 20 + "px";
  if(oEntity.offsetTop <= param.y) {
  clearInterval(oEntity.timer);
  document.body.removeChild(oEntity);
  (function() {
   //在50-100之间随机生成碎片
   //由于IE浏览器处理效率低, 随机范围缩小至20-30
   //自动放烟花时, 随机范围缩小至20-30
   var len = (/msie/i.test(navigator.userAgent) || that.type == 2) ? fgm.randomRange(20, 30) : fgm.randomRange(50, 100)   
   for (i = 0; i < len; i++) {
   oChip = document.createElement("div");
   with(oChip.style) {
    position = "absolute";
    top = param.y + "px";
    left = param.x + "px";
    width = "4px";
    height = "4px";
    overflow = "hidden";
    borderRadius = "4px";
    background = fgm.getRanColor();  
   };
   oChip.speedX = fgm.randomRange(-20, 20);
   oChip.speedY = fgm.randomRange(-20, 20);
   oFrag.appendChild(oChip);
   aChip[i] = oChip
   };
   document.body.appendChild(oFrag);
   timer = setInterval(function() {
   for(i = 0; i < aChip.length; i++) {
    var obj = aChip[i];
    with(obj.style) {
    top = obj.offsetTop + obj.speedY + "px";
    left = obj.offsetLeft + obj.speedX + "px";
    };
    obj.speedY++;
    (obj.offsetTop < 0 || obj.offsetLeft < 0 || obj.offsetTop > document.documentElement.clientHeight || obj.offsetLeft > document.documentElement.clientWidth) && (document.body.removeChild(obj), aChip.splice(i, 1))
   };
   !aChip[0] && clearInterval(timer);
   }, 30)
  })()
  }
 }, 30)
 }
};
fgm.on(window, "load", function() {
 var oTips = document.getElementById("tips");
 var aBtn = oTips.getElementsByTagName("a");
 var oFireWorks = new FireWorks();
 fgm.on(oTips, "click", function(event) {
 var oEvent = event || window.event;
 var oTarget = oEvent.target || oEvent.srcElement;
 var i = 0;
 if(oTarget.tagName.toUpperCase() == "A") {
  for(i = 0; i < aBtn.length; i++) aBtn[i].className = "";
  switch(oTarget.id) {
  case "manual":
   oFireWorks.type = 1;
   break;
  case "auto":
   oFireWorks.type = 2;
   break;
  case "stop":
   oFireWorks.type = 0;
   break;
  }
  oFireWorks.initialize();
  oTarget.className = "active";
  oEvent.stopPropagation ? oEvent.stopPropagation() : oEvent.cancelBubble = true
 }
 });
});
fgm.on(document, "contextmenu", function(event) {
 var oEvent = event || window.event;
 oEvent.preventDefault ? oEvent.preventDefault() : oEvent.returnValue = false
});
</script>
</head>
<body>
<div id="tips"><a id="manual" href="javascript:;">手动放烟花</a><a id="auto" href="javascript:;">自动放烟花</a><a id="stop" href="javascript:;">停止放烟花</a></div>
<p>由于浏览器渲染能力有限, 当浏览器为IE或选择自动放烟花时, 随机生成的烟花碎片范围自动调整至20-30</p>
<div id="copyright">建议使用Firefox, Chrome浏览器预览效果. By — Ferris, QQ:21314130</div>
</body>
</html>

希望本文所述对大家的javascript程序设计有所帮助。

Javascript 相关文章推荐
我遇到的参数传递中 双引号单引号嵌套问题
Feb 11 Javascript
JSON辅助格式化处理方法
Mar 26 Javascript
IE下JS读取xml文件示例代码
Aug 05 Javascript
JQuery筛选器全系列介绍
Aug 27 Javascript
jquery foreach使用示例
Sep 12 Javascript
在HTML代码中使用JavaScript代码的例子
Oct 16 Javascript
简介AngularJS的视图功能应用
Jun 17 Javascript
轻松实现JavaScript图片切换
Jan 12 Javascript
微信小程序 表单Form实例详解(附源码)
Dec 22 Javascript
BootStrap selectpicker后台动态绑定数据
Jun 01 Javascript
利用node实现一个批量重命名文件的函数
Dec 21 Javascript
Angular+ionic实现折叠展开效果的示例代码
Jul 29 Javascript
jquery中trigger()无法触发hover事件的解决方法
May 07 #Javascript
javascript实现的图片切割多块效果实例
May 07 #Javascript
javascript中indexOf技术详解
May 07 #Javascript
javascript限制文本框输入值类型的方法
May 07 #Javascript
浅谈Javascript的静态属性和原型属性
May 07 #Javascript
ECMAScript5(ES5)中bind方法使用小结
May 07 #Javascript
JS中获取函数调用链所有参数的方法
May 07 #Javascript
You might like
PHP清除字符串中所有无用标签的方法
2014/12/01 PHP
PHP文件缓存类示例分享
2015/01/30 PHP
PHP将页面中点击数量高的链接进行高亮显示的方法
2016/05/30 PHP
js 函数的执行环境和作用域链的深入解析
2009/11/01 Javascript
js 模拟气泡屏保效果代码
2010/07/10 Javascript
仿百度输入框智能提示的js代码
2013/08/22 Javascript
我的Node.js学习之路(二)NPM模块管理
2014/07/06 Javascript
JavaScript动态设置div的样式的方法
2015/12/26 Javascript
js实现倒计时效果(小于10补零)
2017/03/08 Javascript
vue表单绑定实现多选框和下拉列表的实例
2017/08/12 Javascript
jQuery事件对象的属性和方法详解
2017/09/09 jQuery
Vue-router 类似Vuex实现组件化开发的示例
2017/09/15 Javascript
详解如何使用babel进行es6文件的编译
2018/05/29 Javascript
详解如何模拟实现node中的Events模块(通俗易懂版)
2019/04/15 Javascript
vue.js 打包时出现空白页和路径错误问题及解决方法
2019/06/26 Javascript
python3.5使用tkinter制作记事本
2016/06/20 Python
轻松实现TensorFlow微信跳一跳的AI
2018/01/05 Python
python素数筛选法浅析
2018/03/19 Python
Python计算一个给定时间点前一个月和后一个月第一天的方法
2018/05/29 Python
用Python+OpenCV对比图像质量的几种方法
2019/07/15 Python
Jupyter打开图形界面并画出正弦函数图像实例
2020/04/24 Python
5分钟快速掌握Python定时任务框架的实现
2021/01/26 Python
手把手教你配置JupyterLab 环境的实现
2021/02/02 Python
一款基于css3的动画按钮代码教程
2014/11/23 HTML / CSS
蛋糕店的商业计划书范文
2014/01/27 职场文书
餐厅销售主管职责范本
2014/02/19 职场文书
技术总监管理岗位职责
2014/03/09 职场文书
安全生产月活动总结
2014/05/04 职场文书
幸福中国演讲稿
2014/09/12 职场文书
员工试用期自我评价
2014/09/18 职场文书
写给妈妈的感谢信
2015/01/22 职场文书
小学工作总结2015
2015/05/04 职场文书
Python Numpy之linspace用法说明
2021/04/17 Python
Redis高级数据类型Hyperloglog、Bitmap的使用
2021/05/24 Redis
MySQL索引 高效获取数据的数据结构
2022/05/02 MySQL
TypeScript实用技巧 Nominal Typing名义类型详解
2022/09/23 Javascript