Web Animation API を使う

アニメーションはgsapをよく使うのですが、ちょっとした動きならライブラリを使わずにWeb Animation APIを使うのはアリなのでは?と思いデモを作りました。
動作は軽快で、最初は特殊な書き方に戸惑いますが、ちゃんとアニメーション前後のイベントも拾えるし、Promiseも使えるので良い感じです。結構できることが多いので、少しずつ勉強していきたいと思っています。ただ当然のごとく(笑)IEに対応していないので、本格的に使うなら6月以降なのかなと思います。

基本の使い方

const demo = document.querySelector(".demo");

//アニメーション
let animation = [
  { opacity: 0, visibility: "hidden" },//from
  { opacity: 1, visibility: "visible" }//to
];

// アニメーションは何個でも設定できる
// let animation = [
//   { opacity: 0, visibility: "hidden" },
//   { opacity: 1, visibility: "visible"  }
//   { opacity: 1, visibility: "visible" color:'#f00' },
//   { opacity: 1, visibility: "visible" color:'#ddd' }
// ];

//オプション
let animationOption = {
  duration: 300,//何ミリ秒かけてアニメーションするか
  fill: "forwards",//animation-fill-mode
  easing: "ease"//イージング
};

//アニメーションする
demo.animate(animation, animationOption);

アニメーションの準備ができたこと、終了したことを検知する

アニメーションが準備できたこと、アニメーションが終了したことを検知できるプロパティがあります。

Animation.ready
Animation.ready はアニメーションの準備ができたときに Promise を返します。

demo.pause();
demo.ready.then((anim) =>  {
  // Displays 'running'
  alert(anim.playState);
});

Animation.finished
Animation.finished アニメーションの再生が終了すると Promise を返します。
Codesandboxのデモでは、アコーディオンのアニメーションが終了したらclassをつけたり消したりし、アコーディオンのフラグを切り替えています。

//アニメーションが終わったら
accordionCloseAnimation.finished.then((anim) => {
  if (anim.playState) {
    _this.classList.remove("is-open");
    accordionFlg = true;
  }
});

IE対応

Web Animation APIはIEでは使えません😨

“Web Animation API” | Can I use… Support tables for HTML5, CSS3, etc
https://caniuse.com/?search=Web%20Animation%20API

未対応ブラウザにも効かせたい場合はPolyfillがあるようです。
https://github.com/web-animations/web-animations-js

参考サイト

Web Animation API の使い方 JavaScript でアニメーション / Web Design Leaves
https://www.webdesignleaves.com/pr/jquery/web-animation-api-basic.html
↑ものすごく詳しくまとめてくださっています!

Web Animations API を利用する – Web API | MDN
https://developer.mozilla.org/ja/docs/Web/API/Web_Animations_API/Using_the_Web_Animations_API