周在給學(xué)生講授JavaScript課程中setInterval方法時(shí),想到了我們在網(wǎng)上看到的各類GIF動(dòng)圖比較有意思,就將其引入到教學(xué)中,教學(xué)內(nèi)容設(shè)計(jì)如果通過HTML5與JavaScript實(shí)現(xiàn)網(wǎng)頁類似GIF效果的動(dòng)態(tài)圖。于是在網(wǎng)上搜集了部分gif格式動(dòng)圖,將每一個(gè)Gif動(dòng)圖分解為一組jpg格式圖片,再采用setInterval與html5 Canvas進(jìn)行動(dòng)畫的實(shí)現(xiàn)。通過學(xué)習(xí)可以讓學(xué)生進(jìn)一步了解canvas動(dòng)畫實(shí)現(xiàn)的過程與原理。并將其發(fā)布到頭條,也希望對有興趣的初學(xué)者了解HTML5 Canvas等有所幫助。圖片分組圖片素材如下:
素材一
實(shí)現(xiàn)動(dòng)畫的素材我們已經(jīng)給出,主要通過gif動(dòng)圖導(dǎo)出一組圖片,下面對html5動(dòng)畫實(shí)現(xiàn)過程進(jìn)行簡單說明。
實(shí)現(xiàn)其動(dòng)畫的基本思路是通過HTML5提供的canvas元素進(jìn)行圖片的繪制與展示,借助setInterval方法實(shí)現(xiàn)間隔指定時(shí)間調(diào)用新的圖片實(shí)現(xiàn)重新繪圖。其中繪圖主要使用drawImage方法進(jìn)行繪圖,最終通過圖片依次重繪實(shí)現(xiàn)動(dòng)畫效果。具體實(shí)現(xiàn)過程如下:
在頁面body部分添加Canva標(biāo)簽,設(shè)置其id屬性為canv,寬度為600,高度為400,編寫代碼描述如下圖:
添加畫布元素
canvas瀏覽效果
使用Canvas借助JavaScript提供的drawImage方法進(jìn)行繪圖,需要提供要繪制的圖片資源即繪圖的坐標(biāo)位置。該方法原型如下:
drawImage方法原型
因此我們需要加載圖片資源,本例由于需要調(diào)用多個(gè)img實(shí)現(xiàn)定時(shí)不同圖片的繪制,因此我們可以使用數(shù)組存儲(chǔ)所加載的圖片資源。本例圖片數(shù)量為14,因此我們數(shù)組長度為14。使用素組存儲(chǔ)圖片實(shí)現(xiàn)代碼如下:
加載圖片資源代碼
本例設(shè)計(jì)在頁面加載時(shí)自動(dòng)播放動(dòng)畫,因此需要在JavaScript腳本中添加頁面onload事件,在事件中編寫繪圖相關(guān)代碼,主要代碼包括獲取畫布canva與實(shí)例化繪圖對象context。部分代碼描述如下:
onload事件及繪圖初始化
使用setInterval方法實(shí)現(xiàn)動(dòng)畫主要需要定義回調(diào)函數(shù)與回調(diào)函數(shù)觸發(fā)執(zhí)行的周期,本例中我們使用匿名函數(shù)作為回調(diào)函數(shù),觸發(fā)周期設(shè)置為100毫秒。setInterval函數(shù)定義如下:
setInterval函數(shù)
在定義完函數(shù)之后可在其匿名函數(shù)函數(shù)體部分寫入繪圖方法dramImage(),實(shí)現(xiàn)周期調(diào)用不同圖片資源進(jìn)行繪圖,最終展示出動(dòng)畫效果。為了保證循環(huán)調(diào)用14張圖片,我們需要設(shè)置一計(jì)數(shù)全局變量i,由于我們圖片采用數(shù)組存儲(chǔ),下標(biāo)為數(shù)組,且從0-13進(jìn)行編號,因此當(dāng)計(jì)數(shù)值小于13時(shí)自動(dòng)+1,指向下一數(shù)組下標(biāo),當(dāng)為13時(shí),設(shè)置計(jì)數(shù)值為0,回到數(shù)組第一元素,最終實(shí)現(xiàn)數(shù)組訪問下標(biāo)的循環(huán)。setInterval實(shí)現(xiàn)完整代碼如下:
setInterval完整代碼
HTML動(dòng)畫效果展示
本頭條號長期關(guān)注編程資訊分享;編程課程、素材、代碼分享及編程培訓(xùn)。如果您對以上方面有興趣或代碼錯(cuò)誤、建議與意見,可以聯(lián)系作者,共同探討。期待大家關(guān)注!如需案例完整代碼請關(guān)注并私信,往期前端設(shè)計(jì)文章鏈接如下:
web開發(fā)中,GIF動(dòng)畫效果是隨處可見,比如常見的loading加載、人物奔跑的gif圖片等等,那么這些都是怎么實(shí)現(xiàn)的呢?
其實(shí)實(shí)現(xiàn)的原理很簡單,簡而言之,這些所謂的動(dòng)畫都是一幀一幀的圖片經(jīng)過一段時(shí)間的間隔做出位移而來的;譬如,我們在PS里面制作GIF動(dòng)畫,首先要把每一幀所需要的圖片制作出來,然后再通過導(dǎo)出的方式把GIF圖片保存下來;相信會(huì)PS的同學(xué),都可以熟練的制作一個(gè)基本的GIF動(dòng)畫圖片;在web開發(fā)中,要實(shí)現(xiàn)這樣的gif圖片,也有很多方法;在這給讀者提供一個(gè)思路,就是利用html5 canvas實(shí)現(xiàn)動(dòng)畫效果。
利用canvas的drawImage把含有幀的圖片加載到canvas中去,再結(jié)合js實(shí)現(xiàn)動(dòng)畫
<!DOCTYPE html> <html lang="en"><head> <meta charset="UTF-8"> <title>canvas幀--實(shí)現(xiàn)動(dòng)畫</title> <style> *{padding:0;margin:0;} canvas{display:block;background:white} </style> </head> <body> <canvas></canvas> <script> var imgPic = new Image(); imgPic.src = 'http://www.cj365.cc/demo/bird/bird.png'; var canvas = document.querySelector('canvas'); canvas.width = window.innerWidth; canvas.height = window.innerHeight; var ctx = canvas.getContext('2d'); imgPic.onload = function () { drawImg() } var i = 0; var lastTime = new Date().getTime(); var delatime; var timer = 0; function drawImg() { window.requestAnimationFrame(drawImg); var now = new Date().getTime(); delatime = now - lastTime; lastTime = now; timer += delatime; if (timer > 200) { i++; if (i > 7) i = 0; timer = 0 } console.log(delatime) ctx.drawImage(imgPic, i * 140, 0, 140, 85, (canvas.width - 140) / 2, (canvas.height - 85) / 2, 140, 85); } </script> </body> </html>
以上方法實(shí)現(xiàn)的前提是,需要有一張已繪制幀的圖片,有了圖片才可進(jìn)行幀的動(dòng)畫;利用該方法可以控制動(dòng)畫的播放、暫停以及幀率
接來,直接上今天的課程
第七課:頁面
第八課:播放控制
第九課:變形工具
今天多加一個(gè)課外小教程,《PV3天破2億的H5作品詳解》
背景介紹
知識(shí)點(diǎn)
有興趣的朋友也可以關(guān)注我們的微信公眾號:mugedachina 或者搜索“Mugeda”即可
另外,在我們的作品展示品牌有很多成熟的案例,大家也可以關(guān)注一下,微信公眾號:mucard,或搜索“卡司令”
*請認(rèn)真填寫需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。