【CSSのみ】コピペで使える!シンプルで軽いローディングアニメーション3選
データの読み込み中や画面遷移の際に表示される「ローディングアニメーション」。 昔はGIF画像などがよく使われていましたが、現在はパフォーマンスの観点から、軽量で画質も劣化しないCSSアニメーションで実装するのが主流です。
複雑なライブラリやJavaScriptを使わなくても、CSSの animation プロパティと @keyframes を組み合わせるだけで、オシャレで実用的なローディングUIを作ることができます。
今回は、そのままコピペして使える、シンプルで汎用性の高いローディングアニメーションを3つご紹介します!
デモ動作
See the Pen CSSで作るシンプルなローディングアニメーション3選 by mikanbako (@mikanbako) on CodePen.
demo: CSSで作るローディングアニメーション3選
実装コードの紹介
【HTML】
<div class="l-wrap">
<h2>CSSローディングアニメーション 3選</h2>
<div class="p-loader-list">
<!-- 1. シンプルスピナー(王道の回転) -->
<div class="p-card">
<h3 class="p-card__title">1. シンプルスピナー</h3>
<div class="p-demo-box">
<div class="c-spinner"></div>
</div>
</div>
<!-- 2. ドットバウンス(オシャレな待機) -->
<div class="p-card">
<h3 class="p-card__title">2. ドットバウンス</h3>
<div class="p-demo-box">
<div class="c-dots">
<div class="c-dots__item"></div>
<div class="c-dots__item"></div>
<div class="c-dots__item"></div>
</div>
</div>
</div>
<!-- 3. パルス(波紋のように広がる) -->
<div class="p-card">
<h3 class="p-card__title">3. パルス(波紋)</h3>
<div class="p-demo-box">
<div class="c-pulse"></div>
</div>
</div>
</div>
</div>
【CSS】
.l-wrap {
color: #3e3e3e;
padding: 40px 20px;
max-width: 900px;
margin: 0 auto;
}
h2 {
text-align: center;
font-size: 16px;
color: #1bb4d4;
margin-bottom: 40px;
}
/* レイアウト・カード装飾 */
.p-loader-list {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
gap: 30px;
}
.p-card {
background: #fff;
padding: 30px;
border-radius: 12px;
box-shadow: 0 4px 15px rgba(0,0,0,0.05);
text-align: center;
}
.p-card__title {
font-size: 18px;
color: #666;
margin-bottom: 24px;
}
.p-demo-box {
display: flex;
justify-content: center;
align-items: center;
height: 100px;
}
/* =========================================
1. シンプルスピナー(回転)
========================================= */
.c-spinner {
width: 50px;
height: 50px;
border: 5px solid #e0e0e0; /* 薄いグレーの枠線 */
border-top-color: #1bb4d4; /* 上だけ青色にする */
border-radius: 50%;
/* 1秒かけて一定速度(linear)で無限に回転 */
animation: spin 1s linear infinite;
}
@keyframes spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
/* =========================================
2. ドットバウンス(順番に跳ねる)
========================================= */
.c-dots {
display: flex;
gap: 8px;
}
.c-dots__item {
width: 16px;
height: 16px;
background-color: #1bb4d4;
border-radius: 50%;
animation: bounce 0.6s infinite alternate; /* alternateで上下の往復を滑らかに */
}
/* 2つ目と3つ目のアニメーション開始を少しずつ遅らせる */
.c-dots__item:nth-child(2) { animation-delay: 0.2s; }
.c-dots__item:nth-child(3) { animation-delay: 0.4s; }
@keyframes bounce {
0% { transform: translateY(0); }
100% { transform: translateY(-15px); }
}
/* =========================================
3. パルス(波紋のように広がる)
========================================= */
.c-pulse {
width: 50px;
height: 50px;
background-color: #1bb4d4;
border-radius: 50%;
animation: pulse 1.5s ease-out infinite;
}
@keyframes pulse {
0% {
transform: scale(0.5);
opacity: 1;
}
100% {
transform: scale(1.5);
opacity: 0; /* 広がりながら透明になって消える */
}
}
コードの解説・アニメーションのポイント
シンプルスピナー(transform: rotate)

/* =========================================
1. シンプルスピナー(回転)
========================================= */
.c-spinner {
width: 50px;
height: 50px;
border: 5px solid #e0e0e0; /* 薄いグレーの枠線 */
border-top-color: #1bb4d4; /* 上だけ青色にする */
border-radius: 50%;
/* 1秒かけて一定速度(linear)で無限に回転 */
animation: spin 1s linear infinite;
}
@keyframes spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
border で丸い枠線を作り、1辺だけ(今回は border-top-color)色を変えます。あとは @keyframes で0度から360度まで回転させるだけです。 ポイントは、アニメーションの速度変化を linear(一定)にすることです。これにより、ガタつきのないスムーズな回転になります。
ドットバウンス(animation-delay)

/* =========================================
2. ドットバウンス(順番に跳ねる)
========================================= */
.c-dots {
display: flex;
gap: 8px;
}
.c-dots__item {
width: 16px;
height: 16px;
background-color: #1bb4d4;
border-radius: 50%;
animation: bounce 0.6s infinite alternate; /* alternateで上下の往復を滑らかに */
}
/* 2つ目と3つ目のアニメーション開始を少しずつ遅らせる */
.c-dots__item:nth-child(2) { animation-delay: 0.2s; }
.c-dots__item:nth-child(3) { animation-delay: 0.4s; }
@keyframes bounce {
0% { transform: translateY(0); }
100% { transform: translateY(-15px); }
}
3つの丸を並べ、transform: translateY で上下に動かします。 ポイントは animation-delay の指定です。2つ目、3つ目の要素のアニメーション開始時間を少しずつズラす(遅らせる)ことで、順番に波打つようなオシャレな動きを表現しています。また、alternate を指定して「行って戻る」動きを滑らかにしています。
パルス(transform: scale と opacity)

/* =========================================
3. パルス(波紋のように広がる)
========================================= */
.c-pulse {
width: 50px;
height: 50px;
background-color: #1bb4d4;
border-radius: 50%;
animation: pulse 1.5s ease-out infinite;
}
@keyframes pulse {
0% {
transform: scale(0.5);
opacity: 1;
}
100% {
transform: scale(1.5);
opacity: 0; /* 広がりながら透明になって消える */
}
}
中心からフワッと波紋が広がるような演出です。 scale で要素を拡大させながら、同時に opacity を1(不透明)から0(透明)へ変化させます。ボタンのホバーエフェクトや、注目させたいアイコンの背景などにも応用できる便利なアニメーションです。
まとめ
今回は、CSSだけで簡単に実装できるローディングアニメーションを3つご紹介しました。
どれも基本的なプロパティの組み合わせですが、animation-delay でタイミングをずらしたり、scale と opacity を組み合わせたりすることで、表現の幅は無限に広がります。
ユーザーに「待たされているストレス」を感じさせないためにも、Webサイトの雰囲気に合ったローディングUIをサクッと実装できるようにしておきたいですね!