JavaScript 图像动画的小demo


Posted in Javascript onMay 23, 2012
<!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> 
<title>图形动画</title> 
<style type="text/css"> 
.de{ font-size:30px; text-decoration:none; font-family:微软雅黑; color:#ccc;} 
.de:hover{ color:#933;} 
</style> 
<script type="text/javascript"> 
/** 
* ImageLoop.js: An ImageLoop class for performing image animations 
* 
* Constructor Arguments: 
* imageId: the id of the <img> tag which will be animated 
* fps: the number of frames to display per second 
* frameURLs: an array of URLs, one for each frame of the animation 
* 
* Public Methods: 
* start(): start the animation (but wait for all frames to load first) 
* stop(): stop the animation 
* 
* Public Properties: 
* loaded: true if all frames of the animation have loaded, 
* false otherwise 
*/ 
function ImageLoop(imageId, fps, frameURLs) { 
// Remember the image id. Don't look it up yet since this constructor 
// may be called before the document is loaded. 
this.imageId = imageId; 
// Compute the time to wait between frames of the animation 
this.frameInterval = 1000 / fps; 
// An array for holding Image objects for each frame 
this.frames = new Array(frameURLs.length); this.image = null; // The <img> element, looked up by id 
this.loaded = false; // Whether all frames have loaded 
this.loadedFrames = 0; // How many frames have loaded 
this.startOnLoad = false; // Start animating when done loading? 
this.frameNumber = -1; // What frame is currently displayed 
this.timer = null; // The return value of setInterval() 
// Initialize the frames[] array and preload the images 
for (var i = 0; i < frameURLs.length; i++) { 
this.frames[i] = new Image(); // Create Image object 
// Register an event handler so we know when the frame is loaded 
this.frames[i].onload = countLoadedFrames; // defined later 
this.frames[i].src = frameURLs[i]; // Preload the frame's image 
} 
// This nested function is an event handler that counts how many 
// frames have finished loading. When all are loaded, it sets a flag, 
// and starts the animation if it has been requested to do so. 
var loop = this; 
function countLoadedFrames() { 
loop.loadedFrames++; 
if (loop.loadedFrames == loop.frames.length) { 
loop.loaded = true; 
if (loop.startOnLoad) loop.start(); 
} 
} 
// Here we define a function that displays the next frame of the 
// animation. This function can't be an ordinary instance method because 
// setInterval() can only invoke functions, not methods. So we make 
// it a closure that includes a reference to the ImageLoop object 
this._displayNextFrame = function () { 
// First, increment the frame number. The modulo operator (%) means 
// that we loop from the last to the first frame 
loop.frameNumber = (loop.frameNumber + 1) % loop.frames.length; 
// Update the src property of the image to the URL of the new frame 
loop.image.src = loop.frames[loop.frameNumber].src; 
}; 
} 
/** 
* This method starts an ImageLoop animation. If the frame images have not 
* finished loading, it instead sets a flag so that the animation will 
* automatically be started when loading completes 
*/ 
ImageLoop.prototype.start = function () { 
if (this.timer != null) return; // Already started 
// If loading is not complete, set a flag to start when it is 
if (!this.loaded) this.startOnLoad = true; 
else { 
// If we haven't looked up the image by id yet, do so now 
if (!this.image) this.image = document.getElementById(this.imageId); 
// Display the first frame immediately 
this._displayNextFrame(); 
// And set a timer to display subsequent frames 
this.timer = setInterval(this._displayNextFrame, this.frameInterval); 
} 
}; 
/** Stop an ImageLoop animation */ 
ImageLoop.prototype.stop = function () { 
if (this.timer) clearInterval(this.timer); 
this.timer = null; 
}; 
</script> 
<script type="text/javascript"> 
function de() { 
var animation = new ImageLoop("loop", 1, ["img/img_01.jpg", "img/img_02.jpg",]); 
var sta = document.getElementById("sta"); 
var stp = document.getElementById("stp"); 
sta.onclick = function () { 
animation.start(); 
} 
stp.onclick = function () { 
animation.stop(); 
} 
} 
window.onload = function () { 
de(); 
} 
</script> 
</head> 
<body> 
<img src="img/img_01.jpg" id="loop" alt="" title="" /> 
<a href="#" class="de" id="sta">Start</a> 
<a href="#" class="de" id="stp">Stop</a> 
</body> 
</html>
Javascript 相关文章推荐
基于jquery完美拖拽,可返回拖动轨迹
Mar 29 Javascript
JavaScript中__proto__与prototype的关系深入理解
Dec 04 Javascript
jQuery不使用插件及swf实现无刷新文件上传
Dec 08 Javascript
jQuery插件slick实现响应式移动端幻灯片图片切换特效
Apr 12 Javascript
详解JavaScript中基于原型prototype的继承特性
May 05 Javascript
jQuery的ajax和遍历数组json实例代码
Aug 01 Javascript
JavaScript Canvas绘制圆形时钟效果
Aug 20 Javascript
vue组件 $children,$refs,$parent的使用详解
Jul 31 Javascript
微信小程序滚动Tab实现左右可滑动切换
Aug 17 Javascript
jQuery实现为动态添加的元素绑定事件实例分析
Sep 07 jQuery
vue封装自定义指令之动态显示title操作(溢出显示,不溢出不显示)
Nov 12 Javascript
js面向对象编程OOP及函数式编程FP区别
Jul 07 Javascript
JavaScript学习笔记记录我的旅程
May 23 #Javascript
JS中处理与当前时间间隔的函数代码
May 23 #Javascript
自己做的模拟模态对话框实现代码
May 23 #Javascript
解决jquery的datepicker的本地化以及Today问题
May 23 #Javascript
{}与function(){}选用空对象{}来存放keyValue
May 23 #Javascript
JavaScript基本编码模式小结
May 23 #Javascript
Javascript处理DOM元素事件实现代码
May 23 #Javascript
You might like
PHP Memcached应用实现代码
2010/02/08 PHP
php顺序查找和二分查找示例
2014/03/27 PHP
PHP实现图片旋转效果实例代码
2014/10/01 PHP
php输出含有“#”字符串的方法
2017/01/18 PHP
Jquery css函数用法(判断标签是否拥有某属性)
2011/05/28 Javascript
新发现一个骗链接的方法(js读取cookies)
2012/01/11 Javascript
jquery 合并内容相同的单元格(示例代码)
2013/12/13 Javascript
3种Jquery限制文本框只能输入数字字母的方法
2014/12/03 Javascript
jQuery中data()方法用法实例
2014/12/27 Javascript
JQuery中$.each 和$(selector).each()的区别详解
2015/03/13 Javascript
前端学习笔记style,currentStyle,getComputedStyle的用法与区别
2016/05/28 Javascript
jQuery使用DataTable实现删除数据后重新加载功能
2017/02/27 Javascript
微信小程序网络请求wx.request详解及实例
2017/05/18 Javascript
手动用webpack搭建第一个ReactApp的示例
2018/04/11 Javascript
详解javascript replace高级用法
2019/02/17 Javascript
详解element-ui日期时间选择器的日期格式化问题
2019/04/08 Javascript
微信小程序遍历Echarts图表实现多个饼图
2019/04/25 Javascript
微信小程序实现图片翻转效果的实例代码
2019/09/20 Javascript
vuex分模块后,实现获取state的值
2020/07/26 Javascript
Vue 组件复用多次自定义参数操作
2020/07/27 Javascript
javascript如何使用函数random来实现课堂随机点名方法详解
2020/07/28 Javascript
Vue基于localStorage存储信息代码实例
2020/11/16 Javascript
使用python打印十行杨辉三角过程详解
2019/07/10 Python
pygame实现贪吃蛇游戏(下)
2019/10/29 Python
python软件都是免费的吗
2020/06/18 Python
树莓派升级python的具体步骤
2020/07/05 Python
python报错: 'list' object has no attribute 'shape'的解决
2020/07/15 Python
绢花、人造花和人造花卉:BLOOM
2019/08/07 全球购物
澳大利亚珠宝商:Shiels
2019/10/06 全球购物
澳大利亚最受欢迎的女士度假服装:Kabana Shop
2020/10/10 全球购物
2019年分享net面试的经历和题目
2016/08/07 面试题
TCP/IP的分层模型
2013/10/27 面试题
2014年上半年工作自我评价
2014/01/18 职场文书
农村面貌改造提升实施方案
2014/03/18 职场文书
十佳中学生事迹材料
2014/06/02 职场文书
2014年酒店年度工作总结
2014/12/10 职场文书