CSS を利用したローディングアニメーションのサンプルは既に山ほど Web 上に公開されていますが、別件でコーディングをしていた流れで、たまたまローディングアニメーションのコードも適当に作ってみたので、いくつかのサンプルと共に、jQuery や外部モジュールも利用せず、実際に利用するための簡易的な方法をご紹介します。
まずは、今回適当に作成したローディングアニメーションのデモをご覧ください。
See the Pen
Simple CSS Spinner valiation by digistate (@digistate)
on CodePen.
この HTML と CSS を基礎にして、以下に実際に利用するための手順をまとめます。
HTML の構造
各ローディングアニメーション要素の HTML の構造は至ってシンプルです。
<div class="box"> <!-- type1 〜 type8 はお好みで --> <div class="spinner type1"> <span>Loading...</span> </div> </div>
CSS
アニメーションの元となる .spinner
要素の CSS は、以下を基本とします。
/* ローディングアニメーション */ .spinner { position: absolute; top: 50%; left: 50%; -webkit-transform: translate(-50%, -50%); transform: translate(-50%, -50%); -webkit-transform-origin: center; transform-origin: center; width: 120px; height: 120px; } /* Loading テキスト */ .spinner span { position: absolute; top: 50%; left: 50%; -webkit-transform: translate(-50%, -50%); transform: translate(-50%, -50%); font-size: 12px; }
今回のデモでは、8種類のアニメーションパターンがありますが、例えば1番目のアニメーションであれば、上記のベースの CSS に加えて以下を追加します。
/* 1番目のアニメーションの場合 */ .spinner.type1 { border-radius: 50%; border-width: 8px; border-style: solid; border-color: #fff rgba(255, 255, 255, 0.12) rgba(255, 255, 255, 0.12); /* ローディング要素のアニメーションを指定 */ -webkit-animation: spinner1_1 1.5s infinite linear forwards; animation: spinner1_1 1.5s infinite linear forwards; } .spinner.type1 span { /* Loading テキストのアニメーションを指定 */ animation: spinner_loading_text 1.5s infinite linear forwards reverse; } /* ローディング要素のアニメーション内容 */ @-webkit-keyframes spinner1_1 { 0% { -webkit-transform: translate(-50%, -50%) rotate(0); transform: translate(-50%, -50%) rotate(0); } 100% { -webkit-transform: translate(-50%, -50%) rotate(360deg); transform: translate(-50%, -50%) rotate(360deg); } } @keyframes spinner1_1 { 0% { -webkit-transform: translate(-50%, -50%) rotate(0); transform: translate(-50%, -50%) rotate(0); } 100% { -webkit-transform: translate(-50%, -50%) rotate(360deg); transform: translate(-50%, -50%) rotate(360deg); } } /* Loading テキストのアニメーション内容 */ @-webkit-keyframes spinner_loading_text { 0% { opacity: 1; -webkit-transform: translate(-50%, -50%) rotate(0deg); transform: translate(-50%, -50%) rotate(0deg); } 50% { opacity: 0; -webkit-transform: translate(-50%, -50%) rotate(180deg); transform: translate(-50%, -50%) rotate(180deg); } 100% { opacity: 1; -webkit-transform: translate(-50%, -50%) rotate(360deg); transform: translate(-50%, -50%) rotate(360deg); } } @keyframes spinner_loading_text { 0% { opacity: 1; -webkit-transform: translate(-50%, -50%) rotate(0deg); transform: translate(-50%, -50%) rotate(0deg); } 50% { opacity: 0; -webkit-transform: translate(-50%, -50%) rotate(180deg); transform: translate(-50%, -50%) rotate(180deg); } 100% { opacity: 1; -webkit-transform: translate(-50%, -50%) rotate(360deg); transform: translate(-50%, -50%) rotate(360deg); } }
次に、このデモの構造を利用して実際にローディング表示として実装する簡単な方法をご紹介します。
実際にページの「読み込み中」要素として利用してみる
このローディングアニメーションを、Webページにアクセスした際に、最初に表示させてページ読み込み後に自動的に消えるようにする場合は、例えば以下のようにします。
HTML
実際に利用するローディングコンテンツの要素は1つのみなので、 type1 〜 type8 の中から適当に1つ選択し .spinner
セレクタに繋げてセットします。
また、ラッパー要素の .box
には、JavaScript で操作するために適当な ID をつけておきます(以下では #my-spinner
)。
<div id="my-spinner" class="box"> <!-- type1 〜 type8 はお好みで --> <div class="spinner type1"> <span>Loading...</span> </div> </div>
このHTMLを、<body>
の直後か </body>
の直前に挿入しておきます。
CSS
ローディングコンテンツ(.box
)の表示は、フルスクリーンで表示させるため、上記デモのものではなく以下のようにしておきます。
.box{ position: fixed; top: 0; left: 0; width: 100vw; height: 100vh; z-index: 9999; -webkit-transition: all 1.2s ease; /* 1.2秒でフェードアウト */ transition: all 1.2s ease; color: #fff; /* ローディングアニメーションカラー */ background-color: #333; /* 背景カラー */ }
読み込み完了時には、JavaScript からフルスクリーン表示を消すための class を挿入します。
これについてのスタイルも用意します。
/* ローディング表示を消すための定義 */ .box.loaded{ opacity:0; visibility:hidden; pointer-events:none; }
.spinner
等の他の要素の CSS はデモのものをそのまま利用できます。
JavaScript
JavaScript では、ページ内のすべてのリソース(DOMツリー、画像、その他外部リソース等)の読み込み完了時にローディング表示を消すようにします。
window.onload = function() { let spinner = document.getElementById('my-spinner'); // .box に .loaded を追加してローディング表示を消す spinner.classList.add('loaded'); }
たったこれだけで、外部モジュールも必要とせず、自作でローディングアニメーション表示ができます。