Nuxt ローディング画面の作り方

プログラミング

今回は、nuxtでローディング画面を作る方法について紹介します。

NuxtやVueを使うと簡単にローディング画面を作ることができます。

読み込まれたときの処理は書きを利用することで処理ができます。

mounted() {
    this.$nextTick(() => {
      setTimeout(() => {
        //読み込まれたときの処理
      }, 700)
    })
  },
  

nuxtのドキュメント

Loading
Out of the box, Nuxt gives you its own loading progress bar component that's shown between routes. You can customize it, disable it or even create your own load...

vueのドキュメント

API — Vue.js
Vue.js - The Progressive JavaScript Framework

上記を参考にして作成をしているので、詳しくは上記を参考にしてもらえればいいかと思います。

環境とバージョンについて

ローディング画面の作り方

nuxtにはデフォルトでローディングアニメーションがあるのでそちらを使ってもいいんですが今回は自作したローディング画面を作る方法について紹介をします。

今回は読み込んだときに毎回ローディング画面を表示させたいのでデフォルトのレイアウトにローディングの記述を書いていきます。

流れとしては

  1. ローディング中に表示させるための画面を作成
  2. デフォルトのレイアウトを作成
  3. デフォルトのレイアウトで要素の読み込みが終わるまでリロードの画面を表示

の流れになります。

ローディング中に表示させる画面の作成

まずはじめに、ローディング中に表示させる、アニメーションの画面を作成します。

コンポーネントの中でLoading.vueのコンポーネントを作成します。

See the Pen
Loading
by xhisashix (@xhisashix)
on CodePen.

上記のようなイメージのアニメーションを作成します。

components/ui/Loading.vue

<template lang="pug">
  .load
    .letter-holder
      .l-1.letter L
      .l-2.letter o
      .l-3.letter a
      .l-4.letter d
      .l-5.letter i
      .l-6.letter n
      .l-7.letter g
      .l-8.letter .
      .l-9.letter .
      .l-10.letter .
  </template>
  
  <script>
  export default {}
  </script>
  
  <style lang="stylus">
  .load
    width: 100vw
    height: 100vh
    position: fixed
    background: #fff
    z-index 100
    top 0
    left: 0
    display: flex
    align-items: center
    justify-content: center
    .letter-holder
      padding 16px
      width: 200px
      height: 200px
      display: flex
      align-items: center
      justify-content: center
      margin: auto
    .letter
      font-size 24px
      margin-left: 5px
      font-weight bold
      color #000
      animation-name loadingF
      animation-duration 1.6s
      animation-iteration-count infinite
      animation-direction linear
    .l-1
        animation-delay 0.48s
    .l-2
        animation-delay 0.6s
    .l-3
        animation-delay 0.72s
    .l-4
        animation-delay 0.84s
    .l-5
        animation-delay 0.96s
    .l-6
        animation-delay 1.08s
    .l-7
        animation-delay 1.2s
    .l-8
        animation-delay 1.32s
    .l-9
        animation-delay 1.44s
    .l-10
        animation-delay 1.56s
  
  @keyframes loadingF
    0%
      opacity 0
    100%
      opacity 1
  </style>
  

デフォルトのlayoutを作成

layouts/default.vue

<template lang="pug">
    div
      .main
        Header(ref="reference")
        .nuxt
          Nuxt
        Footer
      Loading(v-if="isShow")
  </template>
  
  <script>
  import Loading from '~/components/ui/Loading.vue'
  export default {
    components: {
      Loading,
    },
    data() {
      return {
        isShow: true,
      }
    },
  </script>
  
  <style lang="stylus">
  div
    .nuxt
      max-width 1280px
      margin 0 auto
  </style>
  

.mainの要素をは最初は非表示にしておき、ローディング画面を表示させておくようにデータを設定します。

ここまでで、ローディングの画面のみ表示されていればOKです。

今の段階でローディング画面だけが表示されていない場合は、どこかがおかしいのでもう一度確認してみてください!

コンポーネントの読み込みが正常にできていないことがあるので、コンポーネントの読み込みを確認してみてください。

デフォルトのレイアウトで要素の読み込みが終わるまでリロードの画面を表示

画面が読み込まれるまでの処理は、一番はじめにも紹介しましたが、下記の方法になります。

mounted() {
    this.$nextTick(() => {
      setTimeout(() => {
        this.isShow = false
      }, 700)
    })
  },
  

処理の内容としては、要素がすべて読み込まれてから、0.7秒後にデータの変更を行います。

<template lang="pug">
    div
      .main
        Header(ref="reference")
        .nuxt
          Nuxt
        Footer
      transition(name="home")
        Loading(v-if="isShow")
  </template>
  
  <script>
  import Loading from '~/components/ui/Loading.vue'
  export default {
    components: {
      Loading,
    },
    data() {
      return {
        isShow: true,
      }
    },
    mounted() {
      this.$nextTick(() => {
        setTimeout(() => {
          this.isShow = false
        }, 700)
      })
    },
  }
  </script>
  
  <style lang="stylus">
  div
    .nuxt
      max-width 1280px
      margin 0 auto
  .home-enter-active, .home-leave-active
    transition: opacity .7s
  .home-enter, .home-leave-active
    opacity: 0
  </style>
  

要素が読み込まれたときにisShowにtrueを入れることで、ローディン画面を非表示にします。

こうすることで、要素が読み込まれるまではローディング画面が表示され、読み込まれたタイミングでローディング画面が表示になりメインの要素が表示されます。

このとき、v-ifなどを使っていると、パチっと画面が切り替わって少しダサくなるので、

transitionを使うことで切り替えるときにゆったりしたアニメーションをつけることができます

まとめ

  1. ローディング中に表示させるための画面を作成
  2. デフォルトのレイアウトを作成
  3. デフォルトのレイアウトで要素の読み込みが終わるまでリロードの画面を表示


プログラミング
スポンサーリンク
スポンサーリンク
e-logsをフォローする
スポンサーリンク
eLogs

コメント

タイトルとURLをコピーしました