Vueのアニメーションはカスタムディレクティブで管理しよう

23814 ワード

概要

みなさんWebのスクロールアニメーションは好きですか?
私は見るのは好きですが、都度アニメーション処理を書き直すのがとても面倒っちいと感じます。

クリエイティブ系のWebサイトでよく使われている(気がする)Vue.jsですが、標準機能であるカスタムディレクティブを使ったアニメーション管理がとてもメンテしやすかったので共有します。

この記事でやること/やらないこと

やること

  1. ディレクティブの紹介
  2. カスタムディレクティブの紹介
  3. スクロールディレクティブの実装
  4. 画面内判定の実装
  5. カスタムディレクティブとアニメーション処理の繋ぎ込み

やらないこと

  • vueやgsapの記法説明
  • リッチなアニメーションパターンの紹介

開発環境

Mac Big Sur(v11.6)
Google Chrome ver:100.0.4896.75(Official Build)(x86_64)
Nuxt.js(@nuxt/cli v2.15.8)

ディレクティブ

ディレクティブとは

Vueには標準で v-modelv-show といったディレクティブが搭載されてます。
一部を除いて、これらはJSの式と合わせて使います。
例えば v-if は =(イコール) で結ばれた条件式のtrue, falseによって画面表示を制御できます。

// これは画面に表示されます。
<div v-if="1 + 1 == 2">
    <p>Hello World!</p>
</div>

// これはif以降の式がfalseなので表示されません。
<div v-if="1 + 1 == 5">
    <p>Hello World!</p>
</div>

公式の定義(出典: Vue.js公式サイト)

ディレクティブは v- から始まる特別な属性です。ディレクティブ属性値は、単一の JavaScript 式を期待します(ただし、v-forは例外で、これについては後から説明します)。ディレクティブの仕事は、属性値の式が変化したときに、リアクティブに副作用を DOM に適用することです。イントロダクションで見た例を振り返ってみましょう:

カスタムディレクティブとは

Vueにはスクロール動作や量に対応したディレクティブが存在しません。
そこでv-xxxxのように自前実装したカスタムディレクティブを登録することで更にリッチな表現がつくれます。