亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 語言 > JavaScript > 正文

淺析JavaScript動畫

2024-05-06 16:21:58
字體:
來源:轉載
供稿:網友

JavaScript 動畫我們可以使用 JavaScript 來創建動態的圖像。實例 按鈕動畫 利用兩個不同的事件來驅動兩個相應的函數,來切換兩張對應的圖片以創造出動畫效果。

今天,小學生以自己淺薄的見地,在前輩大能的基礎上寫這篇文章,希望給大家打開一扇窺探JavaScript(以下簡稱JS)動畫的窗戶。

JS如何制造出動畫效果?

結合瀏覽器提供的 setInterval 或 setTimeout API,高頻改變DOM元素的一些屬性,即可創造一個肉眼可見的動畫效果。一個看起來非常流暢的JS動畫除了需要良好的變換算法外,與其執行宿主也是非不開的。程序寫得再好,如果瀏覽器過于老舊,電腦CPU性能低下,也會出現卡頓,甚至卡死。

執行一個動畫函數對于瀏覽器來說是個苦差,設置動畫一幀為多長時間才能既流暢又不損耗性能呢?瀏覽器不會傻到進行一個DOM操作,就去渲染一次頁面。它會把一個周期內所有的DOM操作整合起來,統一進行一次渲染。這個周期大約在16.7ms左右,不同瀏覽器間會有幾毫秒的差異。SetTimeout的第二個參數設置為1000/60是比較合乎情理的做法。不過了解過SetTimeout運行機制的都會清楚,這個時間并不可靠,其根據實際情況會有些許甚至相當大的延遲。那么有沒有這樣一個API?我不想知道你瀏覽器到底多久渲染一次,反正你渲染的時候給我的動畫執行一幀就行了。答案是有,requestAnimationFrame,可以讓函數隨著瀏覽器渲染執行,并且執行時機是可靠的。注意,這個方法在現在瀏覽器及IE10+才被支持。

現在可以封裝起一個簡單的requestAnimationFrame,下面的例子中將會使用到它。

 

 
  1. window.requestAnimFrame = (function(){ 
  2. return window.requestAnimationFrame || 
  3. window.webkitRequestAnimationFrame || 
  4. window.mozRequestAnimationFrame || 
  5. function( callback ){ 
  6. window.setTimeout(callback, 1000 / 60); 
  7. }; 
  8. })(); 

更加詳細的封裝可以在張鑫旭的博客中看到:張鑫旭:requestAnimFrame。下面讓我們繼續。

動畫函數的編寫

有了requestAnimationFrame,下面該考慮一下如何讓寫動畫函數了。一般來說我們會給出一個毫秒級的during值,限制這個動畫必須要在這個時間內完成。下面以實現一個小球從離頁面左側100px處勻速運動到800px處為例,編寫一個動畫函數:戳我查看DEMO。

 

 
  1. var ele = document.getElementById("block"); 
  2. var start = Date.now();//獲取動畫開始的時間。 
  3. var during = 1000; //此動畫要在1秒內執行完。 
  4. var p=0;//動畫完成度 從0-1; 
  5. requestAnimationFrame(function f(){ 
  6. if(p>=1){ ele.style.left="800px";}//如果發現動畫已經執行完,將元素置到終點。 
  7. else
  8. p=(Date.now()-start)/during; 
  9. ele.style.left=100+700*p+"px"//從100px開始,勻速向右移動,共移動700px; 
  10. requestAnimationFrame(f); 
  11. }) 

上面函數中有一個關鍵變量:p,即percentage,我們可以稱它為動畫的完成度,它是根據當前時間計算得出的,并且從動畫開始后,會從0~1勻速漸變。當其為1時,表示整個動畫執行完畢。在這個函數中,讓p乘以要運動的長度700,便會得到一個0-700勻速變化的值,將其加上開始的100,便可模擬小球從100px處勻速移動到800px處。

設想一下,假如上面紅色標出的運動方程改為“ele.style.left=100+700*p*p+"px"”呢?p以二次方漸增,小球向右移動的速度會越來越快。是的,稍加修改便可實現一個勻加速運動的小球。

下面,我們就是要針對p來做文章。

Tween算法及緩動效果

下面我將列舉一些常用的緩動算法,根據這些算法去修改上面勻速運動函數的運動方程,即可實現很贊的動畫效果。

1.2次方緩動:  p*p

2.3次方緩動:  p*p*p

3.4次方緩動:  p*p*p*p

4.5次方緩動:  p*p*p*p*p

5.正弦曲線緩動: Math.sin(p*Math.PI/2)

6.指數曲線緩動: Math.pow(2,10*(p-1))

7.圓形曲線緩動: Math.sqrt(1-(p-1)*(p-1))

8.超范圍三次方: p*p*(2.70158*p-1.70158)

驗證一下吧,比如我現在想實現一個小球向右運動,有一個向左蓄力的動畫,我只要把第一個demo的運動方程改為“ele.style.left=100+700*p*p*(2.70158*p-1.70158)+"px"”就行了,看看效果吧:戳我查看DEMO。

其實,每種緩動算法都可以進化為三種緩動方式,分別為ease-in(先慢后快),ease-out(先快后慢),ease-in-out(先慢后快再慢)。

以2次方緩動為例,它本身就是一個勻加速的過程,所以ease-in就是p*p。其ease-out為-(p*(p-2))。關于緩動方式,像陽光一樣在他的博客中有更加詳細的解釋:JavaScript動畫、運動算法詳細解釋與分析。

接下來要放大招了,關于緩動的整合DEMO,戳我吧。

JS動畫可以做什么?

除了上面的緩動效果,利用常見的數學公式還可以實現一些周期性運動效果,例如小球勻速圓周運動,小球勻速簡諧振動等,如果感興趣請猛戳DEMO。

那么JS動畫可以做什么呢?這就需要發揮我們的個人想象力了,上面的DEMO大部分都在操控單一的屬性,比如left,讓DOM元素發生位移。事實上在運動方程中,元素的任何style都可以被漸變。試想一下,設置一個DOM元素的opacity從0~1進行2次方緩動,便是一個簡單的jQuery fadeOut函數;讓一個DOM元素高度從無到有,便是一個簡單的jQuery slideDown函數。更加不要忘記的是,在動畫過程中不僅僅可以操作一項屬性,這為動畫帶來了無限的可能性,事情變得越來越有趣了:DEMO:一個從小到大變化的球。

再試想一下,使用CSS3屬性,例如box-shadow,transform,作出的效果必將會更加絢麗。

總結

上面提到使用CSS3屬性,其實如果這個瀏覽器支持CSS3屬性的話,完全沒有必要使用JS來做這件事。CSS3自有Animation動畫屬性,可以簡單快捷地實現酷炫的動畫效果,并且可以啟用GPU加速。美中不足的是僅現代瀏覽器支持。JS實現動畫勝在可以兼容低版本瀏覽器,但是其效果一般(僅限于普通意義上的動畫,不含canvas之類的)。

動畫僅僅是JS操作DOM魅力之冰山一角,而數學與計算機總是能碰撞出耀眼的火花。繼續學習JS吧,這是一門神奇的語言,同時也應該了解一些數學知識,往往能夠為解決事情帶來捷徑。

以上所述就是本文的全部內容了,希望大家能夠喜歡。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久国产精品99国产精| 色多多国产成人永久免费网站| 九九九久久久久久| 亚洲精品一区二区三区不| 中文字幕亚洲国产| 日韩va亚洲va欧洲va国产| 国产精品极品美女在线观看免费| 久久夜色精品国产| 成人激情综合网| 亚洲缚视频在线观看| 在线播放国产精品| 久久久精品2019中文字幕神马| 九九精品视频在线观看| 国外视频精品毛片| 日韩免费在线观看视频| 欧美日韩国产va另类| 亚洲欧美另类国产| 欧美精品在线观看| 国产日韩欧美自拍| 亚洲精品欧美极品| 性欧美视频videos6一9| 亚洲一区二区精品| 国产精品18久久久久久首页狼| 成人美女av在线直播| 国产成人精品视| 亚洲黄色www| 亚洲国产一区二区三区在线观看| 亚洲自拍欧美另类| 国产欧美日韩精品丝袜高跟鞋| 亚洲欧美日韩综合| 在线播放国产一区中文字幕剧情欧美| 精品久久久久久亚洲精品| 91在线观看免费| 精品国产31久久久久久| 久久久久久国产| 亚洲毛片一区二区| 欧美激情一区二区三区成人| 日韩成人在线电影网| 国产精品久久久久999| 日本一本a高清免费不卡| 亚洲成人网在线| 欧美疯狂xxxx大交乱88av| 亚洲激情自拍图| 欧美成人在线影院| 日韩欧美国产激情| 亚洲日本中文字幕免费在线不卡| 久久男人的天堂| 亚洲va久久久噜噜噜久久天堂| 这里只有精品久久| 成人欧美一区二区三区黑人孕妇| 亚洲剧情一区二区| 国产精品欧美激情| 日韩欧美在线免费| 91在线色戒在线| 亚洲成成品网站| 久久精品在线播放| 欧美激情一区二区三区久久久| 日韩美女av在线免费观看| 欧美孕妇孕交黑巨大网站| 国产欧美精品久久久| 精品偷拍各种wc美女嘘嘘| 亚洲激情视频在线| 亚洲va久久久噜噜噜| 成人av资源在线播放| 欧美精品videosex牲欧美| 久久精品色欧美aⅴ一区二区| 国产精品自拍小视频| 奇米影视亚洲狠狠色| 夜夜嗨av色一区二区不卡| 国产精品av免费在线观看| 国产视频一区在线| 欧洲成人在线视频| 国产精品va在线| 超碰精品一区二区三区乱码| 国产精品精品视频一区二区三区| 日韩在线欧美在线| 亚洲一区二区三区毛片| 色久欧美在线视频观看| 久久精品国产96久久久香蕉| 超碰97人人做人人爱少妇| 欧美性猛交99久久久久99按摩| 久久不射热爱视频精品| 欧美性在线视频| 6080yy精品一区二区三区| 久久精品国产综合| 欧美中文在线视频| 精品久久香蕉国产线看观看亚洲| 午夜免费在线观看精品视频| 成人欧美一区二区三区黑人| 国产一区二区三区视频免费| 亚洲娇小xxxx欧美娇小| 日韩高清人体午夜| 国产精品影院在线观看| 精品国产91乱高清在线观看| …久久精品99久久香蕉国产| 日韩av免费网站| 亚洲国产精彩中文乱码av| 久久久影视精品| 欧美噜噜久久久xxx| 亚洲福利视频网| 亚洲老头老太hd| 国产亚洲精品久久久久久牛牛| 91精品国产高清久久久久久| 综合激情国产一区| 亚洲视频一区二区| 欧美另类极品videosbestfree| 91国内产香蕉| 亚洲老司机av| 亚洲一区亚洲二区亚洲三区| 欧美疯狂做受xxxx高潮| 欧美激情在线一区| 在线看国产精品| 欧美香蕉大胸在线视频观看| 亚洲国产美女精品久久久久∴| 成人免费福利视频| 97久久伊人激情网| 国产激情久久久久| 国产一区二区黑人欧美xxxx| 精品国产一区二区三区四区在线观看| 日韩a**中文字幕| 日本一区二区不卡| 久久精品中文字幕一区| 日韩色av导航| 欧美日韩午夜视频在线观看| 最近免费中文字幕视频2019| 九九精品视频在线观看| 久久在线视频在线| 亚洲综合在线做性| 日韩有码片在线观看| 97久久久免费福利网址| 欧美精品激情blacked18| 欧美一区二区三区免费视| 成人激情电影一区二区| 粉嫩av一区二区三区免费野| 国产亚洲一区精品| 国产精品海角社区在线观看| 中文欧美日本在线资源| 亚洲男女自偷自拍图片另类| 91国偷自产一区二区三区的观看方式| 欧美激情国产高清| 亚洲精品国产精品乱码不99按摩| 欧美日在线观看| 久久精品男人天堂| 亚洲性视频网站| 国产婷婷成人久久av免费高清| 亚洲一级免费视频| 欧美激情精品久久久| 久久久久久中文| 欧美日韩视频免费播放| 国产日韩中文字幕在线| 成人欧美在线观看| 国产精品电影久久久久电影网| 久久久久久高潮国产精品视| 国产精品久久久久久久久免费| 国产精品日韩在线一区| 久久九九亚洲综合| 欧美黑人巨大xxx极品| 中文字幕久精品免费视频| 97久久精品人人澡人人爽缅北| 欧洲日本亚洲国产区| 热re99久久精品国产66热| 欧美一区二区.| 国产精品久久久久久影视| 国产精品自在线|