前端動畫效果實現的簡單比較

2021-07-28 09:52:58 字數 1886 閱讀 4949

合適的動畫不僅更能吸引人們的眼球,也能讓你的應用體驗更為流暢,而將動畫的效果做到極致,才能讓使用者感到使用你的應用是一種享受,而不是覺得生硬和枯燥。本文旨在**各種前端動畫效果實現方式的異同,具體應用中如何實現,以及實現的效果還得根據自身的情況進行考量。

因為沒有其它可用的實現方式,最初的前端動畫都是js來實現,實現上就是通過乙個定時器setinterval 每隔一定時間來改變元素的樣式,動畫結束時clearinterval即可。早期的類庫包括 jquery、prototype、mootools 等等都是這種方式。

儘管這種方式動畫的可控性很強,但是問題也很明顯:

css3 加了兩種動畫的實現方式,一種是transition, 一種是animation

transition 包含4種屬性:transition-delaytransition-durationtransition-propertytransition-timing-function,對應動畫的4種屬性: 延遲、持續時間、對應css屬性和緩動函式。

transform 包含7種屬性:animation-nameanimation-durationanimation-timing-functionanimation-delayanimation-directionanimation-iteration-countanimation-fill-modeanimation-play-state,它們可以定義動畫名稱,持續時間,緩動函式,動畫延遲,動畫方向,重複次數,填充模式。

總的來說,css 動畫相比與js更輕量,效能更好,更易於實現,同時也不必擔心缺乏標準和增加頻寬消耗的問題。animation 相比 transtion 使用起來更為複雜,但也提供了更多的控制,其中最重要的就是 frame 的支援,不過通過一些簡單的js庫,例如 tj 的 move.js, 我們也能在js中通過 transition 來實現更複雜的控制。

html5 定義了三種繪圖的方式,canvassvgwebgl,其中svg做為一種可縮放向量圖形的實現是基於xml標籤定義的,它有專門的animate標籤來定義動畫。而為canvas或者webgl實現動畫則需要通過requestanimationframe(簡稱 raf) 來定期重新整理畫布。 儘管說 raf 的方式會讓**變得複雜,但是因為不需要那麼多的文件物件(通常瀏覽器只需要管理乙個畫布),它的效能也好很多,尤其是在記憶體吃緊的移動端上面。

通過新的 raf 介面以及一些改進手段我們也可以用js來實現高效能的動畫。主要手段如下:

1. 減少 dom 樣式屬性查詢,dom 樣式屬性的查詢會導致頁面重排,從而消耗效能,通過將屬性儲存在js變數中就可以避免在動畫時去查詢,從而減少卡頓。

2. 使用效能更好的 csstransform替代改變絕對定位元素的定位屬性

3. 在移動裝置上使用 3d 硬體加速,最簡單辦法就是新增-webkit-transform: translatez(0),原因是移動端的顯示卡有很強的圖形渲染能力,而每個應用的 webview 記憶體卻是極其有限的。

使用js的動畫可控性更好,比如說通過事件捕捉可以很容易的設定不同引數。這方面做的最全面的有 velocity.js,它可做為jquery 外掛程式使用,對於初學者很友好,我個人會傾向於使用 tween.js,因為它只專注與動畫的數值計算,不僅僅只適用與 dom 操作。

簡單彩虹動畫的效果實現

簡單彩虹動畫的效果實現 我們先看下最後的效果圖 1 首先我們使用uibezierpath類畫乙個圓弧,使用方法 instancetype bezierpathwitharccenter cgpoint center radius cgfloat radius startangle cgfloat s...

ListView之簡單動畫效果實現

下面是布局檔案中乙個listview控制項 其中引用了乙個list layout animation檔案,下面我們在res anim 下面建立這樣乙個檔案,其內容如下 其中,android animation表示每個item出現時使用的動畫,它引用了item animation檔案,該檔案中具體描述...

vue動畫過渡效果實現

1.首先在父路由中新增transition標籤 並給其新增動態的 name屬性 然後用transition標籤包裹router view標籤 然後在data中return出來動態 name 在style中寫 name enter,name enter to,name enter active的樣式 ...