CSSだけで作る!丸い背景グラデーションのアニメーション表現

Webページにちょっとした動きを加えるだけで、雰囲気や印象はぐっと変わります。とくに背景にほんのりアニメーションを入れると、文字や画像を邪魔せず、ページ全体にほどよい奥行きが生まれます。
今回紹介する「丸背景グラデーションアニメーション」は、CSSだけで実装できる軽量な表現です。丸いグラデーションを背景に重ねてゆっくり動かすだけで、ふわっと光が漂うやわらかな雰囲気を演出できます。ライブラリやJavaScriptを使わず、シンプルなコードで実現できるのも魅力です。
- CSSだけで実装(JavaScript不要)
- 軽量&シンプルなコード構成
- 丸いグラデーションの重なりで柔らかな光を演出
- サイズ・色・速度を変えるだけでアレンジしやすい
この記事では、まず完成デモを確認し、その後にHTMLとCSSのコード全体(コメント入り)を紹介します。続いて「固定配置の背景レイヤー」「位置設定と基準点の調整」「radial-gradient() の設定」「回転アニメーション」の4点を順に解説します。必要な箇所だけ拾ってご活用ください。
完成デモの紹介
まずは今回作成する「丸背景グラデーションアニメーション」の完成デモをご覧ください。背景に配置した複数の丸いグラデーションが、ゆっくりと漂うように動き、ページ全体にやわらかい雰囲気を与えています。

このように、テキストや画像の背後でさりげなく動くアニメーションは、コンテンツを邪魔せずにページに奥行きや印象をプラスしてくれます。
コード全体(HTML / CSS)
ここからは、完成デモで使っているコードをそのまま紹介します。コード内にコメントで補足を入れているので、流れを追いやすくなっていると思います。まずは全体像を眺めて、仕組みのイメージをつかんでみてください。
HTMLコード
HTMLはとてもシンプルで、背景アニメーション用のレイヤー(.bg-blobs
内に3つの.blob
要素)と、ヘッダー・メインビジュアル・本文といった通常のページ構造から成り立っています。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="format-detection" content="telephone=no">
<title>丸背景グラデーションアニメーションのデモ</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<!--
背景アニメーションレイヤー
- position: fixed の全面レイヤー
- 複数の「丸(blob)」を重ねて、中心が濃く外側が薄くなる radial-gradient を回転でゆっくり動かす
-->
<div class="bg-blobs">
<div class="blob"></div>
<div class="blob"></div>
<div class="blob"></div>
</div>
<div class="wrapper">
<header class="header"><!-- ヘッダー(省略) --></header>
<div class="keyvisual"><!-- キービジュアル(省略) --></div>
<div class="contents"><!-- コンテンツ(省略) --></div>
<footer class="footer"><!-- フッター(省略) --></footer>
</div>
</body>
</html>
CSSコード
CSSでは、グラデーションを設定した丸を配置し、@keyframes
を使ってゆっくり回転させています。各.blob
に対してサイズ・色・位置・アニメーション速度を指定することで、複数の光が重なって漂うような演出を実現しています。
/* ------------------------------
固定配置の背景レイヤー
- 画面全体に固定配置し、本文より背面(z-index:-1)
- .blob は画面中央に置かれる回転の基点
- .blob::before は 中心からずらして配置された「丸い光」の実体
- 親 .blob の回転により、::before が円を描くように動く
------------------------------ */
@keyframes blob_rotate {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}
.bg-blobs {
position: fixed;
left: 0;
top: 0;
z-index: -1; /* 本文より背面へ */
width: 100%;
height: 100vh;
overflow: hidden;
pointer-events: none; /* 背景は操作対象外(クリック等を透過) */
}
.blob {
position: absolute;
left: 50%;
top: 50%;
animation-name: blob_rotate; /* 中心基準で回転させ、擬似要素の相対位置を円運動させる */
animation-timing-function: linear; /* 一定速度で回転 */
animation-iteration-count: infinite; /* アニメーションを無限に繰り返す */
}
.blob::before {
content: "";
display: block;
position: absolute;
border-radius: 50%;
opacity: 0.4; /* 全体の発光強度(強すぎると本文を圧迫) */
transform: translate(-50%, -50%); /* left/top の基準点(左上)を要素の中心に補正 */
/* 見た目のコア:
- background: radial-gradient(中心が最も濃く、外側でフェードアウト)
- サイズ/位置/色/濃度は各 nth-child で個別に指定し、重なりで奥行きを作る */
}
/* 各 blob の速度や見た目(サイズ・色・配置・フェード距離)を個別に指定 */
.blob:nth-child(1) {
animation-duration: 35000ms;
}
.blob:nth-child(1)::before {
left: -150px;
top: 150px;
width: 350px;
height: 350px;
background: radial-gradient(rgba(68, 102, 206, 0.8) 0%, rgba(68, 102, 206, 0) 70%);
}
.blob:nth-child(2) {
animation-duration: 30000ms;
animation-direction: reverse; /* ひとつだけ回転の向きを反転 */
}
.blob:nth-child(2)::before {
left: 250px;
top: -250px;
width: 500px;
height: 500px;
background: radial-gradient(rgba(249, 215, 122, 1) 0%, rgba(249, 215, 122, 0) 70%);
}
.blob:nth-child(3) {
animation-duration: 25000ms;
}
.blob:nth-child(3)::before {
left: 550px;
top: 300px;
width: 700px;
height: 700px;
background: radial-gradient(rgba(193, 26, 81, 0.5) 0%, rgba(193, 26, 81, 0) 70%);
}
/* ------------------------------
レスポンシブ対応
------------------------------ */
@media (max-width: 767px) {
/* 固定配置の背景レイヤー(モバイル調整)
- 画面が狭いと blob(丸)が主張しやすいため、半径とオフセットのみ縮小
- アニメ速度や不透明度は PC と同一にし、見た目のトーンを揃える
- 文字や画像に被り過ぎないよう、端寄りの配置を弱める(left/top を再調整)
*/
.blob:nth-child(1)::before {
left: -50px;
top: 50px;
width: 250px;
height: 250px;
}
.blob:nth-child(2)::before {
left: 150px;
top: -150px;
width: 350px;
height: 350px;
}
.blob:nth-child(3)::before {
left: 450px;
top: 150px;
width: 500px;
height: 500px;
}
}
/* その他の装飾は本題外のため省略 */
コードのポイント解説
ここからは、完成デモを構成するうえで特に重要なポイントを4つに分けて解説していきます。「背景レイヤーの配置」「位置設定と基準点の調整」「丸い光の表現」「回転アニメーション」の順に押さえていけば、コードの役割分担が整理され、仕組みの理解がしやすくなるはずです。
ポイント1:固定配置の背景レイヤー
背景用の要素 .bg-blobs
は position: fixed; left: 0; top: 0; width: 100%; height: 100vh;
を指定し、画面全体を覆うレイヤーとして配置しています。こうすることで内部の .blob
要素が常に同じ基準で動き、スクロール位置に左右されないアニメーションになります。
また、z-index: -1
を指定して本文より奥に配置することで、テキストや画像より背面に固定され、コンテンツと干渉しない背景として扱えます。

場合によっては、このレイヤーよりさらに背面に背景色や画像を置くケースもあるので、その場合は z-index
を適宜調整してみてください。
ポイント2:位置設定と基準点の調整
背景レイヤーの中に配置した .blob
は、left: 50%; top: 50%;
を指定して画面の中央に置いています。これによって、すべての回転アニメーションが画面中央を基準に動くようになります。
さらに、その中の ::before
では left
や top
を個別に設定することで、各丸を中央から少しずらした位置に配置しています。このずれがあることで、回転したときにそれぞれの丸が異なる円軌道を描き、複数の光が漂っているような見え方になります。
結果として、.blob
自体を回転させれば、::before
で配置した丸はすべて「画面中央」を基点に回転することになり、シンプルな仕組みで複数の円運動を表現できるわけです。
ポイント3:radial-gradient() で光の丸を作る
.blob::before
で描画しているのが、今回の演出の中心となる「光の丸」です。radial-gradient()
を使い、中心が濃く外側に向かって透明になるグラデーションを設定することで、柔らかく広がる光のような見え方になります。
さらに、複数の .blob
を用意して色・サイズ・位置を変えることで、光が重なり合う奥行きや雰囲気を表現しています。

色や大きさを変えるだけで雰囲気がガラッと変わるので、自由に調整してみてください。
ポイント4:回転アニメーションで漂わせる
各 .blob
自体を回転させることで、配置したグラデーションがゆっくりと円を描くように動きます。@keyframes
でシンプルに 0° → 360° を指定し、アニメーション速度をそれぞれ変えたり、一部だけ逆方向に動かすことで、単調にならない自然な漂い方を演出しています。
特に「速すぎない」「動きが揃いすぎない」ことが、落ち着いた背景アニメーションを作るコツです。
まとめ
丸いグラデーションを背景に重ねてゆっくり動かすことで、ページ全体にやわらかな奥行きを与えることができます。しかも今回のデモは、CSSだけで実装できるシンプルな仕組み。ライブラリやJavaScriptを使わなくても、軽量で扱いやすいのがポイントです。
色やサイズ、配置を少し変えるだけでも見え方は大きく変わりますので、ぜひデザインや用途に合わせて調整してみてください!
押していただけると励みになります!