backdrop-filter
要素の後ろに見えるものに、ぼかしなどのフィルターをかけるプロパティ。 すりガラスの表現を、背景画像を複製せずに書けます。
今の書き方
半透明の背景色と組み合わせると、後ろにあるものが何でも、そのままぼけて見えます。 背景画像を複製する必要はありません。
.header {
position: sticky;
top: 0;
background-color: rgb(255 255 255 / 0.6);
backdrop-filter: blur(8px);
}以前の書き方
ページと同じ背景画像を::beforeに固定して敷き直し、filter: blur()でぼかしていました。
後ろが固定の背景画像のときしか使えず、本文の文字などはぼけずに隠れます。
iOSのSafariではfixedが効かないため、ぼかした背景の位置がずれます。
body {
background: url("bg.jpg") center / cover fixed;
}
.header {
position: sticky;
top: 0;
z-index: 0;
overflow: hidden;
}
.header::before {
content: "";
position: absolute;
top: -16px;
right: -16px;
bottom: -16px;
left: -16px;
z-index: -1;
background:
linear-gradient(rgb(255 255 255 / 0.6), rgb(255 255 255 / 0.6)),
url("bg.jpg") center / cover fixed;
filter: blur(8px);
}置き換えるときの注意点
- プレフィックスなしで全ブラウザが使えるのは、Safari 18が対応した2024年9月からです。
それより前のSafariも支える場合は、
-webkit-backdrop-filterも書きます。 none以外を指定すると、中にあるposition: fixedの要素は、画面ではなくその要素を基準に配置されます。 ヘッダーの中にドロワーメニューなどを置いている場合は、ヘッダーの中に閉じ込められます。- 背景色を半透明にしないと、後ろが見えないため、効果が出ません。
- 親に
opacityやfilterなどがあると、ぼけるのはその親より手前にあるものだけになります。
フォールバック
未対応のブラウザでは、ぼけずに半透明の背景色だけになります。
Firefox 123より前は、GPUの種類によって効かないことがあり、その場合も同じ見た目になります。
文字が読みにくくなる場合は、@supports notで背景色を濃くします。
@supports not (
(backdrop-filter: blur(8px)) or (-webkit-backdrop-filter: blur(8px))
) {
.header {
background-color: rgb(255 255 255 / 0.9);
}
}Browser Support
Chrome
v76+2019-07-30Edge
v79+2020-01-15プレフィックス
v17 - v79-webkit-backdrop-filterSafari
v18+2024-09-16プレフィックス
v9から-webkit-backdrop-filterSafari (iOS)
v18+2024-09-16プレフィックス
v9から-webkit-backdrop-filterFirefox
v103+2022-07-26