どうも!かけちまるです!
例えば写真家さんのポートフォリオサイトなどWebサイトに画像をたくさん使うとき、ページの読み込みに時間がかかってしまう場合があると思います。
サイトが表示されても画像の読み込みが遅れて画像が見れなくてはユーザーはそのページを見る気が失せてしまいます。
そんな時に画像の読み込み進捗をバーの長さと%で表現するオープニングアニメーションを実装すれば画像が見れない問題は解決されると思います。
プログレスバーとかプログレス表示機能とかいいますかね。
プログレス(progress)は日本語で「進捗」という意味です。
ちなみに読み込み進捗を数値%で表した方がユーザーはあと大体どのくらい待ったらいいかがわかるので親切です。
このオープニングアニメーションでは画像の読み込み状況を把握するimagesLoadedというJavaScriptライブラリを使用します。
imagesLoadedを使うことによって画像が総数に対して何枚読み込まれているか知ることができます。
他にもできることはあるみたいですけど今回はどのくらい画像が読み込まれているかという点でimagesLoadedを使います。
この記事では、
解説していきます。
imagesLoadedの公式サイト:https://imagesloaded.desandro.com/
こんなのを作ります。
デモサイト
初めに必要そうな処理をまとめていきましょう。
今回のプログレス表示で必要そうな処理は大きく分けて以下の3点です。
body
内の画像がどのくらい読み込まれているか常に監視する処理body
内の画像の読み込み進度をテキストとバーに常に反映し続ける処理body
内の画像の読み込みが終了した後オープニングアニメーションを非表示にする処理では、次のセクションから実際にソースコードを書いていきます。
前のセクションではプログレス表示に必要な処理をまとめました。
このセクションでは、jQueryを読み込んでいきます。
すでに読み込んでいる方はjQueryの読み込みは飛ばしてください。
CDNを使ってjQueryを読み込みます。
以下のコードをhead
内にコピペでOK!
HTMLコピー<script src="https://code.jquery.com/jquery-3.5.1.min.js" integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=" crossorigin="anonymous"></script>
あなたがこの記事を読んでいる頃には上のコードが古くなっているかもしれないのでjQuery CDNの取得先ものせておきますね。
jQuery CDN:https://code.jquery.com/
jQueryは読み込めました?
そしたらimagesLoadedライブラリを読み込んでいきましょう。
これもCDNで。
以下のコードをjQueryよりも下にコピペでお願いします。
HTMLコピー<script src="https://unpkg.com/imagesloaded@4/imagesloaded.pkgd.min.js"></script>
今のところhead
内はこんな感じ
HTMLコピー<script src="https://code.jquery.com/jquery-3.5.1.min.js" integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=" crossorigin="anonymous"></script> <script src="https://unpkg.com/imagesloaded@4/imagesloaded.pkgd.min.js"></script>
じゃあ次!HTMLとCSSいきます!
imagesLoadedライブラリが読み込めたところでHTMLとCSSを書いていきましょう!
HTMLは最初%表示のところは0%で表示してください。
まぁ0%書かなくても最終的に動きは同じだけど分かりやすいと思って。
HTMLコピー<div class="op_container"> <div class="op_inner"> <div class="op_text">0%</div> <div class="op_ber"></div> </div> </div>
CSSは.op_ber
のwidth
を0%で書いてください。
これも書いても書かなくてもどっちでもいいです。
CSSコピー.op_container{ background-color: #000; width: 100%; height: 100%; position: fixed; top: 0px; left: 0px; } .op_inner{ width: 100%; position: absolute; top: 50%; left: 50%; transform: translate(-50%,-50%); } .op_text{ color: #fff; font-size: 16px; text-align: center; } .op_ber{ background-color: #fff; margin-top: 5px; width: 0%; height: 1px; }
以下の3つは好きなように色を変えてください。
.op_container
のbackground-color
.op_text
のcolor
.op_ber
のbackground-color
次のjQueryを書くとこからちょっと難しいのでがんばってください!
ここからちょっと難しいのです。
でも、ソースコード内にメモ程度ですが解説をいれてるので参考にしてください。
ぱっぱらぱな人はとりあえずコピペで動くと思います。
動かなかったら以下の3点を確認してみてください。
body
内にimg
タグがあるかソースコードはこちら!
JavaScriptコピー$(function(){ // プログレス表示の関数を呼び出す imagesProgress(); // 画像の読み込み状況をプログレス表示 function imagesProgress(){ // imagesLoadedライブラリでbody要素内の画像の読み込み状況を監視 var imgLoad = imagesLoaded('body'); // body要素内の画像の総数を変数へ格納 var imgTotal = imgLoad.images.length; // 読み込みが完了した画像の枚数を格納する変数 var imgLoaded = 0; // .op_berのwidthの値を格納する変数 var current = 0; // 1秒に60回のペースで画像の読み込み状況をチェック progressTimer = setInterval(updateProgress, 1000 / 60); // imagesLoadedライブラリを利用し、画像が読み込まれるごとにimgLoadedを加算 imgLoad.on('progress', function () { imgLoaded++; }); // 画像の読み込み状況をもとに // .op_textのテキストの値と // .op_berのwidthの値を変更します // このupdateProgress関数は上に書いたsetInterval()により1秒に60回のペースで呼び出されます function updateProgress(){ // 画像が何%読み込まれたか var target = (imgLoaded / imgTotal) * 100; // currentとtargetをもとにイージングをかける // 100に近づくにつれ遅くなる current += (target - current) * 0.1; // .op_textのテキストを反映 // Math.floor()関数で小数点以下を切り捨て $('.op_text').text(Math.floor(current) + '%'); // .op_berのwidthを反映 $('.op_ber').css({width: current + '%'}); // アニメーション終了処理 if(current >= 100){ // clearInterval()で上に書いたsetInterval()を解除する clearInterval(progressTimer); // ここに画像が読み込み終わった後の処理を書く setTimeout(function(){ $('.op_container').fadeOut(); }, 1000); } // currentが99.9よりも大きければ100としてアニメーション終了処理へ if(current > 99.9){ current = 100; } } } });
とりあえず動きました?
こんな感じになってればOK!
デモサイト
画像を増やしたり減らしたり試してみるとよいかと思います。
おわり
フィードバックを送信
記事についてのフィードバックはTwitterかお問い合わせフォームから受け付けております。