0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Vue.js】JavaScriptでトランジションを実装する

Last updated at Posted at 2021-06-29

はじめに

仕事で使う事になったので1からVue.jsについて学んだ。
ちゃんと覚えておかないとまずそうな事を備忘録として1つ1つ残しておく。

JavaScriptでトランジションを実装する

JavaScriptでのトランジションの基本形

JavaScriptでのトランジション・アニメーションは、以下のように8つのJavaScriptフック関数を宣言する事で実装できる(beforeEnter, enter, ...のそれぞれはmethods: {}内にそれぞれ定義する)。

<transition
      @before-enter="beforeEnter"
      @enter="enter"
      @after-enter="afterEnter"
      @enter-cancelled="enterCancelled"
      @before-leave="beforeLeave"
      @leave="leave"
      @after-leave="afterLeave"
      @leave-cancelled="leaveCancelled"
    >
  <div class="circle" v-if="show"></div>
</transition>

詳細は以下のコミットを参照。

実際にJavaScriptでトランジションを実装する

ezgif.com-gif-maker (25).gif
動画のソースコードは以下。

App.vue
<template>
  <div class="main">
    <!-- 省略 -->
    <button type="button" class="btn btn-primary me-1" @click="show = !show">
      切り替え
    </button>
    <br /><br />
    <transition
      :css="false"
      @before-enter="beforeEnter"
      @enter="enter"
      @leave="leave"
    >
      <div class="circle" v-if="show"></div>
    </transition>
    <!-- 省略 -->
  </div>
</template>

<script>
// 省略

export default {
// 省略
  methods: {
    beforeEnter(el) {
      // 現れる前
      el.style.transform = "scale(0)";
    },
    enter(el, done) {
      let scale = 0;
      const interval = setInterval(() => {
        el.style.transform = `scale(${scale})`;
        scale += 0.1;
        if (scale > 1) {
          clearInterval(interval);
          done();
        }
      }, 100);
    },
    leave(el, done) {
      // 消える時(イメージはtransitionのCSSの"-leave-active"の部分)
      let scale = 1;
      const interval = setInterval(() => {
        el.style.transform = `scale(${scale})`;
        scale -= 0.1;
        if (scale < 0) {
          clearInterval(interval);
          done();
        }
      }, 100);
    },
  },
};
</script>

<style scoped>
/* 省略 */

.circle {
  width: 200px;
  height: 200px;
  margin: auto;
  border-radius: 100px;
  background-color: deeppink;
}
</style>
  • :css="false"
    JavaScriptのアニメーションのみを有効化する時には、css属性にfalseをbindする
    これにより以下のメリットが出る
    • 意図しないアニメーションの動きにならないようにする(name属性が未定義でもv-enter, ...は暗黙に存在するので)
    • CSSのトランジション・アニメーションの処理をskipさせられるのでパフォーマンスを向上させる

※注意として、v-bind:cssfalseをバインディングしており、falseはboolean型(文字列ではない)。

  • done()
    アニメーションが終わった事をVue.jsに伝えるための関数
    上記の例では繰り返し非同期でトランジション・アニメーションを動かし、それが完了した事を伝える役割を担っている

ソースコード全体は以下。

CSSトランジションとJavaScriptトランジションを併用するとどうなるか?

JavaScriptのトランジションのenter()leave()のフック関数では、Vue.jsにトランジション・アニメーションが完了した事を伝えるためのdone()メソッドがあるが、これが呼ばれた場合はその時点で、CSSトランジションの動きが途中でも中断されてトランジションが完了になる。
done()メソッドがない場合、両方のトランジションが完了するまで動きが機能する。

CSSトランジションとJavaScriptトランジションを併用している時の、トランジションクラスの適用・JavaScriptメソッドの実行が行われるタイミング

enter(要素が現れる時)

図2.png

leave(要素が消える時)

図1.png

Vue.jsの勉強メモ一覧記事へのリンク

Vue.jsについて勉強した際に書いた勉強メモ記事のリンクを集約した記事。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?