【学習メモ】動かして学ぶ!Vue.js 開発入門 その8
Chapter10 アニメーションするとき
01 表示/非表示時にアニメーションする:transition
表示/非表示時にアニメーションするときは、
transition
CSSスタイル
要素が現れるとき
.v-enter
:現れる前の状態.v-enter-active
:現れている最中.v-enter-to
:現れたときの状態
要素が消えるとき
.v-leave
:現れる前の状態.v-leave-active
:現れている最中.v-leave-to
:現れたときの状態
要素が移動するとき
.v-move
:要素が移動するとき
例
.v-enter { opacity: 0; } .v-enter-active { transition: 1s; }
チェックボックスで表示/非表示をアニメーションする
<div id="app"> <!-- チェックボックスで表示/非表示をアニメーションする --> <label><input type="checkbox" v-model="isOK">切り替える</label> <transition> <p v-if="isOK">表示、非表示のアニメ</p> </transition> </div>
new Vue({ el: "#app", data: { isOK: false } });
/* チェックボックスで表示/非表示をアニメーションする */ /* 現れている最中と、消えている最中は0.5秒 */ .v-enter-active, .v-leave-active { transition: 0.5s; } /* 現れる前の状態と、消えたときの状態は、透明度0で下へ10px移動 */ .v-enter, .v-leave-to { opacity: 0; transform: translateY(10px); }
結果
02 リストのトランジション:transition-group
ボタンを押してリストが増減するとき、アニメーションする
<div id="app"> <!-- ボタンを押してリストが増減するとき、アニメーションする --> <transition-group> <li v-for="item in dataArray" v-bind:key="item">{{ item }}</li> </transition-group> <label><input v-model="addItem" placeholder="追加するリスト"></label> <button v-on:click="addList">追加</button> <button v-on:click="removeLast">最後の1つを削除</button> </div>
new Vue({ el: "#app", data: { dataArray: ['Hanako', 'Ichiro', 'Tomoko'], addItem: '' }, methods: { addList: function () { this.dataArray.push(this.addItem); this.addItem = ''; }, removeLast: function () { const lastIndex = this.dataArray.length - 1; this.dataArray.splice(lastIndex, 1); } } });
/* ボタンを押してリストが増減するとき、アニメーションする */ /* 現れている最中と、消えている最中は0.5秒 */ .v-enter-active, .v-leave-active { transition: 0.5s; } /* 現れる前の状態と、消えたときの状態は、透明度0で右へ50px移動 */ .v-enter, .v-leave-to { opacity: 0; transform: translateX(50px); }
結果
03 リストの並びが移動するトランジション
クリックしたらシャッフルする
<div id="app"> <!-- ボタンを押してリストが増減するとき、アニメーションする --> <transition-group> <li v-for="item in dataArray" v-bind:key="item">{{ item }}</li> </transition-group> <button v-on:click="sortData">ソートする</button> <button v-on:click="shuffleData">シャッフルする</button> </div>
new Vue({ el: "#app", data: { dataArray: ['one', 'two', 'three', 'four', 'five'] }, methods: { sortData: function () { this.dataArray.sort(function (a, b) { if (a < b) return -1; if (a > b) return 1; return 0; }); }, shuffleData: function () { var buffer = []; var len = this.dataArray.length; for (let i = 0; len > 0; len--) { var r = Math.floor(Math.random() * len); buffer.push(this.dataArray[r]); this.dataArray.splice(r, 1); } this.dataArray = buffer; } } });
/* 移動トランジションにかか秒数 */ .v-move { transition: 0.25s; }
結果