背景画像リビール・ヒーロー

背景写真がゆっくりズーム(Ken Burns)し、その上で見出しがクリップで切り開かれるように現れる没入型ヒーロー。暗幕オーバーレイで可読性を確保。旅行・飲食・イベント系に好相性です。

#hero#title#image#ken-burns

ライブデモ

使用例(お題: カフェ MOON BREW)

この技法を「カフェ MOON BREW」というテーマのダミーサイトで実際に使った例です。

HTML
<!-- MOON BREW:背景写真ズーム+見出しリビールのカフェヒーロー -->
<section class="tir">
  <div class="tir-bg" aria-hidden="true">
    <img class="tir-img" src="https://picsum.photos/id/1060/1100/680" alt="" referrerpolicy="no-referrer" onerror="this.remove()">
  </div>
  <div class="tir-overlay" aria-hidden="true"></div>

  <div class="tir-inner">
    <p class="tir-kicker">SINCE 2019 · OPEN 18:00</p>
    <h1 class="tir-title"><span class="tir-clip">夜にひらく、珈琲店</span></h1>
    <p class="tir-sub">深夜焙煎の一杯と、静かな時間を。今月のシングルオリジンを店頭・オンラインで。</p>
    <button class="tir-btn" type="button">今月の豆を見る →</button>
  </div>
</section>
CSS
/* MOON BREW(カフェ):背景画像リビール・ヒーローの再スキン */
* { box-sizing: border-box; }
body { margin: 0; font-family: "Hiragino Mincho ProN", "Segoe UI", serif; }

.tir { position: relative; width: 100%; min-height: 380px; display: grid; align-content: center; padding: 40px 40px; overflow: hidden; color: #fff; }

.tir-bg { position: absolute; inset: 0; z-index: 0; background: linear-gradient(135deg, #2a1a10, #4a2c16 70%, #1a0f08); }
.tir-img { width: 100%; height: 100%; object-fit: cover; display: block; transform: scale(1.12); transform-origin: 60% 40%; animation: tir-kb 14s ease-in-out infinite alternate; }
@keyframes tir-kb { from { transform: scale(1.12) translate(0,0); } to { transform: scale(1.24) translate(-2%,-3%); } }
.tir-overlay { position: absolute; inset: 0; z-index: 1; background: linear-gradient(90deg, rgba(20,12,6,.82) 0%, rgba(20,12,6,.5) 55%, rgba(20,12,6,.18) 100%); }

.tir-inner { position: relative; z-index: 2; max-width: 440px; }
.tir-kicker { font-family: "Segoe UI", sans-serif; margin: 0 0 16px; font-size: 11px; letter-spacing: .26em; color: rgba(255,231,205,.82); font-weight: 700; }
.tir-title { margin: 0; font-size: 44px; font-weight: 800; line-height: 1.1; letter-spacing: .02em; }
.tir-clip { display: inline-block; clip-path: inset(0 100% 0 0); animation: tir-reveal 1s cubic-bezier(.76,0,.24,1) .25s forwards; }
@keyframes tir-reveal { to { clip-path: inset(0 0 0 0); } }
.tir-sub { font-family: "Segoe UI", sans-serif; margin: 18px 0 24px; font-size: 14px; line-height: 1.8; color: rgba(255,243,230,.85); opacity: 0; animation: tir-fade .8s ease 1s forwards; }
.tir-btn { font-family: "Segoe UI", sans-serif; font-size: 14px; font-weight: 700; cursor: pointer; padding: 12px 24px; border-radius: 999px; border: 1px solid rgba(255,231,205,.6); background: rgba(255,255,255,.08); color: #fff; backdrop-filter: blur(4px); opacity: 0; animation: tir-fade .8s ease 1.15s forwards; transition: background .2s ease; }
.tir-btn:hover { background: rgba(255,255,255,.2); }
@keyframes tir-fade { to { opacity: 1; } }

@media (prefers-reduced-motion: reduce) { .tir-img { animation: none; } .tir-clip { animation: none; clip-path: none; } .tir-sub, .tir-btn { animation: none; opacity: 1; } }

実装ガイド

使いどころ

旅行・飲食・イベント・ブランドなど、写真の力で没入させたいヒーローに。背景写真がゆっくりズーム(Ken Burns)し、見出しがクリップで切り開かれるように現れます。

実装時の注意点

背景は object-fit:cover の画像を scale+translate で往復ズーム。見出しは clip-path: inset(0 100% 0 0)→inset(0) で左から開きます。手前に左濃→右薄の暗幕グラデを敷いて白文字の可読性を確保。画像が読めない場合に備え、背景要素自体にグラデを持たせフォールバックします。

対応ブラウザ

object-fit・clip-path・transform アニメーションは全モダンブラウザで対応します。画像取得に失敗しても onerror で除去し、下地のグラデで成立します。

よくある失敗

暗幕が薄いと明るい写真で文字が沈むため、見出し側にも text-shadow を保険で。Ken Burns の移動量が大きいと写真の端が見切れて不自然になります。重い高解像度画像はモバイルで遅いので、適切なサイズと遅延読み込みを。

応用例

複数画像のクロスフェード、スクロール量に応じたズーム、見出しを行ごとに時間差リビール、動画背景への置き換えなどに展開できます。

コード

HTML
<!-- 背景画像ズーム+見出しクリップ・リビールのヒーロー -->
<section class="tir">
  <div class="tir-bg" aria-hidden="true">
    <img class="tir-img" src="https://picsum.photos/id/1018/1100/680" alt="" referrerpolicy="no-referrer" onerror="this.remove()">
  </div>
  <div class="tir-overlay" aria-hidden="true"></div>

  <div class="tir-inner">
    <p class="tir-kicker">MOUNTAIN JOURNEYS — 2026</p>
    <h1 class="tir-title"><span class="tir-clip">霧の、向こうへ。</span></h1>
    <p class="tir-sub">標高2,500mから始まる静寂のトレイル。次の季節の特集をまもなく公開します。</p>
    <button class="tir-btn" type="button">特集を見る →</button>
  </div>
</section>
CSS
* { box-sizing: border-box; }
body { margin: 0; font-family: "Segoe UI", system-ui, -apple-system, sans-serif; }

.tir {
  position: relative;
  width: 100%; min-height: 380px;
  display: grid; align-content: center;
  padding: 40px 40px; overflow: hidden;
  color: #fff;
}

/* 背景(画像が無くてもグラデで成立) */
.tir-bg { position: absolute; inset: 0; z-index: 0; background: linear-gradient(135deg, #1e293b, #4c1d95 70%, #831843); }
.tir-img {
  width: 100%; height: 100%; object-fit: cover; display: block;
  transform: scale(1.12); transform-origin: 60% 40%;
  animation: tir-kb 14s ease-in-out infinite alternate;
}
@keyframes tir-kb {
  from { transform: scale(1.12) translate(0, 0); }
  to   { transform: scale(1.24) translate(-2%, -3%); }
}
.tir-overlay {
  position: absolute; inset: 0; z-index: 1;
  background: linear-gradient(90deg, rgba(6,8,20,.78) 0%, rgba(6,8,20,.45) 55%, rgba(6,8,20,.15) 100%);
}

.tir-inner { position: relative; z-index: 2; max-width: 440px; }
.tir-kicker { margin: 0 0 16px; font-size: 11px; letter-spacing: .28em; color: rgba(255,255,255,.78); font-weight: 700; }

.tir-title { margin: 0; font-size: 44px; font-weight: 900; line-height: 1.1; letter-spacing: -.01em; }
.tir-clip {
  display: inline-block;
  clip-path: inset(0 100% 0 0);
  animation: tir-reveal 1s cubic-bezier(.76,0,.24,1) .25s forwards;
}
@keyframes tir-reveal { to { clip-path: inset(0 0 0 0); } }

.tir-sub { margin: 18px 0 24px; font-size: 14px; line-height: 1.8; color: rgba(255,255,255,.85); opacity: 0; animation: tir-fade .8s ease 1s forwards; }
.tir-btn {
  font: inherit; font-size: 14px; font-weight: 700; cursor: pointer;
  padding: 12px 24px; border-radius: 999px; border: 1px solid rgba(255,255,255,.6);
  background: rgba(255,255,255,.08); color: #fff; backdrop-filter: blur(4px);
  opacity: 0; animation: tir-fade .8s ease 1.15s forwards;
  transition: background .2s ease;
}
.tir-btn:hover { background: rgba(255,255,255,.2); }
@keyframes tir-fade { to { opacity: 1; } }

@media (prefers-reduced-motion: reduce) {
  .tir-img { animation: none; }
  .tir-clip { animation: none; clip-path: none; }
  .tir-sub, .tir-btn { animation: none; opacity: 1; }
}

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

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

# 追加してほしい効果
背景画像リビール・ヒーロー(タイトル周り)
背景写真がゆっくりズーム(Ken Burns)し、その上で見出しがクリップで切り開かれるように現れる没入型ヒーロー。暗幕オーバーレイで可読性を確保。旅行・飲食・イベント系に好相性です。

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

# 参考実装(この見た目・挙動を再現してください)
【HTML】
<!-- 背景画像ズーム+見出しクリップ・リビールのヒーロー -->
<section class="tir">
  <div class="tir-bg" aria-hidden="true">
    <img class="tir-img" src="https://picsum.photos/id/1018/1100/680" alt="" referrerpolicy="no-referrer" onerror="this.remove()">
  </div>
  <div class="tir-overlay" aria-hidden="true"></div>

  <div class="tir-inner">
    <p class="tir-kicker">MOUNTAIN JOURNEYS — 2026</p>
    <h1 class="tir-title"><span class="tir-clip">霧の、向こうへ。</span></h1>
    <p class="tir-sub">標高2,500mから始まる静寂のトレイル。次の季節の特集をまもなく公開します。</p>
    <button class="tir-btn" type="button">特集を見る →</button>
  </div>
</section>

【CSS】
* { box-sizing: border-box; }
body { margin: 0; font-family: "Segoe UI", system-ui, -apple-system, sans-serif; }

.tir {
  position: relative;
  width: 100%; min-height: 380px;
  display: grid; align-content: center;
  padding: 40px 40px; overflow: hidden;
  color: #fff;
}

/* 背景(画像が無くてもグラデで成立) */
.tir-bg { position: absolute; inset: 0; z-index: 0; background: linear-gradient(135deg, #1e293b, #4c1d95 70%, #831843); }
.tir-img {
  width: 100%; height: 100%; object-fit: cover; display: block;
  transform: scale(1.12); transform-origin: 60% 40%;
  animation: tir-kb 14s ease-in-out infinite alternate;
}
@keyframes tir-kb {
  from { transform: scale(1.12) translate(0, 0); }
  to   { transform: scale(1.24) translate(-2%, -3%); }
}
.tir-overlay {
  position: absolute; inset: 0; z-index: 1;
  background: linear-gradient(90deg, rgba(6,8,20,.78) 0%, rgba(6,8,20,.45) 55%, rgba(6,8,20,.15) 100%);
}

.tir-inner { position: relative; z-index: 2; max-width: 440px; }
.tir-kicker { margin: 0 0 16px; font-size: 11px; letter-spacing: .28em; color: rgba(255,255,255,.78); font-weight: 700; }

.tir-title { margin: 0; font-size: 44px; font-weight: 900; line-height: 1.1; letter-spacing: -.01em; }
.tir-clip {
  display: inline-block;
  clip-path: inset(0 100% 0 0);
  animation: tir-reveal 1s cubic-bezier(.76,0,.24,1) .25s forwards;
}
@keyframes tir-reveal { to { clip-path: inset(0 0 0 0); } }

.tir-sub { margin: 18px 0 24px; font-size: 14px; line-height: 1.8; color: rgba(255,255,255,.85); opacity: 0; animation: tir-fade .8s ease 1s forwards; }
.tir-btn {
  font: inherit; font-size: 14px; font-weight: 700; cursor: pointer;
  padding: 12px 24px; border-radius: 999px; border: 1px solid rgba(255,255,255,.6);
  background: rgba(255,255,255,.08); color: #fff; backdrop-filter: blur(4px);
  opacity: 0; animation: tir-fade .8s ease 1.15s forwards;
  transition: background .2s ease;
}
.tir-btn:hover { background: rgba(255,255,255,.2); }
@keyframes tir-fade { to { opacity: 1; } }

@media (prefers-reduced-motion: reduce) {
  .tir-img { animation: none; }
  .tir-clip { animation: none; clip-path: none; }
  .tir-sub, .tir-btn { animation: none; opacity: 1; }
}

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

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