時給単価UP【3大特典付き】
コーディングテクニック集100選⋙

【解説】Vue.jsのTransitionの使い方【クラス名変更/初回描画時】

記事内に広告を含みます

パソ君
パソ君

・Vue.jsでTransitionコンポーネントはどう使うの?

こんな疑問にお答えします。

Vue.jsでは「Transition」コンポーネントを活用することで、アニメーションを簡単に実装可能です。

付与されるクラス名に対して、CSSを指定するだけで実装できますからね。

今回は自分用のメモとして「Transition」の使い方をまとめてみました!

ジト
ジト

参考にどうぞ

ということで、この記事では「Vue.jsのTransitionの使い方」について解説していきます!

この記事でわかること

・Vue.jsのTransitionの使い方
・Vue.jsのTransitionのクラス名の変更方法
・Vue.jsのTransitionのクラス名の変更方法②
・Vue.jsのTransitionの初回描画時の適用
・Vue.jsのTransitionのmodeを使用
・Vue.jsのTransitionのCSSアニメーション実装

【解説】Vue.jsのTransitionの使い方

そんなTransitionを使ったアニメーション例がこちら↓

See the Pen vue transition① by jito-coder (@jito-coder) on CodePen.

v-ifを用いて、ボタンをクリックしたら表示/非表示されるプログラムを実装しております。

表示/非表示する時、透過アニメーションが実装されますよね。

これがTransitionを使った実装となります。
コードがこちら↓

<script setup lang="ts">
import { ref } from 'vue';
const toggleItem = ref(true)
</script>

<template>
  <Transition>
    <div class="box" v-if="toggleItem">要素</div>
  </Transition>
  <button v-on:click="toggleItem = !toggleItem">クリック</button>
</template>
.v-enter-from {
  opacity: 0;
}
.v-enter-active {
  transition: opacity .5s;
}
.v-enter-to {
  opacity: 1;
}
.v-leave-from {
  opacity: 1;
}
.v-leave-active {
  transition: opacity .5s;
}
.v-leave-to {
  opacity: 0;
}

Transitionの基本的な使い方がこちら↓

  • Transitionコンポーネントを記述
  • 直下に1つの要素を入れる
  • 直下の要素を表示・非表示させる
  • 付与されるクラスに対してCSSを指定

順に解説してきます。

➀:Transitionコンポーネントを記述

templateタグ内に下記の様に記述します。

<Transition>
  
</Transition>

この中に適用させたい要素を入れていきます。

➁:直下に1つの要素を入れる

続いて要素を入れるのですが、注意点があります。

それはTransitionコンポーネントの直下の要素は1つだけにしておくことです。

<Transition>
  <!-- 直下に1つだけ -->
  <div class="box" v-if="toggleItem">要素</div>
</Transition>

上記だとdivタグ要素1つだけですね。

下記のように2あるとエラーがでてしまいます。

ただしネストされている場合はOKです。

<Transition>
  <!-- これはNG -->
  <div class="box" v-if="toggleItem">要素</div>
  <div class="box2" v-if="toggleItem2">要素</div>
</Transition>

<Transition>
  <!-- これはOK -->
  <div class="box" v-if="toggleItem">
    <div>要素1</div>
    <div>要素2</div>
  </div>
</Transition>

また下記のような「v-if」「v-else」を用いた場合も、実質1つだけしか表示はされないのでOKです。

<Transition>
  <!-- これはOK -->
  <div class="box" v-if="toggleItem">要素</div>
  <div class="box" v-else="toggleItem">要素</div>
</Transition>

➂:直下の要素を表示・非表示させる

Transitionコンポーネントは、直下の要素が表示・非表示することで機能してくれます。

そのため「v-if」「v-show」「動的コンポーネントによる変更」「key属性の値の変更」などが必要なんですよね。

今回は例として直下の要素に対して、「v-if」を使用しました。

<Transition>
  <div class="box" v-if="toggleItem">要素</div>
</Transition>
【解説】Vue.jsのv-ifとv-showの違いと使い分け【コード付き】

④:付与されるクラスに対してCSSを指定

あとはTransitionにより付与されるクラス名に対して、CSSを適用すれば実装完了です。

付与されるクラス名がこちら↓

/* 表示する時の初期状態 */
.v-enter-from {}
/* 表示する時のトランジションを書く */
.v-enter-active {}
/* 表示する時の最後の状態 */
.v-enter-to {}

/* 非表示する時の初期状態 */
.v-leave-from {}
/* 非表示する時のトランジションを書く */
.v-leave-active {}
/* 非表示する時の最後の状態 */
.v-leave-to {}

「v-enter-〇〇」は要素が表示される瞬間、「v-leave-〇〇」は要素が非表示される瞬間に付与されます。

クラスのつくタイミングがこちらになります↓

  • 表示される直前:.v-enter-fromクラスが付与
  • 表示される瞬間:.v-enter-fromが削除。.v-enter-activeと.v-enter-toが付与
  • 表示アニメーションが終了後:.v-enter-activeと.v-enter-toが削除

  • 非表示される直前:.v-leave-fromクラスが付与
  • 非表示される瞬間:.v-leave-fromが削除。.v-leave-activeと.v-leave-toが付与
  • 非表示アニメーションが終了後:.v-leave-activeと.v-leave-toが削除。

このタイミングに合わせて、下記のようにCSSを指定すればアニメーションを簡単に実装することができます。

/* 表示する時の初期状態 */
.v-enter-from {
  opacity: 0;
}
/* 表示する時のトランジションを書く */
.v-enter-active {
  transition: opacity .5s;
}
/* 表示する時の最後の状態 */
.v-enter-to {
  opacity: 1;
}

/* 非表示する時の初期状態 */
.v-leave-from {
  opacity: 1;
}
/* 非表示する時のトランジションを書く */
.v-leave-active {
  transition: opacity .5s;
}
/* 非表示する時の最後の状態 */
.v-leave-to {
  opacity: 0;
}

スタイルをまとめれば短く記述可能

ちなみにこんな感じでまとめれば、短くシンプルに記述できます。

.v-enter-from, .v-leave-to {
    opacity: 0;
}

.v-enter-active, .v-leave-active {
    transition: opacity .5s;
}

.v-enter-to, .v-leave-from {
    opacity: 1;
}

【解説】Vue.jsのTransitionのクラス名の「v-」を変える方法

先ほど紹介した例だと「v-enter-〇〇」「v-leave-〇〇」のように、クラス名が固定されちゃいます。

実はこの「v」の部分の名前は、変えることが可能です。

nameのpropsを使用

Transitionタグにname属性をつければ、その値が「v-」部分のクラス名となります。

例として「hello」という値をつけました↓

<Transition name="hello">
  <div class="box" v-if="toggleItem">要素</div>
</Transition>

これで「hello-enter-〇〇」や「hello-leave-〇〇」のようにクラス名が変更されます。

ジト
ジト

この場合「v-」から始まるクラス名は適用されなくなるよ

そのためCSSの指定も下記のように変更して実装しましょう。

.hello-enter-from {
    opacity: 0;
}
.hello-enter-active {
  transition: opacity .5s;
}
.hello-enter-to {
  opacity: 1;
}
.hello-leave-from {
  opacity: 1;
}
.hello-leave-active {
  transition: opacity .5s;
}
.hello-leave-to {
  opacity: 0;
}

【解説】Vue.jsのTransitionのクラス名を変える方法

先述したのは「v-」部分のみクラス名を変える方法でした。

ただ場合によっては、「v-enter-〇〇」「v-leave-〇〇」丸ごとクラス名を変更したいかと。

実はある方法を使えば、変更が可能です。

propsを使ってクラス名を変更

Transitionタグに対して、それぞれのクラス名を変更できるpropsを活用すれば実装できます。

そんなpropsがこちら↓

<Transition
  enter-from-class="クラス名を記述"
  enter-active-class="クラス名を記述"
  enter-to-class="クラス名を記述"
  leave-from-class="クラス名を記述"
  leave-active-class="クラス名を記述"
  leave-to-class="クラス名を記述"
>
  <div class="box" v-if="toggleItem">要素</div>
</Transition>

それぞれの値に対して任意のクラス名を記述します。
するとそのクラス名が適用されます。

クラス名を変えてみた実装コード

実際にクラス名を上書きしたコードを書いてみました。

<Transition
  enter-from-class="hello01"
  enter-active-class="hello02"
  enter-to-class="hello03"
  leave-from-class="hello04"
  leave-active-class="hello05"
  leave-to-class="hello06"
>
  <div class="box" v-if="toggleItem">要素</div>
</Transition>
.hello01 {
    opacity: 0;
}
.hello02 {
  transition: opacity .5s;
}
.hello03 {
  opacity: 1;
}
.hello04 {
  opacity: 1;
}
.hello05 {
  transition: opacity .5s;
}
.hello06 {
  opacity: 0;
}

こんな感じでクラス名を変えることができ、CSSにて指定すればアニメーションの実装ができます。

【解説】Vue.jsのTransitionを初回描画時からアニメーション適用

Transitionによるアニメーションを、初回描画時から適用させたいときありますよね。

ようはリロードした瞬間からアニメーションさせるということ。

実は簡単に実装可能です。

appear属性をつける

「appear属性」をつければ、初回描画時からアニメーションを適用させることができます。

<Transition appear>
  <div class="box" v-if="toggleItem">要素</div>
</Transition>

これでロード時から適用可能です。

【解説】Vue.jsのTransitionでmodeを使用

Transitionによるアニメーションで「v-if」「v-else」にて、2つの要素を表示・非表示させることありますよね。

ただ通常のやり方だと、下記みたいにカクカクします。

See the Pen vue transition② by jito-coder (@jito-coder) on CodePen.

<template>
  <Transition>
    <div class="box" v-if="toggleItem">要素01</div>
    <div class="box" v-else="toggleItem">要素02</div>
  </Transition>
  <button v-on:click="toggleItem = !toggleItem">クリック</button>
</template>

要素が非表示になる前に、もう一つの要素が表示されちゃってます。。

実はこれ簡単に対策できます。

「mode=”out-in”」を使う

結論として「mode=”out-in”」をTransitionタグに使えば対策可能です。

See the Pen vue transition③ by jito-coder (@jito-coder) on CodePen.

<Transition mode="out-in">
  <div class="box" v-if="toggleItem">要素01</div>
  <div class="box" v-else="toggleItem">要素02</div>
</Transition>

これで要素が非表示になってから、表示されるようになり良い感じにアニメーションが実装されます。

【解説】Vue.jsのTransitionでCSSアニメーションを実装

最後にkeyframesを使ったCSSアニメーションを、Transitionにて実装する方法を紹介していきます。

それがこちら↓

.v-enter-active {
  animation: test-anime 1s;
}
.v-leave-active {
  animation: test-anime 1s reverse;
}

@keyframes test-anime {
  0% {
    opacity: 0;
  }
  100% {
    opacity: 1;
  }
}

keyframesを使う場合「-active」クラスにて指定すれば、実装ができちゃいます。

ただ「v-leave-active」に対しては「reverse」を指定しましょう。

【解説】Vue.jsのTransitionの使い方【クラス名変更/初回描画時】:まとめ

  • Transitionコンポーネントの直下の要素は1つだけにしておく
  • 直下の要素が表示・非表示することで機能する
  • name属性を使えば「v-」部分のクラス名が変更可能
  • propsの活用で丸ごとクラス名の変更可能
  • 「mode=”out-in”」を使えば2つの要素の表示/非表示の対策可能
  • appear属性を使えばロード時もアニメーション適用可能
ジト
ジト

Vue.jsのTransitionを使う時はためしてみてね!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA