JavaScript 图像动画的小demo

所属分类: 网络编程 / JavaScript 阅读数: 1991
收藏 0 赞 0 分享
复制代码 代码如下:

<!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 this关键字指向常用情况解析

这篇文章主要介绍了JavaScript this关键字指向常用情况解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
收藏 0 赞 0 分享

Vue-cli打包后如何本地查看的操作

这篇文章主要介绍了Vue-cli打包后如何本地查看的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
收藏 0 赞 0 分享

vue cli 3.0通用打包配置代码,不分一二级目录

这篇文章主要介绍了vue cli 3.0通用打包配置代码,不分一二级目录,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
收藏 0 赞 0 分享

JavaScript事件循环及宏任务微任务原理解析

这篇文章主要介绍了JavaScript事件循环及宏任务微任务原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
收藏 0 赞 0 分享

关于vue-cli3打包代码后白屏的解决方案

这篇文章主要介绍了关于vue-cli3打包代码后白屏的解决方案,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
收藏 0 赞 0 分享

vue打包静态资源后显示空白及static文件路径报错的解决

这篇文章主要介绍了vue打包静态资源后显示空白及static文件路径报错的解决,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
收藏 0 赞 0 分享

vue-cli3访问public文件夹静态资源报错的解决方式

这篇文章主要介绍了vue-cli3访问public文件夹静态资源报错的解决方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
收藏 0 赞 0 分享

JS继承实现方法及优缺点详解

这篇文章主要介绍了JS继承实现方法及优缺点详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
收藏 0 赞 0 分享

vue或react项目生产环境去掉console.log的操作

这篇文章主要介绍了vue或react项目生产环境去掉console.log的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
收藏 0 赞 0 分享

解决vue组件没显示,没起作用,没报错,但该显示的组件没显示问题

这篇文章主要介绍了解决vue组件没显示,没起作用,没报错,但该显示的组件没显示问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
收藏 0 赞 0 分享
查看更多