anime.js 實戰:實現一個帶有描邊動畫效果的複選框

本文轉載於:猿2048網站anime.js 實戰:實現一個帶有描邊動畫效果的複選框javascript

在網頁或者是APP的開發中,動畫運用得當能夠起到錦上添花的做用。正確使用動畫,不但能夠有助於用戶理解交互的做用,還能夠大大提升網頁應用的魅力和使用體驗。而且在如今的網頁開發中,動畫已經成爲了一個設計的標準,變得愈來愈重要。特別是在一些和用戶交互的地方,使用動畫能更好的給用戶以反饋,提高用戶的操做體驗。php

在網頁開發中,有不少種技術來實現動畫。在這篇文章中,咱們使用anime.js這個輕量強大的javascript動畫庫來編寫動畫效果。使用它能夠很是方便建立和管理動畫。若是你還不是很熟悉這個庫的使用方法,能夠去看看之前寫一篇入門文章。這篇文章主要是使用它來實現下面這個效果:html

animejs82-1.gif

這個動畫效果很是簡單,主要是有一個圓圈和一個白色的勾組成。使用CSS中的border-radius能夠很是方便的建立這個圓。使用它可能比使用SVG來建立圓還要簡單些而且代碼量也少點,不過在這個效果中,因爲那個白色的勾要用到SVG來實現,因此圓圈也使用SVG來實現。並且SVG如今變得愈來愈流行了,並且SVG是矢量能夠隨意放大縮小。下面就是這個圓圈的SVG代碼:前端

<svg class="checkmark"
     xmlns="http://www.w3.org/2000/svg"
     width="32"
     height="32"
     viewBox="0 0 32 32">
  <circle class="circle"
          cx="16"
          cy="16"
          r="16"
          fill="#0c3"/>
</svg>

上面的代碼簡潔明瞭,主要是繪製了一個半徑爲16px的綠色的圓:java

animejs82-2.jpg

先來實現一個簡單的動畫效果,把圓圈從無到有放大到完整的尺寸。要實現這個效果咱們須要作兩件事情:一、給圓圈一個類名;二、實例化一個anime.js的timeline,使用它來能夠把多個動畫效果組合在一塊兒。固然你也不用timeline來建立動畫效果,能夠直接使用構造函數建立動畫效果。不過使用timeline的好處是,能夠更加方便的管理動畫,好比各個效果之間的銜接和延遲等,咱們能夠更精細的控制動畫效果。這裏的縮放效果,直接是縮放這個SVG來實現的,代碼以下所示:ide

var checkTimeline = anime.timeline({ autoplay: true, direction: 'alternate', loop: true });
checkTimeline
  .add({
    targets: '.checkmark',
    scale: [
      { value: [0, 1], duration: 600, easing: 'easeOutQuad' }
    ]
  })

簡單解釋下這段代碼,首先定義了anime的一個實例,而且經過autoplay、direction和loop定義了動畫是自動播放而且是一直循環交替來執行動畫。經過targets參數來制定要執行動畫的元素即checkmark,從0到1進行縮放,動畫時間是600毫秒,還定義了動畫的運動曲線。
animejs82-3.gifsvg

在動畫製做中,動畫執行的週期時間的選擇也是一個很是須要關注的點。一方面,咱們都不但願用戶等待的過久,這樣會下降整個的交互體驗,使用戶在交互的過程當中感到遲鈍。另外一方面,咱們也不但願用戶在操做的過程當中,一切的交互行爲立刻發生,這樣也會顯的突兀。在這個實例中,整個放大縮小的動畫週期仍是有一點點長,固然在開發階段,適當的延長點有利於調試。可是在實際生產環境中,UI動畫仍是越簡單越好。因此在動畫開發中,就是要不斷地經過調試來達到理想的狀態。實際上配合一些動畫曲線工具,可使動畫的體驗更加的舒服天然,這裏能夠參考下Google的一個動畫曲線的指南函數

使用曲線在動畫開發中是一個必不可少的一部分,它可使動畫的體驗更加舒服天然。在實際開發中,爲不一樣類型的動畫選擇不一樣的動畫曲線也是作動畫時,必需要注意的一點。曲線選擇也受制於具體動畫的場景,好比形狀與形狀之間的動畫,拋物線運動等等,總而言之就是要複合物理運動的一個規律。在CSS3中常用的運動曲線是ease-in、ease-out和ease-in-out這三個,好比ease-out表示緩出動畫,緩出使動畫在開頭處比線性動畫更快,還會在結尾處減速。ease-out緩入動畫,緩入動畫開頭慢結尾快,與緩出動畫正好相反。通常在UI界面動畫中,適合使用緩出動畫即ease-out。因此,在這個複選框的動畫實例中,適合使用緩出動畫。工具

接下來是勾的動畫。像勾這類的形狀一般由SVG中的路徑(path)來實現。具體路徑的詳細介紹,能夠去這篇文章看看。在實際開發中,通常都是使用諸如AI或者是Inkscape等矢量設計工具來設計,而後導出SVG格式。具體到這個勾,實現起來也很是簡單,三個錨點就能夠實現一個勾的形狀。最後設置linecap的屬性的值爲2.5px來實現勾的兩端的圓角效果。oop

這裏要注意的一點的是:要在整個設計過程當中,遵照必定的設計原則。好比在這個效果中,一致性就是一個重要的設計原則。若是在靜態的圖形中,使用了圓角,那麼在動畫中最好也要保持這個圓角。固然你也可使用方的角。總之,在整個過程當中,請保持UI的一致性。
animejs82-4.jpg

導出來代碼以下:

<path class="check"
      d="M9 16l5 5 9-9"
      fill="none"
      stroke="#fff"
      stroke-width="2.5"
      stroke-linecap="round">

和圓整合一下,效果以下:
animejs82-5.gif

如今看起來還不錯,只剩下最後一步就是這個勾要作一個繪製的動畫效果。使用SVG實現描邊動畫效果講了不少了,能夠去看看這篇文章。在anime.js中,實現一個描邊繪製動畫也很是簡單,它提供了anime.setDashoffset這個方法來計算路徑(path)的長度,使用它就能夠實現一個繪製的動畫效果。代碼以下:

checkTimeline
  .add({ ... }) /* Previous steps */
  .add({
    targets: '.check',
    strokeDashoffset: {
      value: [anime.setDashoffset, 0],
      duration: 700,
      delay: 200,
      easing: 'easeOutQuart'
    }

仍是老套路,先選擇要作動畫的元素。後面是來設置路徑(path)的dashoffset的值,初始的值整個路徑(path)的長度,整個路徑是在畫布外的不可見;經過anime.setDashoffset方法,把它的值設置爲0,出如今畫布中,就能夠實現繪製動畫效果。

最後還經過設置勾的transform來移動它的位置,使它居於圓圈的中心位置。

OK,一個帶有動畫效果的複選框就完成了!能夠發現使用anime.js來開發動畫效果仍是很簡單的。
animejs82-6.gif

本文主要是從How to create a checkmark animation with anime-js這篇文章整理而來,有刪減,有疏漏或者理解不到位的地方,還請多多指教!

更多前端文章

原文地址:http://svgtrick.com/tricks/5597ff31b69ca5a6d347a42e83b16b62

相關文章
相關標籤/搜索