押した瞬間、動き始める。CSSボタンデザイン「ローディング」5選

当ページのリンクには広告が含まれています。
CSSボタンデザイン ローディング 5選

フォームの送信ボタン、決済ページの確定ボタン、非同期処理を伴うアクションボタン——これらに「押した後、何も起きていないように見える」状態が続くと、ユーザーは不安になってもう一度押してしまいます。二重送信、重複処理、エラーへの連鎖。「ボタンにローディング状態を持たせる」だけで防げるトラブルが、現場では意外と多い。UXというより、もはや防御策のひとつです。

今回はCSSのみで実装したローディング付きボタンを5種類紹介します。JavaScriptは使っていないので、デモはそのままコピー可能です。WordPress(SWELL)にも貼り付けて使えます。実務での使い方はシンプルで、JavaScriptでボタンに .is-loading などのクラスを付け外しするだけ。たとえばこんなイメージです。

btn.addEventListener('click', () => {
  btn.classList.add('is-loading');
  fetch('/api/submit').finally(() => {
    btn.classList.remove('is-loading');
  });
});

CSS側では .is-loading .btn-spin のようにクラスを組み合わせれば、ローディング状態の発動・解除を完全にJSに委ねられます。今回のデモはすべて「常にローディング状態を表示」していますが、実装への橋渡しとして参考にしてください。

目次

Spin Border(スピン・ボーダー)

ローディングの「定番中の定番」とも言えるデザインです。ボタンのテキストを非表示にしつつ、中央に丸いスピナーが回転し続けます。::after 疑似要素にborder-top-colorだけを白にしたボーダーを置き、@keyframes で360度回転させる——実装はシンプルですが、ブラウザ互換性が高く実務での採用率ナンバーワンのスタイルだと思います。「これで十分じゃないか」と思えるくらい、主張が強すぎない丁度いい動きです。

See the Pen Spin Border by BaseKENT (@basekent) on CodePen.

調整方法

  • スピナーのサイズ: width: 22px; height: 22px の数値を変えると大小を調整できます。margin の値もセットで変えてください(-(size/2)px)。
  • 回転速度: animation: btn-spin 0.7s の秒数を増やすとゆっくり、減らすと高速回転になります。
  • ボタン色: background: #3b82f6 をプロジェクトのメインカラーに変えてください。

Dot Loader(ドット・ローダー)

3つの点が波打つように上下する、チャット系アプリの「入力中…」インジケーターでおなじみのスタイルです。::after 疑似要素1つでセンターの点を作り、box-shadow で左右に2つの点を追加。@keyframes で位置を変化させることで、3点が独立してアニメーションしているように見せています。LLMのレスポンス待ち画面や、AIが「考えている」状態の演出として組み込んでいる現場が最近増えています。「誰かが作業している感」を出すのに適したデザインです。

See the Pen Dot Loader by BaseKENT (@basekent) on CodePen.

調整方法

  • ドット間隔: box-shadow: -20px 0 0 #fff, 20px 0 0 #fff20px を変えると3点の間隔を調整できます。
  • バウンスの高さ: @keyframes 内の translateY(-7px) の値を大きくすると跳ね幅が広がります。
  • ドットカラー: background: #fffbox-shadow の色を同じ値に変えてください。

Progress Bar(プログレス・バー)

ボタン下部にバーが左から伸びていく、進捗を「棒グラフ的に」見せるデザインです。テキストは「Loading…」のまま表示され、処理の進行感を帯状に伝えます。ファイルアップロードやデータ送信のように「完了まで時間がかかる」ことが想定されるボタンに最適。::afterwidth を0%から100%へアニメーションさせるだけで実現できます。「いつ終わるか分からない」不安を「少しずつ進んでいる」安心に変えるデザイン、というと大げさですが、実際にユーザーテストで離脱が下がった経験があります。

See the Pen Progress Bar by BaseKENT (@basekent) on CodePen.

調整方法

  • バーの高さ: height: 4px6px3px に変えると太さが変わります。
  • アニメーション速度: animation: btn-progress 1.8s の秒数で1サイクルの長さを調整できます。長くするとゆっくり伸びます。
  • バーの色: background: rgba(255, 255, 255, 0.8) の透明度(0.8)を下げると控えめな表示になります。

Pulse Ring(パルス・リング)

ボタンの外枠からリングが広がり、フェードアウトしていく脈動エフェクトです。生き物の「鼓動」や「呼吸」を想起させる動きで、「ここに注目してほしい」というトリガーとしても機能します。::before 疑似要素を同じ形・同じ色でボタンの外に重ね、scaleopacity をアニメーションさせるだけ。ローディングというより「アクションを促す」用途で使っても映えます。送信ボタンに常時アニメーションとして付けておく使い方もありです。

See the Pen Pulse Ring by BaseKENT (@basekent) on CodePen.

調整方法

  • 広がりの大きさ: @keyframes 内の scale(1.5) の値を大きくすると、リングがより広い範囲まで広がります。1.2 にすると控えめに。
  • 繰り返し速度: animation: btn-pulse 1.4s の秒数で脈動の間隔を調整できます。
  • リングの色: border: 2px solid #f59e0b の色をボタンの background と同じ値にするのが基本です。

Shimmer(シマー)

暗めの背景に光沢が左から右へ流れ続ける、スケルトンローディングのような静かな待機表現です。「無効化されたボタン」の雰囲気を保ちながら、動きで「何かをしている」ことをさりげなく伝えます。派手な動きを避けたいダーク系サイトや、ミニマルなUIとの相性が抜群。::after に細長いグラデーションを置き、左から右へ流すだけの軽量実装です。個人的には、SkeletonローディングとShimmerを組み合わせてページ全体のロード待ちを演出するのが好きで、このボタンはその流れで使うことが多いです。

See the Pen Shimmer by BaseKENT (@basekent) on CodePen.

調整方法

  • 光の幅: .btn-shimmer::afterwidth: 60% を変えると光のサイズが変わります。細くしたい場合は 30% 程度に。
  • 流れる速度: animation: btn-shimmer 1.6s の秒数を短くするとすばやく流れます。
  • 光の強度: rgba(255, 255, 255, 0.08) の最後の数値(透明度)を上げると光がより目立ちます。0.15 あたりが見やすいバランスです。

Unlock Your Creativity

今回紹介したCSSカスタマイズは、ほんの一例に過ぎません。 Webデザインの可能性は、コードひとつで無限に広がります。

Ex-TORANOMAKIには、あなたのサイトを「他とは違う」存在にするためのCSSテクニックを多数紹介しています。 ありきたりなデザインでは満足できないなら、ぜひ他のカスタマイズもチェックしてみてください。

A created this document

実務で使える「動きのあるWebデザイン」をテーマに、コピペで実装できるCSSアニメーションやコードスニペットを発信中。
また、制作環境をアップデートするガジェットやデスク周りのツールもレビューしています。
効率と心地よさを追求するクリエイターのための情報をアーカイブします。

目次