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 相关文章推荐
javascript使用window.open提示“已经计划系统关机”的原因
Aug 15 Javascript
JavaScript数组对象实现增加一个返回随机元素的方法
Jul 27 Javascript
jquery的ajax提交form表单的两种方法小结(推荐)
May 25 Javascript
浅谈js基础数据类型和引用类型,深浅拷贝问题,以及内存分配问题
Sep 02 Javascript
SVG动画vivus.js库使用小结(实例代码)
Sep 14 Javascript
ionic3实战教程之随机布局瀑布流的实现方法
Dec 28 Javascript
Javascript将图片的绝对路径转换为base64编码的方法
Jan 11 Javascript
vue2中引用及使用 better-scroll的方法详解
Nov 15 Javascript
layui点击按钮页面会自动刷新的解决方案
Oct 25 Javascript
vue中的 $slot 获取插槽的节点实例
Nov 12 Javascript
JS运算符优先级与表达式示例详解
Sep 04 Javascript
Vue实现tab导航栏并支持左右滑动功能
Jun 28 Vue.js
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执行速率优化技巧小结
2008/03/15 PHP
php读取文件内容的三种可行方法示例介绍
2014/02/08 PHP
浅谈PHP解析URL函数parse_url和parse_str
2014/11/11 PHP
php读取出一个文件夹及其子文件夹下所有文件的方法示例
2017/06/15 PHP
thinkPHP框架实现的短信接口验证码功能示例
2018/06/20 PHP
JavaScript Event学习第三章 早期的事件处理程序
2010/02/07 Javascript
五段实用的js高级技巧
2011/12/20 Javascript
VS2008中使用JavaScript调用WebServices
2014/12/18 Javascript
jquery滚动特效集锦
2015/06/03 Javascript
深入理解JavaScript编程中的原型概念
2015/06/25 Javascript
JavaScript学习笔记之取数组中最大值和最小值
2016/03/23 Javascript
jquery select2的使用心得(推荐)
2016/12/04 Javascript
javascript原生封装一个淡入淡出效果的函数测试实例代码
2018/03/19 Javascript
如何手写简易的 Vue Router
2020/10/10 Javascript
[02:50]2014DOTA2 TI预选赛预选赛 大神专访第一弹!
2014/05/21 DOTA
python实现自主查询实时天气
2018/06/22 Python
Pycharm取消py脚本中SQL识别的方法
2018/11/29 Python
Python3.6实现带有简单界面的有道翻译小程序
2019/04/16 Python
Python中PyQt5/PySide2的按钮控件使用实例
2019/08/17 Python
使用OpenCV-python3实现滑动条更新图像的Canny边缘检测功能
2019/12/12 Python
python隐藏类中属性的3种实现方法
2019/12/19 Python
Python接口开发实现步骤详解
2020/04/26 Python
关于Python解包知识点总结
2020/05/05 Python
Python filter过滤器原理及实例应用
2020/08/18 Python
详解Sticky Footer 绝对底部的两种套路
2017/11/03 HTML / CSS
什么叫做SQL注入,如何防止
2016/10/04 面试题
求职简历中个人的自我评价
2013/12/25 职场文书
施工班组长岗位职责
2014/01/05 职场文书
顶岗实习接收函
2014/01/09 职场文书
教师师德反思材料
2014/02/15 职场文书
2014县委书记四风对照检查材料思想汇报
2014/09/21 职场文书
聚会通知怎么写
2015/04/23 职场文书
2015年环保局工作总结
2015/05/22 职场文书
公司欠款证明
2015/06/24 职场文书
《金钱的魔力》教学反思
2016/02/20 职场文书
用position:sticky完美解决小程序吸顶问题的实现方法
2021/04/24 HTML / CSS