但事實(shí)上,也許你想錯(cuò)了。Web動(dòng)畫并不難。你只需要掌握一些非?;镜闹R(shí)就能開發(fā)出非常漂亮的Web動(dòng)畫。以前開發(fā)動(dòng)畫應(yīng)用你可能需要學(xué)習(xí)很復(fù)雜的動(dòng)畫制作框架。自從HTML5畫布(Canvas)功能面世后,Web動(dòng)畫就一下子從云端跌落到了地面——任何一個(gè)Web程序員都可以輕易的用畫布(Canvas)技術(shù)+JavaScript來開發(fā)出各種動(dòng)畫效果。網(wǎng)上用來方便程序員開發(fā)畫布(Canvas)游戲動(dòng)畫的JS工具包非常豐富,《盲打高手打飛字》這款練習(xí)盲打的游戲就是一個(gè)叫做impactjs的游戲引擎。而文下面的教程中將使用的是另外一個(gè)叫做kinetic的Web動(dòng)畫工具包。它們都是開源的。
把鼠標(biāo)放到上面的小丑臉上,然后移開,看看會(huì)發(fā)生效果。
這就是一個(gè)最簡單的動(dòng)畫。簡單嗎?你能做出來嗎?
下面我們就用三分鐘時(shí)間,用很少的幾行代碼把這個(gè)動(dòng)畫做出來。你只需要了解很少的幾個(gè)API,然后使用需要的動(dòng)畫參數(shù),就能制作出這個(gè)有趣又能響應(yīng)你的動(dòng)作的Web動(dòng)畫。
第一步,畫五官
這個(gè)小丑沒有耳朵和眉毛,所以只剩下三官,但它的兩個(gè)眼睛我們要分別繪制,所以一共是四個(gè)部分。下面先看看代碼。
繪制左眼的代碼
- var leftEye = new Kinetic.Line({
- x: 150,
- points: [0, 200, 50, 190, 100, 200, 50, 210],
- tension: 0.5,
- closed: true,
- stroke: 'white',
- strokeWidth: 10
- });
- var rightEye = new Kinetic.Line({
- x: sw - 250,
- points: [0, 200, 50, 190, 100, 200, 50, 210],
- tension: 0.5,
- closed: true,
- stroke: 'white',
- strokeWidth: 10
- });
- var nose = new Kinetic.Line({
- points: [240, 280, sw/2, 300, sw-240,280],
- tension: 0.5,
- closed: true,
- stroke: 'white',
- strokeWidth: 10
- });
- var mouth = new Kinetic.Line({
- points: [150, 340, sw/2, 380, sw - 150, 340, sw/2, sh],
- tension: 0.5,
- closed: true,
- stroke: 'red',
- strokeWidth: 10
- });

簡單講解一下上面的代碼。Kinetic就是我們使用的js工具包。在頁面的頭部,我們需要這樣引用它:
- <script type="text/javascript"
- src="/js/kinetic-v5.0.1.min.js?0d64e4"></script>
第二步,讓圖動(dòng)起來
這個(gè)動(dòng)畫之所以能吸引人,是因?yàn)樗茼憫?yīng)你的鼠標(biāo)動(dòng)作,和用戶有互動(dòng),這是一個(gè)成功的動(dòng)畫最關(guān)鍵的地方。如果你仔細(xì)觀察,這個(gè)小丑五官的變化只是形狀的變化,眼睛變大,嘴巴變大,鼻子變大,但特別的是這個(gè)變化不是瞬間變化,而是有過渡性的,這里面有一些算法,這就是最讓人發(fā)愁的地方。幸運(yùn)的是,這算法技術(shù)都非常的成熟,不需要我們來思考,在這些動(dòng)畫引擎庫里都把這些技術(shù)封裝成了非常簡單方便的接口。下面我們來看看如何讓動(dòng)起來。
左眼的動(dòng)畫
- var leftEyeTween = new Kinetic.Tween({
- node: leftEye,
- duration: 1,
- easing: Kinetic.Easings.ElasticEaseOut,
- y: -100,
- points: [0, 200, 50, 150, 100, 200, 50, 200]
- });
- var rightEyeTween = new Kinetic.Tween({
- node: rightEye,
- duration: 1,
- easing: Kinetic.Easings.ElasticEaseOut,
- y: -100,
- points: [0, 200, 50, 150, 100, 200, 50, 200]
- });
- var noseTween = new Kinetic.Tween({
- node: nose,
- duration: 1,
- easing: Kinetic.Easings.ElasticEaseOut,
- y: -100,
- points: [220, 280, sw/2, 200, sw-220,280]
- });
- var mouthTween = new Kinetic.Tween({
- node: mouth,
- duration: 1,
- easing: Kinetic.Easings.ElasticEaseOut,
- points: [100, 250, sw/2, 250, sw - 100, 250, sw/2, sh-20]
- });
完整的動(dòng)畫代碼
- <!DOCTYPE HTML>
- <html>
- <head>
- <style>
- body {
- margin: 0px;
- padding: 0px;
- }
- #container {
- background-color: black;
- }
- </style>
- </head>
- <body>
- <div id="container"></div>
- <script src="/js/lib/kinetic-v5.0.1.min.js?0d64e4"></script>
- <script defer="defer">
- var sw = 578;
- var sh = 400;
- var stage = new Kinetic.Stage({
- container: 'container',
- width: 578,
- height: 400
- });
- var layer = new Kinetic.Layer({
- y: -30
- });
- var leftEye = new Kinetic.Line({
- x: 150,
- points: [0, 200, 50, 190, 100, 200, 50, 210],
- tension: 0.5,
- closed: true,
- stroke: 'white',
- strokeWidth: 10
- });
- var rightEye = new Kinetic.Line({
- x: sw - 250,
- points: [0, 200, 50, 190, 100, 200, 50, 210],
- tension: 0.5,
- closed: true,
- stroke: 'white',
- strokeWidth: 10
- });
- var nose = new Kinetic.Line({
- points: [240, 280, sw/2, 300, sw-240,280],
- tension: 0.5,
- closed: true,
- stroke: 'white',
- strokeWidth: 10
- });
- var mouth = new Kinetic.Line({
- points: [150, 340, sw/2, 380, sw - 150, 340, sw/2, sh],
- tension: 0.5,
- closed: true,
- stroke: 'red',
- strokeWidth: 10
- });
- layer.add(leftEye)
- .add(rightEye)
- .add(nose)
- .add(mouth);
- stage.add(layer);
- // tweens
- var leftEyeTween = new Kinetic.Tween({
- node: leftEye,
- duration: 1,
- easing: Kinetic.Easings.ElasticEaseOut,
- y: -100,
- points: [0, 200, 50, 150, 100, 200, 50, 200]
- });
- var rightEyeTween = new Kinetic.Tween({
- node: rightEye,
- duration: 1,
- easing: Kinetic.Easings.ElasticEaseOut,
- y: -100,
- points: [0, 200, 50, 150, 100, 200, 50, 200]
- });
- var noseTween = new Kinetic.Tween({
- node: nose,
- duration: 1,
- easing: Kinetic.Easings.ElasticEaseOut,
- y: -100,
- points: [220, 280, sw/2, 200, sw-220,280]
- });
- var mouthTween = new Kinetic.Tween({
- node: mouth,
- duration: 1,
- easing: Kinetic.Easings.ElasticEaseOut,
- points: [100, 250, sw/2, 250, sw - 100, 250, sw/2, sh-20]
- });
- stage.getContainer().addEventListener('mouseover', function() {
- leftEyeTween.play();
- rightEyeTween.play();
- noseTween.play();
- mouthTween.play();
- });
- stage.getContainer().addEventListener('mouseout', function() {
- leftEyeTween.reverse();
- rightEyeTween.reverse();
- noseTween.reverse();
- mouthTween.reverse();
- });
- </script>
- </body>
- </html>
我相信你已經(jīng)在3三分鐘內(nèi)看完并看懂了這個(gè)動(dòng)畫的制作過程和原理。當(dāng)然,這個(gè)動(dòng)畫很簡單,我們這里只是粗淺的講解一些HTML5畫布(Canvas)動(dòng)畫技術(shù)的皮毛。如果想真正的成為Web動(dòng)畫告訴,那你還需要做很多的努力。但如果你只是業(yè)余愛好,我相信這已經(jīng)足夠讓你驕傲了。
【網(wǎng)站聲明】本站除付費(fèi)源碼經(jīng)過測試外,其他素材未做測試,不保證完整性,網(wǎng)站上部分源碼僅限學(xué)習(xí)交流,請勿用于商業(yè)用途。如損害你的權(quán)益請聯(lián)系客服QQ:2655101040 給予處理,謝謝支持。