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

首頁 > 語言 > JavaScript > 正文

深入探究使JavaScript動畫流暢的一些方法

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

這篇文章主要介紹了使JavaScript動畫流暢的一些方法,包括與CSS動畫效果的一些對比,需要的朋友可以參考下

基于Javascript的動畫暗中同CSS過渡效果一樣,甚至更加快,這怎么可能呢?而Adobe和Google持續發布的富媒體移動網站的性能可媲美本地應用,這又怎么可能呢?

本文逐一遍覽了基于Javascript的DOM動畫庫,如Velocity.js和GSAP,看其是如何比jQuery和CSS動畫效果更具性能的.

jQuery

讓我們先從基礎的開始: JavaScript 和 jQuery 被錯誤的混為一談了. JavaScript 動畫是很快的. jQuery 把它放慢了下來。為什么?因為 — 盡管jQuery非常強大 — 但成為一個性能強勁的動畫引擎從來都不是jQuery的設計目標:

jQuery 不能避免 布局顛簸 ,這得歸因于它的代碼庫提供了動畫之外的多種用途.

jQuery 的內存消耗經常會觸發垃圾回收,那樣會 時不時的讓動畫定格下來.

jQuery 使用 setInterval 而不是 requestAnimationFrame (RAF) 來 保護新技術不受其自身的影響.

應該注意到布局顛簸就是在動畫開始部分的不順暢,垃圾回收就是造成動畫期間不順暢的元兇, 而沒有使用RAF則會導致低幀率.

實現示例

避免造成布局顛簸的DOM查詢和更新組合:

 

 
  1. var currentTop, 
  2. currentLeft; 
  3.  
  4. /* With layout thrashing. */ 
  5. currentTop = element.style.top; /* QUERY */ 
  6. element.style.top = currentTop + 1; /* UPDATE */ 
  7.  
  8. currentLeft = element.style.left; /* QUERY */ 
  9. element.style.left = currentLeft + 1; /* UPDATE */ 
  10.  
  11. /* Without layout thrashing. */ 
  12. currentTop = element.style.top; /* QUERY */ 
  13. currentLeft = element.style.left; /* QUERY */ 
  14.  
  15. element.style.top = currentTop + 1; /* UPDATE */ 
  16. element.style.left = currentLeft + 1; /* UPDATE */ 

發生在更新之后的查詢會強制瀏覽器對頁面的計算式數據進行重新計算 (同時會把新的更新效果考慮在內). 這樣就會對動畫產生顯著的開銷,而這只是16毫秒微小間隔的運行超時.

類似的,實現 RAF 并不必須是對你的現有代碼庫的顯著返工. 讓我們拿RAF的基礎實現同setInterval比較一下:

 

 
  1. var startingTop = 0; 
  2.  
  3. /* setInterval: Runs every 16ms to achieve 60fps (1000ms/60 ~= 16ms). */ 
  4. setInterval(function() { 
  5. /* Since this ticks 60 times a second, we divide the top property's increment of 1 unit per 1 second by 60. */ 
  6. element.style.top = (startingTop += 1/60); 
  7. }, 16); 
  8.  
  9. /* requestAnimationFrame: Attempts to run at 60fps based on whether the browser is in an optimal state. */ 
  10. function tick () { 
  11. element.style.top = (startingTop += 1/60); 
  12.  
  13. window.requestAnimationFrame(tick); 

RAF 產生了推動動畫性能的最大可能性,你可以對你的代碼進行單一的變更.

CSS 轉換

CSS轉換通過把動畫邏輯甩給瀏覽器本身去處理而超越了jQuery,這在以下幾方面是有效果的:(1)優化DOM交互和內存消耗以避免卡頓(顛簸),(2)利用引擎的RAF原則,(3)強制硬件加速(利用GPU的能力來提高動畫性能)。

然而,現實是,這些優化也可以在JavaScript中直接執行。GSAP已經這樣做了多年。Velocity.js,一個新的動畫引擎,不僅利用了同樣的技術,而且還向前多走了幾步——我們不久會探討這些。

面對事實,JavaScript動畫可以與CSS轉換競爭只是我們康復計劃的第一步。第二步是實現“JavaScript動畫實際上可以比CSS轉換更快”。

現在我們開始談談CSS變換的弱點:

transition強制硬件加速會加大GPU消耗,高負荷情形下將導致運行不流暢。這種情況在移動設備上尤為明顯。(特殊情況下,比如當數據在瀏覽器主線程和排版線程之間傳遞產生的瓶頸也會導致不流暢)。某些CSS屬性,比如transform和opacity,則不受這些瓶頸影響。Adobe在這里精心總結了這些問題。

transition在IE10以下沒有用,造成的自IE8和IE9以來的桌面站點可用性問題至今仍然廣泛存在。

由于transition并不是由JavaScript原生控制(而僅僅是由JavaScript觸發),瀏覽器無法獲知如何與控制這些transition的JavaScript代碼同步地優化他們。

相反的,基于JavaScript的動畫庫則可以自行確定合適開啟硬件。它們原生支持各版本IE瀏覽器,并且它們尤其適合批量動畫優化。

我的建議是僅當你單獨為移動端開發且僅實現簡單動畫時使用原生CSS變換。這種環境下,transition是一種原生有效的解決方案,可以使你在樣式表中實現所有動畫邏輯,而不用添加額外的JavaScript庫,從而避免你的頁面變得臃腫。然而,當你在設計復雜的UI,或者是開發存在不同狀態的UI的App時,你就應該使用動畫庫以使動畫保持流暢,同時使工作流程易于管理。Transit是一個在管理CSS變換方面做得尤其優秀的庫。

JavaScript 動畫

好了,那JavaScript可就在性能方面占據上風了. 但Javascript究竟具體快了多少呢? 好吧 — 最初 — 對于構建一個實在的 3D動畫示例 是足夠快的,通常在構建中你只會看到有使用WebGL. 而構建一個 多媒體小動畫 也夠了,通常你看到只會使用Flash或者After Effects構建. 而構建一個 虛擬世界 也夠了,通常你只會看到使用canvas構建.

為了對領先的動畫庫,當然還要包含Transit(它使用CSS漸變效果),進行直接的對比, 回頭去看看Velocity在VelocityJS.org上的文檔.

問題仍然是: JavaScript是怎樣具體的達成其高水平性能的? 下面是對基于Javascript動畫能夠被執行這一目標的優化的一個簡短清單:

同步 DOM → 在整個動畫鏈中間入棧以最小化布局抖動.

為整個鏈式調用緩存屬性值,以最小化DOM查詢發生 (這些就是高性能DOM動畫的坑).

在同樣的調用中緩存整個同級別元素的單元轉換率 (比如 px 到 %, em, 等等.).

當更新可能會在視覺上不可見時跳過樣式更新.

回顧一下我們先前學過的關于布局顛簸的知識,Velocity.js利用這些最佳實踐來緩存動畫結束值以復用為隨后動畫的開始值,從而避免了重新查詢DOM以獲取元素的開始值:

 

 
  1. $element 
  2. /* Slide the element down into view. */ 
  3. .velocity({ opacity: 1, top: "50%" }) 
  4. /* After a delay of 1000ms, slide the element out of view. */ 
  5. .velocity({ opacity: 0, top: "-50%" }, { delay: 1000 }); 

在上面例子中,第二個 Velocity 調用知道它應該自動從 opacity為1 和 top為50% 開始。

瀏覽器本身最終能夠執行許多這些相同的優化,但這樣做會明顯減少開發者能夠制作的動畫代碼的方式。因此,出于同樣原因,由于jQuery不使用RAF(如上所述),瀏覽器就不會強制優化它,甚至給出一個很小的機會去打破規格或偏離預期的行為。

最后,我們對這兩個JavaScript動畫庫(Velocity.js 和 GSAP)互相比較一下。

GSAP 是首個動畫庫,用在演示JavaScript DOM 令人印象深刻的動畫表現。它確實是這樣,但有些缺點:

在中到高負荷動畫中,GSAP 的 DOM 交互開銷導致動畫在開始時和過程中失幀。

相反于Velocity.js 是在超寬松的 MIT 許可下發布的, GSAP 是閉源的, 并且在很多類商用時候需要許可年費。

因為 GSAP 是一個完整的動畫套件,是 Velocity 大小的三倍。然而,GSAP 有如此豐富功能,有助于其成為動畫的瑞士軍刀。

我推薦做法是在你需要精確控制定時(比如 重繪,暫停/恢復)和運動(比如貝塞爾曲線路徑)的時候用 GSAP 。這些特性在游戲開發和某些特殊應用中是至關重要的,但是通常不需要用在網頁應用的 UI中。

Velocity.js

引用 GSAP 豐富的特性并不代表Velocity自身在特性上是輕量級的. 相反,在壓縮后僅有的7kb中,Velocity不僅僅復制了jQuery $.animate()的所有功能, 它還把顏色動畫,轉換,循環,easing效果,類動畫還有滾動都打包了進去.

總之,Velocity是jQuery,jQuery UI,以及CSS漸變效果的最佳組合.

此外,從便利的角度看,Velocity在hood(蓋子,大概意思是公共的接口)之下使用jQuery的 $.queue() 方法, 如此就可以實現同 jQuery 的 $.animate(), $.fade(), 和 $.delay() 函數的無縫互操作. 而且,由于Velocity的語法同 $.animate() 的語法是相同的, 你不需要改變頁面的任何代碼.

讓我們快速地來看一看 Velocity.js. 在基礎的層面,Velocity的行為同$.animate()一樣:

 

 
  1. $element 
  2. .delay(1000) 
  3. /* Use Velocity to animate the element's top property over a duration of 2000ms. */ 
  4. .velocity({ top: "50%" }, 2000) 
  5. /* Use a standard jQuery method to fade the element out once Velocity is done animating top. */ 
  6. .fadeOut(1000); 

在其最高級的層面,可以創建帶有3D動畫的復雜滾動場景 — 幾乎只要用到兩行簡單的代碼:

 

 
  1. $element 
  2. /* Scroll the browser to the top of this element over a duration of 1000ms. */ 
  3. .velocity("scroll", 1000) 
  4. /* Then rotate the element around its Y axis by 360 degrees. */ 
  5. .velocity({ rotateY: "360deg" }, 1000); 

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

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品国产自产拍高清av水多| 欧美激情视频免费观看| 欧美人在线观看| 日韩免费精品视频| 精品亚洲男同gayvideo网站| 国产日韩欧美在线视频观看| 国产视频精品免费播放| 亚洲美女福利视频网站| 国外成人性视频| 国产精品高潮在线| 欧美美最猛性xxxxxx| 亚洲精品动漫久久久久| 欧洲精品毛片网站| 久久久久久久久久久免费精品| 色诱女教师一区二区三区| 日韩av影视综合网| 亚洲欧美日本伦理| 国产成人鲁鲁免费视频a| 久久久成人精品视频| 亚洲精品国精品久久99热一| 国产精品丝袜一区二区三区| 日韩中文字幕网址| 日韩国产高清污视频在线观看| 最近免费中文字幕视频2019| 国产91对白在线播放| 亚洲欧美日韩视频一区| 中文欧美日本在线资源| 尤物九九久久国产精品的特点| 欧美在线性视频| 国产精品自产拍高潮在线观看| 久久成人av网站| 国内精久久久久久久久久人| 成人激情在线观看| 都市激情亚洲色图| 狠狠色香婷婷久久亚洲精品| 日韩成人在线视频网站| 欧美另类暴力丝袜| 亚洲最大的免费| 欧美成人中文字幕在线| 欧美大成色www永久网站婷| 色综合伊人色综合网站| 欧美久久精品一级黑人c片| 色综合天天狠天天透天天伊人| 国产成+人+综合+亚洲欧洲| 亚洲精品少妇网址| 亚洲欧美精品在线| 国产精品免费小视频| 日韩欧美在线国产| 91社区国产高清| 国产精品狠色婷| 欧美激情在线视频二区| 国产99久久精品一区二区永久免费| 亚洲欧洲日产国码av系列天堂| 精品久久久一区| 国产精品美女久久久久av超清| 国产丝袜一区二区三区免费视频| 成人观看高清在线观看免费| 8090理伦午夜在线电影| 俺去啦;欧美日韩| 在线观看欧美www| 国产精品久久久久久久9999| 国产美女久久精品香蕉69| 国产丝袜精品第一页| 午夜精品一区二区三区av| 久久成人精品视频| 丝袜亚洲另类欧美重口| 午夜精品蜜臀一区二区三区免费| 一区二区三区四区在线观看视频| 国产美女精品视频免费观看| 欧美xxxwww| 欧美激情极品视频| 国产精品久在线观看| 久久精品成人动漫| 欧美精品aaa| 午夜美女久久久久爽久久| www高清在线视频日韩欧美| 精品国产一区久久久| 亚洲片国产一区一级在线观看| 亚洲美女在线看| 欧美午夜xxx| 成人性教育视频在线观看| 亚洲片国产一区一级在线观看| 欧美成人合集magnet| 亚洲精美色品网站| 国产精品一久久香蕉国产线看观看| 欧美精品www在线观看| 91黑丝高跟在线| 久久精品国产亚洲7777| 91精品在线观看视频| 久久久久久一区二区三区| 97超碰色婷婷| 国产小视频国产精品| 久久91亚洲精品中文字幕| 91中文字幕一区| 欧美激情乱人伦| 亚洲aa在线观看| 欧美黑人性猛交| 97人人爽人人喊人人模波多| 欧美精品在线第一页| 粗暴蹂躏中文一区二区三区| 最近2019免费中文字幕视频三| 亚洲在线一区二区| 日韩av免费网站| 91po在线观看91精品国产性色| 亚洲人成网站免费播放| 欧美成人激情视频免费观看| 日本精品久久电影| 欧美激情在线狂野欧美精品| 亚洲精品第一页| 国产香蕉精品视频一区二区三区| 成人av在线亚洲| 亚洲黄色av女优在线观看| 久久综合久中文字幕青草| 日韩国产激情在线| 午夜精品久久久久久久久久久久| 日韩在线视频免费观看高清中文| 亚洲精品福利免费在线观看| 亚洲最新在线视频| 欧美日本啪啪无遮挡网站| 国产91精品高潮白浆喷水| 久久天天躁夜夜躁狠狠躁2022| 日韩在线一区二区三区免费视频| 亚洲免费视频在线观看| 精品视频久久久久久久| 欧美在线视频免费观看| 国产一区二区三区在线观看网站| 日韩中文字幕av| 久久视频在线播放| 久久久爽爽爽美女图片| 亚洲色图欧美制服丝袜另类第一页| 日韩免费黄色av| 国产成人jvid在线播放| 久久这里有精品| 日韩欧美综合在线视频| 亚洲欧美国产精品| 久热在线中文字幕色999舞| 欧美激情一区二区久久久| 国产欧美精品在线播放| 欧美一级高清免费播放| 91美女福利视频高清| 日韩成人在线视频| www国产亚洲精品久久网站| 亚洲欧美一区二区三区在线| 久久成人这里只有精品| 色偷偷91综合久久噜噜| 欧美韩国理论所午夜片917电影| 亚洲色图综合久久| 91欧美精品午夜性色福利在线| 日韩在线视频网站| 色妞欧美日韩在线| 国产精品自拍小视频| xxxx性欧美| 久久久久久久久久久国产| 国外日韩电影在线观看| 91手机视频在线观看| 92版电视剧仙鹤神针在线观看| 日韩国产高清污视频在线观看| 欧美乱大交xxxxx另类电影| 亚洲色图18p| 欧美激情一区二区三区高清视频| 欧美日韩在线看| 精品偷拍各种wc美女嘘嘘| 欧美国产日韩一区二区| 日本久久中文字幕|