読み込み中...

8つの実例で学ぶCSSにおけるパーティクルの手法とウェブデザイン

CSSパーティクル初心者向け解説, CSSパーティクル作成方法, CSSパーティクルサンプルコード, CSSパーティクル応用例 CSS
この記事は約27分で読めます。

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

本記事のサンプルコードを活用して機能追加、目的を達成できるように作ってありますので、是非ご活用ください。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を満たす現役のプログラマチームによって監修されています。

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

CSSのパーティクル表現は、小さな点や光を画面内に配置し、動きや反応を加えて印象を作る手法です。ウェブデザインでは背景、ボタン、ナビゲーション、ヒーロー領域などに使われ、静的な画面へ控えめなビジュアルエフェクトを加えられます。

ただし、粒を増やせば見栄えが良くなるとは限りません。アニメーションの量、ユーザー操作への反応、読み込み負荷、アクセシビリティを同時に考えることで、インタラクティブデザインとして扱いやすい形になります。

動作確認環境
  • HTML Living Standard / CSS Cascading and Inheritance Level 4
  • Google Chrome 126 / Firefox 127 / Safari 17
  • JavaScript ECMAScript 2024 相当
📖 この記事で学べること
  • CSSでパーティクルを作る基本構造
  • @keyframestransitionによるアニメーション制御
  • マウス操作に反応するインタラクティブデザインの組み立て方
  • 背景やナビゲーションに使うビジュアルエフェクトの考え方
  • レスポンシブ対応と負荷対策の判断基準

CSSのパーティクルとは

結論から言えば、CSSのパーティクルはdivや疑似要素を小さな粒として描画し、positiontransformopacityanimationで動かす表現です。静止した装飾ではなく、時間変化やユーザー操作を伴うため、ウェブデザイン上の視線誘導にも使われます。

<div class="particle"></div>

結果: 期待される表示は、粒として扱うための空のHTML要素がページ内に用意される状態です。

この粒そのものはHTMLだけでは見えません。そのため、CSSでwidthheightbackground-colorborder-radiusを与え、画面内のどこに置くかをtopleftで決めます。

一般に、パーティクルはCanvasやWebGLでも作れますし、ここがポイントです。一方、数が少ない装飾やナビゲーションの反応程度なら、CSSだけでも軽量なビジュアルエフェクトとして成立するのが基本です。

公式ドキュメントによれば、MDNのCSSアニメーション解説では@keyframesanimation-nameanimation-durationなどを組み合わせて時間変化を定義します。この仕組みを小さな粒に適用すると、パーティクルの移動、点滅、拡大縮小を作れますが、これは押さえたい点です。

これと似た考え方は、グリッドや余白設計にも通じます。画面全体の配置を整理したい場合は、CSSグリッド入門!完全マスターの12ステップのようなレイアウト知識と組み合わせると、装飾だけが浮かない構成にしやすくなるのが目安です。

パーティクル効果の基本概念

基本構造は、粒を表す要素、粒の見た目、粒の動きという三層で整理できるのが基本です。要素はspandivで作り、見た目はbackgroundbox-shadowで整え、動きはtransformtranslateで制御する流れです。

このとき、粒を大量にDOMへ追加すると、ブラウザのレイアウト計算が増えます。装飾目的なら::before::afterを使い、少数の要素で見せる設計が扱いやすいでしょう。

具体的には、丸い粒ならborder-radius: 50%、光のにじみならbox-shadow、透明度の変化ならopacityが役立ちます。これらを組み合わせると、CSSだけで控えめなパーティクル表現を作れますし、これが一つの目安です。

CSSによるパーティクルの役割

ウェブデザインにおけるパーティクルの役割は、画面の主役を奪わずに動きを添えることです。たとえば、CTA付近で淡く浮く粒は視線を集め、背景でゆっくり流れる粒はページの雰囲気を補いるのがポイントです。

一方、読ませたい本文の背後で強く点滅するビジュアルエフェクトは、可読性を下げる可能性があります。そのため、z-indexpointer-eventsmix-blend-modeなどを調整し、操作や読解を妨げない配置にするのが現実的です。

💡 Tips: パーティクルは主役ではなく、画面の意図を補う補助表現として使うと調整しやすくなるのが目安です。ウェブデザインでは、粒の数よりも配置、速度、透明度の整合性が見た目を左右します。

同様に、インタラクティブデザインとして使う場合も反応を大きくしすぎないことが肝心です。ホバーやマウス移動に対して少し遅れて追従する程度なら、操作感と装飾のバランスを取りやすいと言えますし、ここがポイントです。

用途使う主な技術向く場面注意点関連する値
固定粒position背景の点描本文と重ねすぎないabsolute
丸い粒border-radius光や泡の表現角丸だけでは発光しない50%
色変更background-colorブランド色の反映彩度を抑えるrgba()
透明度opacity淡いビジュアルエフェクト文字の背後では薄くする0.3
移動transform滑らかなアニメーションtop連続変更を避けるtranslate()
回転rotate()破片の表現回りすぎると目立つ45deg
拡大scale()発生と消滅急な拡大を避ける1.4
時間制御animation-duration速度の調整短すぎると騒がしい5s
繰り返しanimation-iteration-countループ背景停止条件も考えるinfinite
速度曲線animation-timing-function自然な移動用途で曲線を変えるease-in-out
遅延animation-delay粒のばらつき同時開始を避ける1.2s
キーフレーム@keyframes複雑な移動変化点を増やしすぎない0%
ホバー:hoverメニュー反応タッチ端末も考えるli:hover
疑似要素::after追加DOM削減contentが必要''
前面制御z-index重なり調整親の文脈を確認する1
クリック透過pointer-events背景装飾操作要素には使い過ぎないnone
画面幅対応@mediaレスポンシブ対応粒数も変えるmax-width
小画面clamp()サイズ調整対応状況を確認するclamp()
発光box-shadow光の粒過度な影は負荷要因0 0 8px
ぼかしfilter柔らかい光多用すると重くなるblur()
合成mix-blend-mode背景とのなじませ可読性を確認するscreen
非表示display条件付き制御アニメーション中断に注意none
余白marginナビ周辺粒との距離を保つ10px
内側余白paddingボタン装飾クリック領域を狭めない12px
横並びdisplay: flexメニュー配置折り返しを確認するflex
リスト解除list-styleナビゲーション意味構造は残すnone
リンク装飾text-decorationメニュー外観識別性を失わないnone
マウス座標clientX追従演出スクロール差を考えるMouseEvent
要素取得querySelector()単一要素の操作存在確認を入れる'.particle'
削除remove()一時粒の掃除古い環境の対応に注意Element

基本的なパーティクルの作成

CSSで最小構成のパーティクルを作る場合、HTMLの粒とスタイルを分けて考えると理解しやすくなります。粒は空の要素で足り、見える形にする役割をCSSが担います。

その構造を押さえると、色、サイズ、位置の変更が独立した作業になるのがポイントです。class名を基準にすれば、複数の粒へ同じ見た目を与えることもできるのが一般的です。

基本的に、ウェブデザイン上の小さな装飾なら、粒のサイズは控えめにします。大きすぎる粒はカードや本文と競合し、ビジュアルエフェクトとしての役割を超えやすいためです。

サンプルコード1: 単純なパーティクルの作成

この例では、単一のdivを赤い四角形として表示するのが一般的です。CSSの粒作りでは、最初に形が見える状態を作り、そのあとで丸みや動きを加えると原因を切り分けやすくなります。

<!-- HTML -->
<div class="particle"></div>

結果: 期待される表示は、particleクラスを持つ空の要素がHTML上に配置される状態です。

.particle {
    width: 10px;
    height: 10px;
    background-color: red;
    position: absolute;
    top: 50%;
    left: 50%;
}

結果: 期待される表示は、画面中央付近に赤い10px四方の粒が置かれる状態です。

このコードでは、widthheightで粒の大きさが決まり、background-colorで色が付きます。position: absoluteを使うため、基準になる親要素がない場合は初期包含ブロックを基準に配置されます。

ただし、top: 50%left: 50%だけでは粒の左上が中央へ来ますが、覚えておくと役立つでしょう。粒そのものの中心を合わせたい場合は、transform: translate(-50%, -50%)を足すと自然です。

サンプルコード2: パーティクルの色とサイズの変更

色とサイズの変更は、粒の印象を変える最短の調整です。CSSのbackground-colorを変えると視覚的な温度感が変わり、widthheightを変えると存在感が変わりますが、これは押さえたい点です。

.particle {
    width: 20px;
    height: 20px;
    background-color: blue;
}

結果: 期待される表示は、既存の粒が20px四方になり、色が青へ変わる状態です。

そのまま四角形で使う場合は、ピクセルアートや幾何学的なウェブデザインに合います。丸い光として扱う場合は、border-radius: 50%を追加すると粒らしさが出ますし、ここを基本と考えるとよいでしょう。

具体的には、background-color: rgba(0, 120, 255, 0.7)のように透明度を含めると、背景へなじむビジュアルエフェクトになります。濃い青をそのまま置くより、文字やボタンを邪魔しにくい表現です。

関連する表示形式として、横並び要素との相性を考える場面もあるのが現実的です。メニューやラベルの粒を調整するなら、CSSでInline-blockを効果的に使う方法9選の考え方が参考になるのが現実的です。

パーティクルのアニメーション効果

粒が見えるようになったら、動きを付ける段階に進みます。CSSアニメーションでは、開始状態と終了状態だけでなく、途中の状態も@keyframesで定義できます。

このとき、動かすプロパティの選び方が表示の滑らかさに影響すると整理できると整理できます。一般的に、連続的な移動にはtopleftよりtransformを使うほうが扱いやすいでしょう。

公式ドキュメントによれば、MDNのtransform解説では要素の移動、回転、拡大縮小、傾斜を視覚的に変換できるとされています。パーティクルのアニメーションでも、この変換を中心に考えると設計が安定します。

サンプルコード3: パーティクルの動きのアニメーション

単一の粒を動かす例では、animationに名前、時間、繰り返し回数をまとめて書きますし、ここがポイントです。移動経路を@keyframesへ分けることで、見た目の定義と動きの定義が整理されますし、これが一つの目安です。

<!-- HTML -->
<div class="particle"></div>

結果: 期待される表示は、アニメーションを適用する対象の粒がHTML上に用意される状態です。

.particle {
  width: 10px;
  height: 10px;
  background-color: blue;
  position: absolute;
  animation: move 5s infinite;
}

@keyframes move {
  0%   { top: 0; left: 0; }
  25%  { top: 0; left: 100%; }
  50%  { top: 100%; left: 100%; }
  75%  { top: 100%; left: 0; }
  100% { top: 0; left: 0; }
}

結果: 期待される表示は、青い粒が画面の四隅を巡るように移動する状態です。

この例ではtopleftを変化させています。理解用としては読みやすい一方、実際のUIで多くの粒を動かす場合はtransform: translate()へ置き換える設計がよく使われます。

一方、サンプルのleft: 100%top: 100%は粒の幅や高さを含めて画面外へ出る可能性があると理解できると理解できます。枠内に収めたい場合は、親要素にoverflow: hiddenを置き、移動距離を調整するとよいでしょう。

⚠️ 注意: 点滅や高速移動を多用すると、閲覧者によっては負担になる場合があります。prefers-reduced-motionを使い、動きを減らす設定へ対応する設計が望まれます。

サンプルコード4: 複数のパーティクルの同時アニメーション

複数の粒を同時に動かす場合、すべてを同じ経路にすると人工的な動きになると覚えるとよいでしょう。そのため、idや追加クラスで個別のanimation-nameを割り当て、開始位置や遅延をずらすると覚えるとよいでしょう。

<!-- HTML -->
<div class="particle" id="particle1"></div>
<div class="particle" id="particle2"></div>
<div class="particle" id="particle3"></div>

結果: 期待される表示は、個別に制御できる3個の粒がHTML上に並ぶ状態です。

#particle1 {
  animation: move1 5s infinite;
}

#particle2 {
  animation: move2 5s infinite;
}

#particle3 {
  animation: move3 5s infinite;
}

/* 各アニメーションの定義は省略 */

結果: 期待される表示は、3個の粒へ別々のアニメーション名が割り当てられる状態です。

その設計では、move1move2move3に別々の経路を用意します。すべての粒に同じanimation-durationを使うと周期が重なるため、4s6s8sのようにずらすと自然に見えます。

ただし、粒ごとにidを増やし続けると管理が複雑になると考えられますが、覚えておくと役立つでしょう。実装パターンとしてよく見るのは、共通の.particleへ基礎スタイルを置き、:nth-child()で色や遅延だけ変える方法です。

インタラクティブなパーティクル効果

インタラクティブデザインとしてのパーティクルは、ユーザー操作に反応する点が特徴です。マウス移動、クリック、ホバー、フォーカスなどをきっかけに粒が動くと、画面が操作へ応答している印象を作れます。

この領域ではCSSだけで完結する場合と、JavaScriptを併用する場合があります。ホバー反応なら:hoverで足りますが、マウス座標へ追従させるならaddEventListener()querySelector()を使いると言えるでしょう。

一方、ユーザーの動きを追う表現は、過剰に作ると操作の邪魔になると考えられます。インタラクティブデザインでは、反応があることを示しつつ、クリックや読解を妨げない範囲に抑える判断が必要です。

サンプルコード5: ユーザーのアクションに反応するパーティクル

マウス移動に追従する粒は、座標取得とCSS変形を組み合わせて作れます。JavaScriptでmousemoveを受け取り、取得したclientXclientYtransformへ渡す流れです。

<!-- HTML -->
<div class="interactive-particle"></div>

結果: 期待される表示は、マウス位置へ移動させる対象の粒がHTML上に配置される状態です。

.interactive-particle {
  width: 10px;
  height: 10px;
  background-color: red;
  position: absolute;
  transition: transform 1s;
}

結果: 期待される表示は、赤い粒がtransformの変化に1秒かけて追従する状態です。

// js
document.addEventListener('mousemove', function(e) {
  var particle = document.querySelector('.interactive-particle');
  particle.style.transform = `translate(${e.clientX}px, ${e.clientY}px)`;
});

結果: 期待される表示は、マウス移動に合わせて赤い粒が画面内を追従する状態です。

このコードでは、document全体でmousemoveを監視しています。そのため、ページのどこでマウスが動いても処理が走り、粒のstyle.transformが更新されます。

ただし、querySelector()の戻り値がnullになるケースを考えるなら、実運用コードでは存在確認を入れるほうが安全です。粒がないページへ同じスクリプトを読み込む構成では、エラー回避の意味があるのが基本です。

JavaScriptで要素を取得する考え方を深めたい場合は、CSSにおけるquerySelector()の活用法10選!初心者からプロまで役立つCSSガイドも関連すると言えるでしょう。DOM操作とスタイル変更の境界を理解すると、インタラクティブデザインの調整がしやすくなります。

サンプルコード6: パーティクルとテキストのインタラクション

テキストへ粒を反応させる場合、対象テキストの位置を取得して粒を移動させますが、これは押さえたい点です。getBoundingClientRect()を使うと、要素の画面上の位置や大きさを取得できます。

<!-- HTML -->
<div class="text">Hover Me</div>
<div class="text-particle"></div>

結果: 期待される表示は、反応対象のテキストと、その位置へ移動する粒が用意される状態です。

.text {
  position: relative;
  display: inline-block;
}

.text-particle {
  width: 10px;
  height: 10px;
  background-color: green;
  position: absolute;
  transition: transform 1s;
}

結果: 期待される表示は、テキストがインラインブロック化され、緑の粒が移動可能な状態になることです。

// js
document.querySelector('.text').addEventListener('mouseover', function(e) {
  var particle = document.querySelector('.text-particle');
  var textRect = e.target.getBoundingClientRect();
  particle.style.transform = `translate(${textRect.left}px, ${textRect.top}px)`;
});

結果: 期待される表示は、テキストへマウスが乗ったときに緑の粒がテキスト位置へ移動する状態です。

この例では、テキストの左上座標を粒の移動先として使っています。中央に合わせたい場合は、textRect.widthtextRect.heightの半分を加えると、反応位置が自然になります。

もっとも、ホバーだけに依存するとタッチ端末で反応が伝わりにくい場合があるのが目安です。タップやフォーカスにも対応するなら、clickfocuspointermoveを検討するとよいでしょう。

パーティクル効果の応用例

パーティクル効果は、背景、見出し、カード、ナビゲーション、フォームの反応などに応用できるのが基本です。ウェブデザインで使う場合は、装飾を足す場所ではなく、ユーザーの視線や操作に意味を持たせる場所へ置くと効果が安定します。

その代表例が、背景全体に薄い粒を流す表現と、ナビゲーションバーのホバー反応です。どちらもビジュアルエフェクトとして目立ちますが、本文やリンクの識別性を守る調整が欠かせません。

一方で、すべてのページへ同じ粒表現を入れる必要はありません。ブランドページやキャンペーンページでは有効でも、長文の技術記事では控えめなアニメーションのほうが読みやすい場合があるのがポイントです。

サンプルコード7: パーティクルを使った背景効果

背景効果では、粒をコンテンツの背面に置き、overflowで表示範囲を制御します。疑似要素を使うとHTMLを増やさずに粒を作れるため、軽い装飾に向いているのが目安です。

<!-- HTML -->
<div class="background-particle"></div>

結果: 期待される表示は、背景用の粒を内包する領域がHTML上に作られる状態です。

.background-particle {
  width: 100%;
  height: 100%;
  position: absolute;
  top: 0;
  left: 0;
  overflow: hidden;
}

.background-particle::after {
  content: '';
  display: block;
  width: 2px;
  height: 2px;
  background-color: white;
  position: absolute;
  top: 50%;
  left: 50%;
  animation: moveBackground 10s infinite;
}

@keyframes moveBackground {
  0%   { transform: translate(-50%, -50%); }
  100% { transform: translate(50%, 50%); }
}

結果: 期待される表示は、白い小さな粒が背景領域の中をゆっくり移動する状態です。

このコードでは、::afterが粒の実体です。content: ''がないと疑似要素は生成されないため、疑似要素でパーティクルを作るときの基本として覚えるとよいでしょう。

ただし、width: 100%height: 100%は親要素のサイズに依存します。背景を画面全体へ広げたい場合は、親にmin-height: 100vhを置くなど、領域の高さを明示する必要があります。

引用や囲みのデザインに粒を重ねる場合は、本文の可読性が優先されますし、これが一つの目安です。装飾枠との組み合わせを考えるなら、CSSを使った引用デザインの作成とカスタマイズ方法7選のようなテキスト領域の設計も合わせて確認するとよいでしょう。

サンプルコード8: パーティクルを活用したナビゲーションバー

ナビゲーションバーに粒を入れる場合、リンクの下に小さな点を出すだけでも反応が伝わりますし、ここを基本と考えるとよいでしょう。CSSの:hover::afterを使えば、追加要素なしでインタラクティブデザインを作れます。

<!-- HTML -->
<nav class="navbar">
  <ul>
    <li><a href="#">Home</a></li>
    <li><a href="#">About</a></li>
    <li><a href="#">Services</a></li>
    <li><a href="#">Contact</a></li>
  </ul>
</nav>

結果: 期待される表示は、4項目のリンクを持つナビゲーションバーのHTML構造が作られる状態です。

.navbar ul {
  list-style: none;
  display: flex;
}

.navbar li {
  margin: 0 10px;
  position: relative;
}

.navbar a {
  text-decoration: none;
  color: black;
}

.navbar li::after {
  content: '';
  display: block;
  width: 5px;
  height: 5px;
  background-color: blue;
  position: absolute;
  bottom: -10px;
  left: 0;
  opacity: 0;
  transition: opacity 0.3s, transform 0.3s;
}

.navbar li:hover::after {
  opacity: 1;
  transform: translateY(10px);
}

結果: 期待される表示は、リンクへホバーしたときに青い粒が下方向へ現れる状態です。

この粒は、.navbar li::afterで作られています。通常時はopacity: 0で見えず、ホバー時にopacity: 1へ変わるため、短いアニメーションとして知覚されます。

そのまま使うと、粒の位置は各liの左端に寄りますが、覚えておくと役立つでしょう。中央に置きたい場合はleft: 50%transform: translateX(-50%)を組み合わせ、ホバー時の移動量も合わせて調整するのがポイントです。

リンクの文字が長い場合は、改行や折り返しで見た目が崩れることがあります。テキスト処理まで含めて調整するなら、CSSのword-breakを完全解説!初心者からプロまでの5つのコード例も関連するのが一般的です。

注意点と対処法

CSSのパーティクルは見た目を豊かにできますが、負荷、可読性、操作性への影響もあります。ビジュアルエフェクトは画面の印象を変える一方、ユーザーの目的と衝突すると品質を下げますし、ここがポイントです。

そのため、粒の数を制限し、動きを遅めにし、本文やボタンと重なる場所では透明度を下げますし、ここを基本と考えるとよいでしょう。インタラクティブデザインとして扱う場合も、クリックやスクロールを阻害しないことが前提です。

ブラウザの互換性とパフォーマンス

ブラウザ互換性では、transformanimationfiltermix-blend-modeなどの対応状況を確認します。一般的なアニメーションは広く使えますが、合成やフィルターは表示差が出る可能性があります。

一方、パフォーマンス面では、DOM数と描画コストが課題になるのが現実的です。粒を何百個もdivで作るより、少数の要素、疑似要素、背景画像、Canvasなどを使い分けるほうが現実的です。

  • CSSとJavaScriptの機能は、MDNやCan I useなどで対応状況を確認する
  • パーティクルの数、サイズ、発光、ぼかしを必要最小限に抑える
  • transformopacity中心のアニメーションに寄せる
  • 背景装飾にはpointer-events: noneを使い、クリックを妨げない
  • prefers-reduced-motionで動きを減らす設定へ対応する

こうした対処を入れると、ウェブデザインの装飾として使いやすくなります。特にモバイル端末ではCPUやバッテリーへの影響もあるため、デスクトップと同じ粒数にしない判断が必要です。

ℹ️ 補足: will-changeは描画最適化のヒントになりますが、多用するとメモリ消費が増える場合があります。常時すべての粒へ付けるのではなく、必要な要素へ限定する考え方が適していると整理できるのが一般的です。

レスポンシブデザインへの適応

レスポンシブ対応では、画面幅に合わせて粒の数、サイズ、移動距離を変えます。大画面で成立するアニメーションでも、スマートフォンでは文字やボタンに近づきすぎることがあります。

具体的には、@media (max-width: 768px)で粒を小さくし、背景用の粒は一部を非表示にすると理解できるのが現実的です。視線誘導より読解が優先されるページでは、小画面でアニメーションを止める判断も自然です。

  • @mediaで画面幅ごとの粒サイズを変える
  • 小画面ではdisplay: noneで一部の装飾を止める
  • clamp()で粒や余白の最小値と最大値を決める
  • 文字の背後に粒が来る場合はopacityを下げる
  • 固定配置の粒はposition: fixedの使用範囲を絞る

ただし、非表示にするだけでは設計意図が失われる場合もあります。小画面では粒を背景からボタン周辺へ移すなど、ビジュアルエフェクトの役割を変える方法もあります。

カスタマイズ方法

パーティクルのカスタマイズでは、色、形、動き、反応条件を分けて調整すると覚えるとよいでしょう。CSSで見た目を変え、JavaScriptで発生タイミングを変えると、表現の幅が広がりますが、これは押さえたい点です。

この考え方は、ウェブデザインのブランド調整にも向いています。落ち着いたサイトなら粒を小さく薄くし、イベントページなら色や発光をやや強めるなど、目的に応じた差を出せますし、ここがポイントです。

一方、カスタマイズを増やしすぎると保守が難しくなります。色や速度はCSSカスタムプロパティの--particle-color--particle-speedにまとめると、後から変更しやすくなると整理できます。

パーティクルの個性を出すカスタマイズ

粒の個性を出すには、:nth-child()で奇数と偶数の見た目を変える方法があると考えられます。HTMLの構造を増やさずに色のばらつきを作れるため、少量のCSSで変化を付けられます。

.particle {
  width: 10px;
  height: 10px;
  position: absolute;
  border-radius: 50%;
  animation: move 5s infinite;
}

.particle:nth-child(odd) {
  background-color: blue;
}

.particle:nth-child(even) {
  background-color: red;
}

@keyframes move {
  0% { transform: translateY(0); }
  50% { transform: translateY(50px); }
  100% { transform: translateY(0); }
}

結果: 期待される表示は、奇数番目の粒が青、偶数番目の粒が赤になり、上下に移動する状態です。

このCSSでは、:nth-child(odd):nth-child(even)が粒の色分けを担います。border-radius: 50%により丸い粒になり、@keyframes moveで上下のアニメーションが加わります。

ただし、赤と青を同じ強さで使うと画面が騒がしくなる場合があると言えるでしょう。rgba()で透明度を加える、または片方を淡い色にすると、ビジュアルエフェクトとして背景へなじみやすくなると理解できます。

クリエイティブなアイデアでパーティクルを活用する方法

マウスの軌跡に粒を発生させる表現は、インタラクティブデザインの分かりやすい例です。ユーザーの動きに合わせて要素を生成し、一定時間後に削除することで、残像のような効果を作れます。

document.addEventListener('mousemove', function(e) {
  var particle = document.createElement('div');
  particle.className = 'mouse-particle';
  document.body.appendChild(particle);

  particle.style.left = e.clientX + 'px';
  particle.style.top = e.clientY + 'px';

  setTimeout(function() {
    particle.remove();
  }, 1000);
});

結果: 期待される表示は、マウスが動くたびに.mouse-particle要素が作られ、1秒後に削除される状態です。

このコードでは、createElement()で粒を作り、appendChild()でページへ追加します。その後、setTimeout()の中でremove()を呼び、古い粒が残り続けないようにしています。

ただし、mousemoveは短時間に多く発生するのが基本です。粒を作りすぎるとDOMが急増するため、一定間隔で処理を間引く、発生数に上限を設ける、CSSアニメーション終了時に削除するなどの工夫が必要です。

具体的には、粒のスタイルとしてposition: fixedpointer-events: noneanimation: fade 1s forwardsを組み合わせると、操作を邪魔しにくい残像になると覚えるとよいでしょう。削除処理と視覚表現を合わせることで、軽いビジュアルエフェクトとして管理できます。

💡 Tips: 生成した粒を消す処理は見た目以上に大切です。消えたように見えてもDOMに残ると、長時間の閲覧で処理量が増える可能性があるのが目安です。

まとめ

CSSによるパーティクルは、HTML要素や疑似要素を粒として扱い、animationtransitiontransformで動きを与える表現です。小さな装飾でも、配置や速度を整えるとウェブデザイン全体の印象を変えられます。

これらの手法は、背景のビジュアルエフェクト、ナビゲーションの反応、テキスト周辺の演出、マウス追従のインタラクティブデザインなどに応用できると考えられます。反面、粒の数や動きが増えるほど、可読性や処理負荷への配慮が必要になるのがポイントです。

そのため、最初は単一の粒を作り、色とサイズを調整し、必要に応じてアニメーションやJavaScriptの反応を足す流れが扱いやすいでしょう。CSSだけで済む場面と、JavaScriptを併用する場面を分けると、保守しやすい実装になります。

最後の判断軸は、装飾がユーザーの目的を助けているかどうかです。パーティクル、アニメーション、インタラクティブデザイン、ビジュアルエフェクトを組み合わせるほど、控えめな調整がウェブデザインの完成度を左右します。

関連記事

著者: Japanシーモア編集部

Japanシーモアは、Web/IoT/APP/SYS 分野のプログラミング情報を体系的に提供するメディアです。本記事は編集部による執筆とAI支援を組み合わせて制作し、公開前に編集部が校正しています。誤りや改善案がございましたらお問い合わせよりご連絡ください。

※本記事は実在のエンジニア複数名で構成される Japanシーモア編集部が、AI支援を活用して作成・校正・公開しています。