icon
Let's create! WordPressサイト制作とメンテ/エラー対応から、PHP/CSS/javascriptプログラミング、動画・音・イラスト等制作まで扱うコラム

【vue.js & element plus】ページ読み込み時のくるくる回るローディング画面の作成

更新: 2025/05/22 3464文字

今回は、最近よく使っているvue.js & element plusをつかって、ページ読み込み時のくるくる回るローディング画面を作ってみたいと思います。このフレームワークでも調べると、いろいろなことができることがわかります。さっそく、パラメータやコード・動作サンプルを確認していきましょう。

element plusローディングのドキュメントは?

element plusのサイト上にもローディングのドキュメントはありました。ただし全部英語です。また、TypeScript や拡張子vueのファイル内にtemplateとして書いてあったりするので(コマンド叩いて環境構築してるような場合は気になりませんが)、直接htmlで構築したページに、ちょっと使ってみようというときにはわかりにくいかも。

そいういうわけで今回もhtml&javascriptでやってみます。そのほか表示に関わるパラメータもあるので、使いそうなものの説明もつけてみました。データ型もつけてて、booleanはtrue/false、stringは文字列で記載します(中にはHTMLElement型のもの、Function型のものもあるようです)。

fullscreen
(フルスクリーン)
boolean
(Default:false)
lock
(画面ロック。true背景操作不可)
boolean
(Default:false)
text
(ローディング時テキスト)
string
(Default:なし)
background
(背景色)
string
(Default:なし)
customClass
(カスタムクラス名)
string
(Default:なし)

後述しますが、今回はlock,text,backgroundあたりを使っていきます。(英語ですけど)公式ドキュメントも確認してみてください。

vue.js & element plusローディング画面 コードとポイント

コードはこんな感じになりました。CSSなどで直接関係ない部分は省略してます。cdnでロードしているスクリプトは『element-plus/dist/index.css,vue@3,element-plusの3つ』です。ローディングをマウントするid要素として『div id="appLoading"』をつけておきました。CSSのところからみていきますか。

body, html {overflow-x: hidden;}
#appLoading {opacity: 0; transition: 2.5s ease;}
#appLoading.loaded {opacity: 1;}

#appLoadingはローディングをマウントしている要素です。ここはサイト全体を囲んでいて、最初はopacity:0(透明)で、transition: 2.5sは2.5秒で変化です。『#appLoading.loadedは、ローディングが終わった時loadedがセットされる・opacity:1で不透明になる・見える』という感じ。overflow-x: hidden;は、ローディング終了時に、横に少しカクッと動くのを避けるために入れました。
次はjavascript部分見ていきますね。まずは・・・

const { createApp, onMounted } = Vue;
const { ElLoading } = ElementPlus;

VueからcreateApp・onMounted、ElementPlusからElLoadingといった搭載ファンクションを呼び出します。vue2のときはcreateAppじゃなくて『new Vue』でしたね。

const loadingInstance = ElLoading.service({
    lock: true,
    text: 'Now loading…',
    background: 'rgba(255, 255, 255, 1.0)',
});

そして、ローディング機能のインスタンスを設定。lock,text,backgroundはここで使いました。『画面ロック・Now loading…テキスト表示・背景白』という設定です。

const App = {
  setup() {return {};}
};

Appは実際の処理がないので、省略できます。このブロックを省略するときはcreateApp()と書きます。const Appが無いのにcreateApp(App)と書いてしまうと参照できなくてエラーになります。

window.addEventListener('load', () => {
  setTimeout(() => {
    if (loadingInstance) loadingInstance.close();
    document.getElementById(‘appLoading’).classList.add('loaded');
  }, 3000);
});

次のブロックですが、サンプルサイトが軽すぎてすぐロードが終わるのでsetTimeoutで3秒遅らせています。また、window.addEventListenerのloadのほうがDOMContentLoadedより後に発火するそうです(domツリーより後になる)。
loadingInstanceをcloseして、document.getElementByIdでid要素のappLoading取得してクラスにloadedつける、という処理になります。

createApp(App).use(ElementPlus).mount('#appLoading');

で、最後にvueアプリ作成・ElementPlusを使えるように・id要素のappLoadingにマウントして完了です。

vue.js & element plusローディング画面 表示例

では、動作確認をしてみますか。 ページ読み込み時にくるくる回ってローディング。

ローディング終了すると、徐々にサイトが見えてきて・・・

サイトが見えるようになる、という流れです。実際の動作サンプルは、以下のurl部分に置いていますので、ロードして動作をご確認ください。

あとがき・まとめ

  • vue.js & element plusで、ローディング画面も作ることができる
  • loadingInstanceでテキストや背景色設定し、ロード終了後にクラス付与という流れ
  • window.addEventListenerのloadは、domツリーできたさらに後に発火する

まとめると、こんなところでしょうか。理屈もわかってきたので、次回自分のサイトをあげるときは、この機能も使ってみたいと思います。


【カテゴリ】- javascript/jQuery、その他
【タグ】-

関連記事