使用JS和canvas實(shí)現(xiàn)gif動圖的停止和播放代碼
HTML5 canvas可以讀取圖片信息,繪制當(dāng)前圖片。于是可以實(shí)現(xiàn)圖片馬賽克,模糊,色值過濾等很多圖片特效。我們這里不用那么復(fù)雜,只要讀取我們的圖片,重繪下就可以。

HTML代碼:
<img id="testImg" src="xxx.gif" width="224" height="126"> <p><input type="button" id="testBtn" value="停止"></p>
JS代碼:
if ('getContext' in document.createElement('canvas')) {
HTMLImageElement.prototype.play = function() {
if (this.storeCanvas) {
// 移除存儲的canvas
this.storeCanvas.parentElement.removeChild(this.storeCanvas);
this.storeCanvas = null;
// 透明度還原
image.style.opacity = '';
}
if (this.storeUrl) {
this.src = this.storeUrl;
}
};
HTMLImageElement.prototype.stop = function() {
var canvas = document.createElement('canvas');
// 尺寸
var width = this.width, height = this.height;
if (width && height) {
// 存儲之前的地址
if (!this.storeUrl) {
this.storeUrl = this.src;
}
// canvas大小
canvas.width = width;
canvas.height = height;
// 繪制圖片幀(第一幀)
canvas.getContext('2d').drawImage(this, 0, 0, width, height);
// 重置當(dāng)前圖片
try {
this.src = canvas.toDataURL("image/gif");
} catch(e) {
// 跨域
this.removeAttribute('src');
// 載入canvas元素
canvas.style.position = 'absolute';
// 前面插入圖片
this.parentElement.insertBefore(canvas, this);
// 隱藏原圖
this.style.opacity = '0';
// 存儲canvas
this.storeCanvas = canvas;
}
}
};
}
var image = document.getElementById("testImg"),
button = document.getElementById("testBtn");
if (image && button) {
button.onclick = function() {
if (this.value == '停止') {
image.stop();
this.value = '播放';
} else {
image.play();
this.value = '停止';
}
};
}
上面代碼并未詳盡測試,以及可能的體驗(yàn)問題(IE閃動)沒有具體處理(影響原理示意),若要實(shí)際使用,需要自己再微調(diào)完美下。
不足:
1. IE9+支持。IE7/IE8不支持canvas沒搞頭。
2. 只能停止gif,不能真正意義的暫停。因?yàn)閏anvas獲得的gif圖片信息為第一幀的信息,后面的貌似獲取不到。要想實(shí)現(xiàn)暫停,而不是停止,還需要進(jìn)一步研究,如果你有方法,非常歡迎分享。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
knockoutjs模板實(shí)現(xiàn)樹形結(jié)構(gòu)列表
這篇文章主要介紹了knockoutjs模板實(shí)現(xiàn)樹形結(jié)構(gòu)列表的實(shí)現(xiàn)代碼,非常不錯,具有參考借鑒價值,需要的朋友參考下吧2017-07-07
JavaScript中的數(shù)學(xué)運(yùn)算介紹
這篇文章主要介紹了JavaScript中的數(shù)學(xué)運(yùn)算介紹,本文先是講解了數(shù)學(xué)運(yùn)算的一些知識,然后給出了操作實(shí)例,需要的朋友可以參考下2014-12-12
Bootstrap Table從服務(wù)器加載數(shù)據(jù)進(jìn)行顯示的實(shí)現(xiàn)方法
Bootstrap-Table是一個Boostrap的表格插件,能夠?qū)SON數(shù)據(jù)直接顯示在表格中。接下來通過本文給大家分享Bootstrap Table從服務(wù)器加載數(shù)據(jù)進(jìn)行顯示的實(shí)現(xiàn)方法,感興趣的朋友一起看看吧2016-09-09
JavaScript實(shí)現(xiàn)復(fù)制文章自動添加版權(quán)
自己辛辛苦苦寫的文章,輕易就被別人復(fù)制-粘貼去了,是不是很傷心呢?小編今天給大家整理了兩個方法,讓別人復(fù)制自己的文章時,自動在文章的結(jié)尾添加自己的版權(quán)信息。2016-08-08
uniapp項(xiàng)目使用防抖及節(jié)流的方案實(shí)戰(zhàn)
防抖就是指觸發(fā)事件后把觸發(fā)非常頻繁的事件合并成一次去執(zhí)行,節(jié)流是指頻繁觸發(fā)事件時只會在指定的時間段內(nèi)執(zhí)行事件回調(diào),即觸發(fā)事件間隔大于等于指定的時間才會執(zhí)行回調(diào)函數(shù),這篇文章主要給大家介紹了關(guān)于uniapp項(xiàng)目使用防抖及節(jié)流的相關(guān)資料,需要的朋友可以參考下2023-01-01
JavaScript 函數(shù)調(diào)用規(guī)則
2009-09-09
.net MVC+Bootstrap下使用localResizeIMG上傳圖片
這篇文章主要為大家詳細(xì)介紹了.net MVC和Bootstrap下使用 localResizeIMG上傳圖片,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-04-04

