CSS

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

みなと

Webページにちょっとした動きを加えるだけで、雰囲気や印象はぐっと変わります。とくに背景にほんのりアニメーションを入れると、文字や画像を邪魔せず、ページ全体にほどよい奥行きが生まれます。

今回紹介する「丸背景グラデーションアニメーション」は、CSSだけで実装できる軽量な表現です。丸いグラデーションを背景に重ねてゆっくり動かすだけで、ふわっと光が漂うやわらかな雰囲気を演出できます。ライブラリやJavaScriptを使わず、シンプルなコードで実現できるのも魅力です。

今回のデモの特徴
  • CSSだけで実装(JavaScript不要)
  • 軽量&シンプルなコード構成
  • 丸いグラデーションの重なりで柔らかな光を演出
  • サイズ・色・速度を変えるだけでアレンジしやすい

この記事では、まず完成デモを確認し、その後にHTMLとCSSのコード全体(コメント入り)を紹介します。続いて「固定配置の背景レイヤー」「位置設定と基準点の調整」「radial-gradient() の設定」「回転アニメーション」の4点を順に解説します。必要な箇所だけ拾ってご活用ください。

完成デモの紹介

まずは今回作成する「丸背景グラデーションアニメーション」の完成デモをご覧ください。背景に配置した複数の丸いグラデーションが、ゆっくりと漂うように動き、ページ全体にやわらかい雰囲気を与えています。

CSSだけで実装した丸背景グラデーションアニメーションのデモ画面

このように、テキストや画像の背後でさりげなく動くアニメーションは、コンテンツを邪魔せずにページに奥行きや印象をプラスしてくれます。

コード全体(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-blobsposition: fixed; left: 0; top: 0; width: 100%; height: 100vh; を指定し、画面全体を覆うレイヤーとして配置しています。こうすることで内部の .blob 要素が常に同じ基準で動き、スクロール位置に左右されないアニメーションになります。

また、z-index: -1 を指定して本文より奥に配置することで、テキストや画像より背面に固定され、コンテンツと干渉しない背景として扱えます。

みなと
みなと

場合によっては、このレイヤーよりさらに背面に背景色や画像を置くケースもあるので、その場合は z-index を適宜調整してみてください。

ポイント2:位置設定と基準点の調整

背景レイヤーの中に配置した .blob は、left: 50%; top: 50%; を指定して画面の中央に置いています。これによって、すべての回転アニメーションが画面中央を基準に動くようになります。

さらに、その中の ::before では lefttop を個別に設定することで、各丸を中央から少しずらした位置に配置しています。このずれがあることで、回転したときにそれぞれの丸が異なる円軌道を描き、複数の光が漂っているような見え方になります。

結果として、.blob 自体を回転させれば、::before で配置した丸はすべて「画面中央」を基点に回転することになり、シンプルな仕組みで複数の円運動を表現できるわけです。

ポイント3:radial-gradient() で光の丸を作る

.blob::before で描画しているのが、今回の演出の中心となる「光の丸」です。radial-gradient() を使い、中心が濃く外側に向かって透明になるグラデーションを設定することで、柔らかく広がる光のような見え方になります。

さらに、複数の .blob を用意して色・サイズ・位置を変えることで、光が重なり合う奥行きや雰囲気を表現しています。

スワン
スワン

色や大きさを変えるだけで雰囲気がガラッと変わるので、自由に調整してみてください。

ポイント4:回転アニメーションで漂わせる

.blob 自体を回転させることで、配置したグラデーションがゆっくりと円を描くように動きます。@keyframes でシンプルに 0° → 360° を指定し、アニメーション速度をそれぞれ変えたり、一部だけ逆方向に動かすことで、単調にならない自然な漂い方を演出しています。

特に「速すぎない」「動きが揃いすぎない」ことが、落ち着いた背景アニメーションを作るコツです。

まとめ

丸いグラデーションを背景に重ねてゆっくり動かすことで、ページ全体にやわらかな奥行きを与えることができます。しかも今回のデモは、CSSだけで実装できるシンプルな仕組み。ライブラリやJavaScriptを使わなくても、軽量で扱いやすいのがポイントです。

色やサイズ、配置を少し変えるだけでも見え方は大きく変わりますので、ぜひデザインや用途に合わせて調整してみてください!

押していただけると励みになります!

ABOUT ME
みなと
みなと
フロントエンドエンジニア
東京のWeb制作会社で15年以上働いている現役フロントエンドエンジニアです。これまで、いろんなプロジェクトに関わりながら、フロントエンド開発やWebデザインに取り組んできました。このブログでは、今までの経験を活かして、Web制作に役立つ情報やノウハウをシェアしていきたいと思います。初心者の方から、現場で働く方まで、誰でも参考にできる内容をお届けしますので、ぜひ覗いてみてください。
記事URLをコピーしました