jtk

【学習メモ】動かして学ぶ!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);
}

結果

f:id:jotaki:20190118103620p:plain

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);
}

結果

f:id:jotaki:20190118103623p:plain

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;
}

結果

f:id:jotaki:20190118103629p:plain