レトロ・パースグリッド

夕焼け空に沈む太陽とパースの効いたグリッドを手前へ流す、80年代風シンセウェイブ背景。CSSのみで完結します。

#css#animation#retro

ライブデモ

使用例(お題: アイドルグループ Sakura)

この技法を「アイドルグループ Sakura」というテーマのダミーサイトで実際に使った例です。

HTML
<!-- Sakura:シンセウェイブ風パースグリッドのライブツアー告知 -->
<section class="sr-stage">
  <!-- ★主役:夕陽+手前へ流れるパースグリッド -->
  <div class="sr-sky" aria-hidden="true"></div>
  <div class="sr-sun" aria-hidden="true"></div>
  <div class="sr-floor" aria-hidden="true"><div class="sr-grid"></div></div>

  <div class="sr-inner">
    <span class="sr-eyebrow">★ SAKURA NEON TOUR 2026 ★</span>
    <h1 class="sr-title">桜 NIGHT<br>WAVE</h1>
    <p class="sr-tour">TOKYO ・ OSAKA ・ NAGOYA ・ FUKUOKA</p>
    <button class="sr-btn" type="button" id="srBtn">ツアー日程を見る</button>
  </div>
</section>
CSS
/* Sakura:桜ネオンのシンセウェイブ。主役は手前へ流れるパースグリッド */
* { box-sizing: border-box; margin: 0; padding: 0; }

.sr-stage {
  position: relative;
  min-height: 400px;
  height: 400px;
  overflow: hidden;
  font-family: "Hiragino Kaku Gothic ProN", "Segoe UI", system-ui, sans-serif;
  color: #fff;
}

/* 夕焼け空 */
.sr-sky {
  position: absolute;
  inset: 0 0 45% 0;
  z-index: 0;
  background: linear-gradient(180deg, #2a0b3f 0%, #6a1f6e 45%, #ff6fa8 80%, #ffb37c 100%);
}

/* 沈む太陽(横ストライプで切る) */
.sr-sun {
  position: absolute;
  left: 50%;
  top: 18%;
  width: 150px;
  height: 150px;
  z-index: 1;
  transform: translateX(-50%);
  border-radius: 50%;
  background: linear-gradient(180deg, #ffe7a0 0%, #ff8fc4 55%, #ff5ea0 100%);
  box-shadow: 0 0 60px rgba(255,143,196,0.7);
  -webkit-mask-image: repeating-linear-gradient(180deg, #000 0 12px, transparent 12px 17px);
          mask-image: repeating-linear-gradient(180deg, #000 0 12px, transparent 12px 17px);
}

/* 地面(パース床) */
.sr-floor {
  position: absolute;
  inset: 55% 0 0 0;
  z-index: 2;
  overflow: hidden;
  background: linear-gradient(180deg, #1a0626 0%, #320a3a 100%);
  perspective: 220px;
  perspective-origin: 50% 0%;
}

/* ★主役:手前へ流れるパースグリッド */
.sr-grid {
  position: absolute;
  left: -50%;
  top: 0;
  width: 200%;
  height: 240%;
  background-image:
    linear-gradient(to right, rgba(255,143,196,0.7) 1px, transparent 1px),
    linear-gradient(to bottom, rgba(255,143,196,0.7) 1px, transparent 1px);
  background-size: 44px 44px;
  transform: rotateX(72deg);
  transform-origin: 50% 0%;
  animation: srScroll 1.6s linear infinite;
}
@keyframes srScroll {
  from { background-position: 0 0; }
  to   { background-position: 0 44px; } /* 1マス分流して継ぎ目なくループ */
}

/* 地平線の発光ライン */
.sr-floor::before {
  content: "";
  position: absolute;
  left: 0; right: 0; top: 0;
  height: 3px;
  background: #ff8fc4;
  box-shadow: 0 0 16px 3px rgba(255,143,196,0.9);
  z-index: 1;
}

.sr-inner {
  position: relative;
  z-index: 3;
  height: 100%;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  text-align: center;
  padding: 0 24px;
}
.sr-eyebrow {
  font-size: 11px;
  font-weight: 700;
  letter-spacing: 0.2em;
  color: #ffe7a0;
  text-shadow: 0 0 12px rgba(255,180,120,0.8);
}
.sr-title {
  margin-top: 10px;
  font-size: 44px;
  font-weight: 900;
  line-height: 1.04;
  letter-spacing: 0.06em;
  background: linear-gradient(180deg, #fff 0%, #ffd1e0 60%, #ff8fc4 100%);
  -webkit-background-clip: text;
          background-clip: text;
  color: transparent;
  text-shadow: 0 0 26px rgba(255,143,196,0.5);
}
.sr-tour {
  margin-top: 14px;
  font-size: 11px;
  font-weight: 700;
  letter-spacing: 0.12em;
  color: rgba(255,255,255,0.9);
}
.sr-btn {
  margin-top: 18px;
  font: inherit;
  font-size: 13px;
  font-weight: 800;
  color: #2a0b3f;
  background: linear-gradient(135deg, #ffd1e0, #ff9ec6);
  border: none;
  padding: 11px 24px;
  border-radius: 6px;
  cursor: pointer;
  box-shadow: 0 0 20px rgba(255,143,196,0.6);
  transition: transform 0.2s ease, box-shadow 0.2s ease;
}
.sr-btn:hover { transform: translateY(-2px); box-shadow: 0 0 28px rgba(255,143,196,0.85); }
.sr-btn:active { transform: scale(0.97); }

@media (prefers-reduced-motion: reduce) {
  .sr-grid { animation: none; }
  .sr-btn { transition: none; }
}
JavaScript
// ツアー日程ボタンのトグル表示(CSSグリッドが主役なのでJSは最小限)
(() => {
  const btn = document.getElementById("srBtn");
  if (!btn) return; // null安全

  let open = false;
  const dates = "4/12 東京 ・ 4/19 大阪 ・ 4/26 名古屋 ・ 5/3 福岡";

  btn.addEventListener("click", () => {
    open = !open;
    btn.textContent = open ? dates : "ツアー日程を見る";
  });
})();

コード

HTML
<!-- レトロ・パースグリッド: 遠近感のあるグリッドを手前に流す synthwave 背景 -->
<div class="rg-stage">
  <div class="rg-sun"></div>
  <div class="rg-floor">
    <div class="rg-grid"></div>
  </div>
  <div class="rg-content">
    <h1 class="rg-title">RETRO GRID</h1>
    <p class="rg-sub">パースの効いたグリッドを手前へ流す、80年代風シンセウェイブ背景。CSSのみで完結。</p>
  </div>
</div>
CSS
/* 夕焼け空 + パース床グリッドで synthwave 風景を作る */
* { box-sizing: border-box; margin: 0; padding: 0; }

.rg-stage {
  position: relative;
  min-height: 360px;
  overflow: hidden;
  display: grid;
  place-items: center;
  font-family: "Segoe UI", "Hiragino Sans", system-ui, sans-serif;
  background: linear-gradient(180deg, #1a0033 0%, #41096b 45%, #ff2e88 100%);
}

/* 地平線に沈む太陽 */
.rg-sun {
  position: absolute;
  left: 50%;
  top: 42%;
  width: 200px;
  height: 200px;
  transform: translate(-50%, -50%);
  border-radius: 50%;
  background: linear-gradient(180deg, #ffd86b 0%, #ff6ec4 60%, #ff2e88 100%);
  box-shadow: 0 0 90px rgba(255, 110, 196, 0.6);
}
/* 太陽を横線で切る */
.rg-sun::after {
  content: "";
  position: absolute;
  inset: 0;
  border-radius: 50%;
  background: repeating-linear-gradient(
    180deg,
    transparent 0 10px,
    rgba(26, 0, 51, 0.85) 10px 16px
  );
  mask: linear-gradient(180deg, transparent 50%, #000 50%);
  -webkit-mask: linear-gradient(180deg, transparent 50%, #000 50%);
}

/* 床: 下半分にパースをかける */
.rg-floor {
  position: absolute;
  left: 0;
  right: 0;
  bottom: 0;
  height: 55%;
  perspective: 280px;
  overflow: hidden;
}

/* グリッドラインを手前へスクロール */
.rg-grid {
  position: absolute;
  inset: -50% 0 -50% 0;
  background-image:
    linear-gradient(rgba(0, 255, 240, 0.6) 2px, transparent 2px),
    linear-gradient(90deg, rgba(0, 255, 240, 0.4) 2px, transparent 2px);
  background-size: 46px 46px;
  transform: rotateX(72deg);
  transform-origin: center top;
  animation: rg-scroll 1.4s linear infinite;
  /* 地平線側をフェードさせ、空との境目を自然になじませる */
  -webkit-mask-image: linear-gradient(180deg, transparent 0%, #000 28%);
  mask-image: linear-gradient(180deg, transparent 0%, #000 28%);
}

@keyframes rg-scroll {
  from { background-position: 0 0; }
  to   { background-position: 0 46px; }
}

.rg-content {
  position: relative;
  z-index: 3;
  text-align: center;
  color: #fff;
  padding: 0 24px;
  max-width: 520px;
  margin-top: -40px; /* 太陽より少し上へ */
}

.rg-title {
  font-size: 44px;
  font-weight: 900;
  letter-spacing: 0.16em;
  color: #fff;
  text-shadow:
    0 0 6px #ff2e88,
    0 0 18px #ff2e88,
    0 2px 0 #00fff0;
}

.rg-sub {
  margin-top: 14px;
  font-size: 13.5px;
  line-height: 1.85;
  color: rgba(255, 255, 255, 0.9);
  text-shadow: 0 2px 10px rgba(0, 0, 0, 0.6);
}

@media (prefers-reduced-motion: reduce) {
  .rg-grid { animation: none; }
}

🤖 AIエージェント用プロンプト

このままコピーしてAIに貼り付け「追加する場所」だけ書き換えればOK
あなたは熟練のフロントエンドエンジニアです。私のWebサイトに「レトロ・パースグリッド」の効果を追加してください。

# 追加してほしい効果
レトロ・パースグリッド(背景 & グラデーション)
夕焼け空に沈む太陽とパースの効いたグリッドを手前へ流す、80年代風シンセウェイブ背景。CSSのみで完結します。

# 追加する場所
👉【ここに対象箇所を記入:例「トップのヒーローセクション」「お問い合わせボタン」「記事カードの一覧」など】

# 参考実装(この見た目・挙動を再現してください)
【HTML】
<!-- レトロ・パースグリッド: 遠近感のあるグリッドを手前に流す synthwave 背景 -->
<div class="rg-stage">
  <div class="rg-sun"></div>
  <div class="rg-floor">
    <div class="rg-grid"></div>
  </div>
  <div class="rg-content">
    <h1 class="rg-title">RETRO GRID</h1>
    <p class="rg-sub">パースの効いたグリッドを手前へ流す、80年代風シンセウェイブ背景。CSSのみで完結。</p>
  </div>
</div>

【CSS】
/* 夕焼け空 + パース床グリッドで synthwave 風景を作る */
* { box-sizing: border-box; margin: 0; padding: 0; }

.rg-stage {
  position: relative;
  min-height: 360px;
  overflow: hidden;
  display: grid;
  place-items: center;
  font-family: "Segoe UI", "Hiragino Sans", system-ui, sans-serif;
  background: linear-gradient(180deg, #1a0033 0%, #41096b 45%, #ff2e88 100%);
}

/* 地平線に沈む太陽 */
.rg-sun {
  position: absolute;
  left: 50%;
  top: 42%;
  width: 200px;
  height: 200px;
  transform: translate(-50%, -50%);
  border-radius: 50%;
  background: linear-gradient(180deg, #ffd86b 0%, #ff6ec4 60%, #ff2e88 100%);
  box-shadow: 0 0 90px rgba(255, 110, 196, 0.6);
}
/* 太陽を横線で切る */
.rg-sun::after {
  content: "";
  position: absolute;
  inset: 0;
  border-radius: 50%;
  background: repeating-linear-gradient(
    180deg,
    transparent 0 10px,
    rgba(26, 0, 51, 0.85) 10px 16px
  );
  mask: linear-gradient(180deg, transparent 50%, #000 50%);
  -webkit-mask: linear-gradient(180deg, transparent 50%, #000 50%);
}

/* 床: 下半分にパースをかける */
.rg-floor {
  position: absolute;
  left: 0;
  right: 0;
  bottom: 0;
  height: 55%;
  perspective: 280px;
  overflow: hidden;
}

/* グリッドラインを手前へスクロール */
.rg-grid {
  position: absolute;
  inset: -50% 0 -50% 0;
  background-image:
    linear-gradient(rgba(0, 255, 240, 0.6) 2px, transparent 2px),
    linear-gradient(90deg, rgba(0, 255, 240, 0.4) 2px, transparent 2px);
  background-size: 46px 46px;
  transform: rotateX(72deg);
  transform-origin: center top;
  animation: rg-scroll 1.4s linear infinite;
  /* 地平線側をフェードさせ、空との境目を自然になじませる */
  -webkit-mask-image: linear-gradient(180deg, transparent 0%, #000 28%);
  mask-image: linear-gradient(180deg, transparent 0%, #000 28%);
}

@keyframes rg-scroll {
  from { background-position: 0 0; }
  to   { background-position: 0 46px; }
}

.rg-content {
  position: relative;
  z-index: 3;
  text-align: center;
  color: #fff;
  padding: 0 24px;
  max-width: 520px;
  margin-top: -40px; /* 太陽より少し上へ */
}

.rg-title {
  font-size: 44px;
  font-weight: 900;
  letter-spacing: 0.16em;
  color: #fff;
  text-shadow:
    0 0 6px #ff2e88,
    0 0 18px #ff2e88,
    0 2px 0 #00fff0;
}

.rg-sub {
  margin-top: 14px;
  font-size: 13.5px;
  line-height: 1.85;
  color: rgba(255, 255, 255, 0.9);
  text-shadow: 0 2px 10px rgba(0, 0, 0, 0.6);
}

@media (prefers-reduced-motion: reduce) {
  .rg-grid { animation: none; }
}

# 外部ライブラリ
なし(追加ライブラリ不要)

# 守ってほしいこと
- 既存のHTML構造・レイアウト・デザインを壊さないこと。必要に応じてクラス名・色・サイズを私のサイトに合わせて調整してよい。
- クラス名やidが既存と衝突しないよう、必要なら接頭辞で名前空間を分けること。
- レスポンシブ対応と prefers-reduced-motion への配慮を入れること。
- 私のサイトのフレームワーク(React / Vue / 素のHTML など)に合わせて実装すること。不明な場合は素のHTML/CSS/JSで提示し、組み込み手順も説明すること。
- 変更後の確認手順も簡潔に教えてください。