プログレッシブブラー
下端に向かって段階的に強くぼかす backdrop-filter 層を mask グラデで重ね、写真の上に置いた固定ナビと見出しの可読性を高める手法。Apple/iOS 風の上品なフェードブラーで、ヒーローやアプリUIに使えます。
ライブデモ
使用例(お題: カフェ MOON BREW)
この技法を「カフェ MOON BREW」というテーマのダミーサイトで実際に使った例です。
HTML
<!-- MOON BREW:店内写真の上、下端をプログレッシブブラーで可読化 -->
<section class="pb-hero">
<!-- 背景:カフェの店内写真 -->
<img class="pb-photo" src="https://picsum.photos/900/600?random=91" alt="MOON BREW 店内">
<!-- ★主役:下端ほど強くボカす段階的 backdrop-filter 層 -->
<div class="pb-blur pb-blur-1" aria-hidden="true"></div>
<div class="pb-blur pb-blur-2" aria-hidden="true"></div>
<div class="pb-blur pb-blur-3" aria-hidden="true"></div>
<div class="pb-blur pb-blur-4" aria-hidden="true"></div>
<div class="pb-scrim" aria-hidden="true"></div>
<!-- 固定ナビ -->
<header class="pb-nav">
<div class="pb-logo">☕ MOON <span>BREW</span></div>
<nav class="pb-links">
<a href="#">メニュー</a>
<a href="#">豆を買う</a>
<a href="#">店舗</a>
</nav>
</header>
<!-- 下端ヒーロー -->
<div class="pb-copy">
<span class="pb-eyebrow">SINCE 2014 ・ 自家焙煎</span>
<h1 class="pb-title">ゆっくり流れる、<br>珈琲の時間。</h1>
<p class="pb-sub">朝7時から夜9時まで。深煎りの香りに包まれる、街角の小さな焙煎所。</p>
<button class="pb-btn" type="button">本日のメニュー</button>
</div>
</section>
CSS
/* MOON BREW:店内写真の下端をプログレッシブブラーで段階的にボカす */
* { box-sizing: border-box; margin: 0; padding: 0; }
.pb-hero {
position: relative;
min-height: 400px;
height: 400px;
overflow: hidden;
display: flex;
flex-direction: column;
color: #fff;
background: #2b1d12; /* 画像読込前の下地 */
font-family: "Hiragino Kaku Gothic ProN", "Segoe UI", system-ui, sans-serif;
}
/* 背景写真 */
.pb-photo {
position: absolute;
inset: 0;
width: 100%;
height: 100%;
object-fit: cover;
z-index: 0;
}
/* ブラー層共通: maskで効かせる範囲を帯状に限定 */
.pb-blur {
position: absolute;
inset: 0;
z-index: 1;
pointer-events: none;
-webkit-mask-image: linear-gradient(to bottom, transparent 0%, transparent var(--from), #000 var(--to));
mask-image: linear-gradient(to bottom, transparent 0%, transparent var(--from), #000 var(--to));
}
/* ★主役:4段階で下に向かうほど blur を強める */
.pb-blur-1 { --from: 30%; --to: 50%; -webkit-backdrop-filter: blur(2px); backdrop-filter: blur(2px); }
.pb-blur-2 { --from: 45%; --to: 62%; -webkit-backdrop-filter: blur(5px); backdrop-filter: blur(5px); }
.pb-blur-3 { --from: 60%; --to: 76%; -webkit-backdrop-filter: blur(10px); backdrop-filter: blur(10px); }
.pb-blur-4 { --from: 74%; --to: 90%; -webkit-backdrop-filter: blur(18px); backdrop-filter: blur(18px); }
/* 暗幕(琥珀寄り):下端を暗くして白文字を守る */
.pb-scrim {
position: absolute;
inset: 0;
z-index: 2;
pointer-events: none;
background: linear-gradient(
to bottom,
rgba(43,29,18,0.4) 0%,
rgba(43,29,18,0) 28%,
rgba(43,29,18,0) 50%,
rgba(43,29,18,0.72) 100%
);
}
/* 固定ナビ */
.pb-nav {
position: relative;
z-index: 3;
display: flex;
align-items: center;
justify-content: space-between;
padding: 16px 24px;
}
.pb-logo {
font-weight: 800;
font-size: 17px;
letter-spacing: 0.04em;
text-shadow: 0 1px 8px rgba(0,0,0,0.4);
}
.pb-logo span { color: #e6b877; }
.pb-links { display: flex; gap: 18px; }
.pb-links a {
color: rgba(255,255,255,0.92);
text-decoration: none;
font-size: 13px;
text-shadow: 0 1px 6px rgba(0,0,0,0.4);
transition: color 0.2s ease;
}
.pb-links a:hover { color: #e6b877; }
/* 下端コピー(一番ボケる帯の上) */
.pb-copy {
position: relative;
z-index: 3;
margin-top: auto;
padding: 0 26px 26px;
max-width: 520px;
}
.pb-eyebrow {
font-size: 11px;
font-weight: 700;
letter-spacing: 0.18em;
color: #f0cf9e;
text-shadow: 0 1px 6px rgba(0,0,0,0.5);
}
.pb-title {
margin-top: 8px;
font-size: 34px;
font-weight: 800;
line-height: 1.2;
letter-spacing: 0.02em;
text-shadow: 0 2px 16px rgba(0,0,0,0.5);
}
.pb-sub {
margin-top: 10px;
font-size: 13px;
line-height: 1.8;
color: rgba(255,255,255,0.9);
text-shadow: 0 1px 8px rgba(0,0,0,0.45);
}
.pb-btn {
margin-top: 16px;
font: inherit;
font-size: 13px;
font-weight: 700;
color: #2b1d12;
background: linear-gradient(135deg, #e6b877, #c98a3b);
border: none;
padding: 11px 22px;
border-radius: 999px;
cursor: pointer;
box-shadow: 0 8px 20px rgba(0,0,0,0.3);
transition: transform 0.2s ease;
}
.pb-btn:hover { transform: translateY(-2px); }
.pb-btn:active { transform: scale(0.97); }
/* backdrop-filter 非対応時は暗幕を強めて可読性を維持 */
@supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
.pb-scrim {
background: linear-gradient(
to bottom,
rgba(43,29,18,0.45) 0%,
rgba(43,29,18,0.1) 35%,
rgba(43,29,18,0.45) 60%,
rgba(43,29,18,0.85) 100%
);
}
}
@media (prefers-reduced-motion: reduce) {
.pb-btn, .pb-links a { transition: none; }
}
JavaScript
// メニューCTAの軽い反応(プログレッシブブラーはCSSが主役)
(() => {
const btn = document.querySelector(".pb-btn");
if (!btn) return; // null安全
btn.addEventListener("click", () => {
const label = btn.textContent;
btn.textContent = "本日のおすすめ:琥珀ハニーラテ";
setTimeout(() => { btn.textContent = label; }, 1800);
});
})();
コード
HTML
<!-- プログレッシブブラー: 背景写真の下端へ向け段階的にボケる層を重ね、見出し/ナビの可読性を上げる -->
<div class="pb-stage">
<!-- 背景写真(picsum) -->
<img class="pb-photo" src="https://picsum.photos/id/1018/800/500" alt="" loading="lazy" decoding="async" />
<!-- 段階的ブラー層: 各層で blur を強め mask で帯状に効かせる(下ほど強く) -->
<div class="pb-blur pb-blur-1" aria-hidden="true"></div>
<div class="pb-blur pb-blur-2" aria-hidden="true"></div>
<div class="pb-blur pb-blur-3" aria-hidden="true"></div>
<div class="pb-blur pb-blur-4" aria-hidden="true"></div>
<!-- 暗幕グラデで文字コントラストを底上げ(フォールバックも兼ねる) -->
<div class="pb-scrim" aria-hidden="true"></div>
<!-- 前景UI -->
<header class="pb-nav">
<span class="pb-logo">Aurora<span>App</span></span>
<nav class="pb-links">
<a href="#">機能</a>
<a href="#">料金</a>
<a href="#">事例</a>
</nav>
</header>
<div class="pb-hero">
<p class="pb-eyebrow">2026 TREND</p>
<h1 class="pb-title">下端に溶けるブラー</h1>
<p class="pb-sub">背景が下に向かって滑らかにボケるので、写真の上でも文字がくっきり読めます。</p>
</div>
</div>
CSS
/* プログレッシブブラー: blur量の異なる backdrop-filter 層を mask グラデで帯状に重ね、下端ほど強くボカす */
* { box-sizing: border-box; margin: 0; padding: 0; }
.pb-stage {
position: relative;
min-height: 360px;
overflow: hidden;
display: flex;
flex-direction: column;
font-family: "Segoe UI", "Hiragino Sans", system-ui, sans-serif;
color: #fff;
background: #0b1120; /* 画像読込前/失敗時の下地 */
}
/* 背景写真は全面に敷く */
.pb-photo {
position: absolute;
inset: 0;
width: 100%;
height: 100%;
object-fit: cover;
z-index: 0;
}
/* ブラー層共通: 全面に重ね、mask で効かせる範囲を限定する */
.pb-blur {
position: absolute;
inset: 0;
z-index: 1;
pointer-events: none;
/* 下端ほど不透明=ボケが強い帯。上端は透明でくっきり残す */
-webkit-mask-image: linear-gradient(to bottom, transparent 0%, transparent var(--from), #000 var(--to));
mask-image: linear-gradient(to bottom, transparent 0%, transparent var(--from), #000 var(--to));
}
/* 4段階: 下に向かうほど blur を強め、開始位置(--from)を下げて積層 */
.pb-blur-1 { --from: 30%; --to: 50%; -webkit-backdrop-filter: blur(2px); backdrop-filter: blur(2px); }
.pb-blur-2 { --from: 45%; --to: 62%; -webkit-backdrop-filter: blur(5px); backdrop-filter: blur(5px); }
.pb-blur-3 { --from: 60%; --to: 76%; -webkit-backdrop-filter: blur(10px); backdrop-filter: blur(10px); }
.pb-blur-4 { --from: 74%; --to: 90%; -webkit-backdrop-filter: blur(18px); backdrop-filter: blur(18px); }
/* 暗幕: 下端を暗くして白文字のコントラストを確保(backdrop-filter非対応でも可読性維持) */
.pb-scrim {
position: absolute;
inset: 0;
z-index: 2;
pointer-events: none;
background: linear-gradient(
to bottom,
rgba(8, 12, 26, 0.45) 0%,
rgba(8, 12, 26, 0) 28%,
rgba(8, 12, 26, 0) 52%,
rgba(8, 12, 26, 0.55) 100%
);
}
/* 上部ナビ */
.pb-nav {
position: relative;
z-index: 3;
display: flex;
align-items: center;
justify-content: space-between;
padding: 16px 22px;
}
.pb-logo {
font-weight: 800;
font-size: 17px;
letter-spacing: 0.02em;
text-shadow: 0 1px 6px rgba(0, 0, 0, 0.35);
}
.pb-logo span { color: #7fd0ff; }
.pb-links {
display: flex;
gap: 18px;
}
.pb-links a {
color: rgba(255, 255, 255, 0.92);
text-decoration: none;
font-size: 13px;
text-shadow: 0 1px 5px rgba(0, 0, 0, 0.35);
transition: opacity 0.2s ease;
}
.pb-links a:hover { opacity: 0.65; }
/* 下部ヒーロー: 一番ボケる帯の上に固定的に置く */
.pb-hero {
position: relative;
z-index: 3;
margin-top: auto;
padding: 0 26px 30px;
max-width: 560px;
}
.pb-eyebrow {
font-size: 11px;
font-weight: 700;
letter-spacing: 0.22em;
color: #9bdcff;
margin-bottom: 8px;
}
.pb-title {
font-size: 38px;
font-weight: 800;
line-height: 1.15;
letter-spacing: 0.01em;
text-shadow: 0 2px 16px rgba(0, 0, 0, 0.4);
}
.pb-sub {
margin-top: 12px;
font-size: 14px;
line-height: 1.8;
color: rgba(255, 255, 255, 0.9);
text-shadow: 0 1px 8px rgba(0, 0, 0, 0.35);
}
/* backdrop-filter 非対応ブラウザ向けフォールバック:
ブラー層が無効でも、暗幕を少し強めて文字を守る */
@supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
.pb-scrim {
background: linear-gradient(
to bottom,
rgba(8, 12, 26, 0.5) 0%,
rgba(8, 12, 26, 0.1) 35%,
rgba(8, 12, 26, 0.45) 60%,
rgba(8, 12, 26, 0.82) 100%
);
}
}
JavaScript
// プログレッシブブラーは CSS のみで完結(JS不要)
🤖 AIエージェント用プロンプト
このままコピーしてAIに貼り付け「追加する場所」だけ書き換えればOK
あなたは熟練のフロントエンドエンジニアです。私のWebサイトに「プログレッシブブラー」の効果を追加してください。
# 追加してほしい効果
プログレッシブブラー(背景 & グラデーション)
下端に向かって段階的に強くぼかす backdrop-filter 層を mask グラデで重ね、写真の上に置いた固定ナビと見出しの可読性を高める手法。Apple/iOS 風の上品なフェードブラーで、ヒーローやアプリUIに使えます。
# 追加する場所
👉【ここに対象箇所を記入:例「トップのヒーローセクション」「お問い合わせボタン」「記事カードの一覧」など】
# 参考実装(この見た目・挙動を再現してください)
【HTML】
<!-- プログレッシブブラー: 背景写真の下端へ向け段階的にボケる層を重ね、見出し/ナビの可読性を上げる -->
<div class="pb-stage">
<!-- 背景写真(picsum) -->
<img class="pb-photo" src="https://picsum.photos/id/1018/800/500" alt="" loading="lazy" decoding="async" />
<!-- 段階的ブラー層: 各層で blur を強め mask で帯状に効かせる(下ほど強く) -->
<div class="pb-blur pb-blur-1" aria-hidden="true"></div>
<div class="pb-blur pb-blur-2" aria-hidden="true"></div>
<div class="pb-blur pb-blur-3" aria-hidden="true"></div>
<div class="pb-blur pb-blur-4" aria-hidden="true"></div>
<!-- 暗幕グラデで文字コントラストを底上げ(フォールバックも兼ねる) -->
<div class="pb-scrim" aria-hidden="true"></div>
<!-- 前景UI -->
<header class="pb-nav">
<span class="pb-logo">Aurora<span>App</span></span>
<nav class="pb-links">
<a href="#">機能</a>
<a href="#">料金</a>
<a href="#">事例</a>
</nav>
</header>
<div class="pb-hero">
<p class="pb-eyebrow">2026 TREND</p>
<h1 class="pb-title">下端に溶けるブラー</h1>
<p class="pb-sub">背景が下に向かって滑らかにボケるので、写真の上でも文字がくっきり読めます。</p>
</div>
</div>
【CSS】
/* プログレッシブブラー: blur量の異なる backdrop-filter 層を mask グラデで帯状に重ね、下端ほど強くボカす */
* { box-sizing: border-box; margin: 0; padding: 0; }
.pb-stage {
position: relative;
min-height: 360px;
overflow: hidden;
display: flex;
flex-direction: column;
font-family: "Segoe UI", "Hiragino Sans", system-ui, sans-serif;
color: #fff;
background: #0b1120; /* 画像読込前/失敗時の下地 */
}
/* 背景写真は全面に敷く */
.pb-photo {
position: absolute;
inset: 0;
width: 100%;
height: 100%;
object-fit: cover;
z-index: 0;
}
/* ブラー層共通: 全面に重ね、mask で効かせる範囲を限定する */
.pb-blur {
position: absolute;
inset: 0;
z-index: 1;
pointer-events: none;
/* 下端ほど不透明=ボケが強い帯。上端は透明でくっきり残す */
-webkit-mask-image: linear-gradient(to bottom, transparent 0%, transparent var(--from), #000 var(--to));
mask-image: linear-gradient(to bottom, transparent 0%, transparent var(--from), #000 var(--to));
}
/* 4段階: 下に向かうほど blur を強め、開始位置(--from)を下げて積層 */
.pb-blur-1 { --from: 30%; --to: 50%; -webkit-backdrop-filter: blur(2px); backdrop-filter: blur(2px); }
.pb-blur-2 { --from: 45%; --to: 62%; -webkit-backdrop-filter: blur(5px); backdrop-filter: blur(5px); }
.pb-blur-3 { --from: 60%; --to: 76%; -webkit-backdrop-filter: blur(10px); backdrop-filter: blur(10px); }
.pb-blur-4 { --from: 74%; --to: 90%; -webkit-backdrop-filter: blur(18px); backdrop-filter: blur(18px); }
/* 暗幕: 下端を暗くして白文字のコントラストを確保(backdrop-filter非対応でも可読性維持) */
.pb-scrim {
position: absolute;
inset: 0;
z-index: 2;
pointer-events: none;
background: linear-gradient(
to bottom,
rgba(8, 12, 26, 0.45) 0%,
rgba(8, 12, 26, 0) 28%,
rgba(8, 12, 26, 0) 52%,
rgba(8, 12, 26, 0.55) 100%
);
}
/* 上部ナビ */
.pb-nav {
position: relative;
z-index: 3;
display: flex;
align-items: center;
justify-content: space-between;
padding: 16px 22px;
}
.pb-logo {
font-weight: 800;
font-size: 17px;
letter-spacing: 0.02em;
text-shadow: 0 1px 6px rgba(0, 0, 0, 0.35);
}
.pb-logo span { color: #7fd0ff; }
.pb-links {
display: flex;
gap: 18px;
}
.pb-links a {
color: rgba(255, 255, 255, 0.92);
text-decoration: none;
font-size: 13px;
text-shadow: 0 1px 5px rgba(0, 0, 0, 0.35);
transition: opacity 0.2s ease;
}
.pb-links a:hover { opacity: 0.65; }
/* 下部ヒーロー: 一番ボケる帯の上に固定的に置く */
.pb-hero {
position: relative;
z-index: 3;
margin-top: auto;
padding: 0 26px 30px;
max-width: 560px;
}
.pb-eyebrow {
font-size: 11px;
font-weight: 700;
letter-spacing: 0.22em;
color: #9bdcff;
margin-bottom: 8px;
}
.pb-title {
font-size: 38px;
font-weight: 800;
line-height: 1.15;
letter-spacing: 0.01em;
text-shadow: 0 2px 16px rgba(0, 0, 0, 0.4);
}
.pb-sub {
margin-top: 12px;
font-size: 14px;
line-height: 1.8;
color: rgba(255, 255, 255, 0.9);
text-shadow: 0 1px 8px rgba(0, 0, 0, 0.35);
}
/* backdrop-filter 非対応ブラウザ向けフォールバック:
ブラー層が無効でも、暗幕を少し強めて文字を守る */
@supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
.pb-scrim {
background: linear-gradient(
to bottom,
rgba(8, 12, 26, 0.5) 0%,
rgba(8, 12, 26, 0.1) 35%,
rgba(8, 12, 26, 0.45) 60%,
rgba(8, 12, 26, 0.82) 100%
);
}
}
【JavaScript】
// プログレッシブブラーは CSS のみで完結(JS不要)
# 外部ライブラリ
なし(追加ライブラリ不要)
# 守ってほしいこと
- 既存のHTML構造・レイアウト・デザインを壊さないこと。必要に応じてクラス名・色・サイズを私のサイトに合わせて調整してよい。
- クラス名やidが既存と衝突しないよう、必要なら接頭辞で名前空間を分けること。
- レスポンシブ対応と prefers-reduced-motion への配慮を入れること。
- 私のサイトのフレームワーク(React / Vue / 素のHTML など)に合わせて実装すること。不明な場合は素のHTML/CSS/JSで提示し、組み込み手順も説明すること。
- 変更後の確認手順も簡潔に教えてください。