プラグイン・JQuery不使用! Nuxt.jsでイメージスライダーを自作してみた

こんにちは。株式会社まちいろのフロントエンドエンジニア(仮)の日高です。
最近、案件でNuxt.js、Vue.jsを扱うことが増えてきました。

Nuxt.jsでたまに困るのが、プラグインJSがうまく動かないパターンです。相性なのかうまく動かないパターンが何回かありました。
また、コードはJavaScriptで記載しているので、JQueryが混在することに違和感を感じることも…

そこで、どうにかNuxt.jsとCSSを駆使してイメージスライダーができないかな?と試してみました。

Nuxt.jsコード

イメージスライダーで表示する画像をデータに格納しておきます。

data: {
  imgSlider:['/img/no1.png','/img/no2.png','/img/no3.png']
}

画面側はNuxt.jsのtransitionを使ってコードを記載します

<transition name="slider">
    <div class="l_slider" v-for="e in slider" :key="e.id">
      <p class="img" :style="background-image: url(${e.imgUrl})"></p>
    </div>
</transition>

イメージスライダーなのでX秒後に画像を差し替えるようさらにJSを組んでいきます。

data: {
  slider:['/img/no1.png','/img/no2.png','/img/no3.png'],
  visible_content: 0,
  timer: null
}
methods: {
  onTimer() {
    // 8秒間隔でnextSlider関数を呼び出し
    this.timer = setInterval(() => { this.nextSlide(); }, 8000);
  },
  nextSlide() {
    // 現在の表示位置(visible_content)を1つずつカウントアップしていく
    this.visible_content = this.visible_content < this.slider.length - 1
                            ? (this.visible_content += 1) : 0;
  }
},
mounted() {
  // ページをmountする際にタイマーを開始
  this.onTimer();
},

ここまで書いたら、sliderで設定した画像が8秒ごとに表示されるのが確認できます。スライダーっぽいアニメーションは全くなく、ただ表示が切り替わるのみです。

アニメーションをつける

イメージスライダーのアニメーションはCSSで作り込んでいきます。

.l_slider {
  height: 100vh;
  width: 100%;
  overflow: hidden;
  .img {
    height: 100%;
    width: 100%;
    background-size: cover;
    animation: slider ease-in 0.7s forwards, scale ease-in 20s 1s forwards,
        opacity ease-in 1s 7.5s forwards reverse;
  }
}
@keyframes slider {
  0% {
    opacity: 0;
    transform: translateX(100%);
  }
  100% {
    opacity: 1;
    transform: translateX(0);
  }
}
@keyframes scale {
  0% {
    transform: scale(1);
  }
  100% {
    transform: scale(1.5);
  }
}
@keyframes opacity {
  0% {
    opacity: 0;
  }
  100% {
    opacity: 1;
  }
}

.imgのanimationのみで動きは表現しています。
slideで右から左へ、scaleで拡大、opacityで登場これらを組み合わせてスライダーを表現しています。

transitionのプロパティを応用する

transitionは状態によってCSSクラスが書き換わります。

enterとleaveを組み合わせることで例えば以下のようなCSSも作ることができます。

.slide-enter-active {
  transition: all 3s;
}
.slide-enter {
  opacity: 0;
}
.slide-enter-to {
  opacity: 1;
}

Nuxt.js × CSS

transition、CSSアニメーション、JS(timer)を駆使すれば、イメージスライダーはJSプラグインやJQueryを使う必要が無くなります。

CSSを変えることで、レスポンシブにも対応できます。
スライダー速度やアニメーション速度も自由に変更することが可能です。

アニメーションCSSはkeyframesをテンプレート化しておくと、再利用可能で便利になります。
私は、opacity、scaleは必ず先にkeyframesとして準備しておきます。

この記事が気に入ったらサポートをしてみませんか?