CSSã®backdrop-filterã®åãæ¢æ±ããé åçãªèŠèŠå¹æã®äœæãUIèŠçŽ ã®åŒ·åããŠã§ããã¶ã€ã³ã«æ·±ã¿ãå ããæ¹æ³ãåŠã³ãŸããæ§ã ãªãã©ãŠã¶ãããã€ã¹ã§ã®å®è£ ã«é¢ããå®è·µçãªãã¯ããã¯ãšãã¹ããã©ã¯ãã£ã¹ã玹ä»ããŸãã
CSS Backdrop Filter: é«åºŠãªèŠèŠå¹æããã¹ã¿ãŒãã
backdrop-filter
CSSããããã£ã¯ãèŠçŽ ã®èåŸã«ããé åã«ãã£ã«ã¿ãŒãé©çšããããšã§ãé
åçãªèŠèŠå¹æãçã¿åºã匷åãªããŒã«ã§ããèŠçŽ èªäœã«åœ±é¿ãäžããéåžžã®filter
ããããã£ãšã¯ç°ãªããbackdrop-filter
ã¯èŠçŽ ã®*èåŸã«ãã*ã³ã³ãã³ãã察象ãšããããããŠããŒã¯ã§æŽç·Žããããã¶ã€ã³ã®å¯èœæ§ãåºãããŸããããã«ãããããã¬ã©ã¹å¹æãåçãªãªãŒããŒã¬ã€ããã®ä»ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ããŠã§ããµã€ãå
šäœã®çŸèгãé«ããé
åçãªèŠèŠäœéšãåµé ããæãéãããŸãã
Backdrop Filterã®åºæ¬ãçè§£ãã
backdrop-filterãšã¯ïŒ
backdrop-filter
ããããã£ã¯ãèŠçŽ ã®èæ¯ïŒèåŸã«ããé åïŒã«1ã€ä»¥äžã®ãã£ã«ã¿ãŒå¹æãé©çšããŸããããã¯ãèŠçŽ èªäœã¯åœ±é¿ãåããããã®èåŸã«ãããã¹ãŠãæå®ãããèŠèŠç倿ãåããããšãæå³ããŸããbackdrop-filter
ã§äœ¿çšã§ããå€ã¯ãæšæºã®filter
ããããã£ãšåãã§ã以äžã®ãããªãã®ããããŸãïŒ
blur()
: ãŒãã广ãé©çšããŸããbrightness()
: æããã調æŽããŸããcontrast()
: ã³ã³ãã©ã¹ãã調æŽããŸããgrayscale()
: èæ¯ãã°ã¬ãŒã¹ã±ãŒã«ã«å€æããŸããhue-rotate()
: è²ã®è²çžãå転ãããŸããinvert()
: è²ãå転ãããŸããopacity()
: äžéæåºŠã調æŽããŸããsaturate()
: 圩床ã調æŽããŸããsepia()
: ã»ãã¢èª¿ãé©çšããŸããurl()
: å¥ã®ãã¡ã€ã«ã§å®çŸ©ãããSVGãã£ã«ã¿ãŒãé©çšããŸããnone
: ãã£ã«ã¿ãŒã¯é©çšãããŸããã
è€æ°ã®ãã£ã«ã¿ãŒãçµã¿åãããããšã§ãããè€éã§ã«ã¹ã¿ãã€ãºããã广ãäœæã§ããŸããäŸãã°ãèæ¯ã«ãŒãããšæãã調æŽã®äž¡æ¹ãé©çšããããšãã§ããŸãã
æ§æ
backdrop-filter
ã䜿çšããããã®åºæ¬çãªæ§æã¯åçŽã§ãïŒ
element {
backdrop-filter: filter-function(value) filter-function(value) ...;
}
äŸãã°ãèŠçŽ ã®èæ¯ã«5ãã¯ã»ã«ã®ãŒãããé©çšããã«ã¯ã次ã®CSSã䜿çšããŸãïŒ
element {
backdrop-filter: blur(5px);
}
å®è·µçãªäŸãšãŠãŒã¹ã±ãŒã¹
1. ããã¬ã©ã¹ïŒããã¹ãã¬ã©ã¹ïŒå¹æ
backdrop-filter
ã®æã人æ°ã®ããäœ¿çšæ³ã®1ã€ã¯ãããã¬ã©ã¹å¹æãäœæããããšã§ããããã¯ãèŠçŽ ã®èåŸã«ããã³ã³ãã³ãããŒãããŠãåéæã§æã£ããããªå€èгãäžãããã®ã§ããããã¯ãããã²ãŒã·ã§ã³ã¡ãã¥ãŒãã¢ãŒãã«ããŸãã¯ã³ã³ãã³ãã«ãªãŒããŒã¬ã€ããä»ã®UIèŠçŽ ã«ç¹ã«åœ¹ç«ã¡ãŸãã
.frosted-glass {
background-color: rgba(255, 255, 255, 0.2);
backdrop-filter: blur(10px);
-webkit-backdrop-filter: blur(10px); /* For Safari */
border: 1px solid rgba(255, 255, 255, 0.3);
padding: 20px;
border-radius: 10px;
}
解説ïŒ
background-color: rgba(255, 255, 255, 0.2);
: èŠçŽ ã«åéæã®çœãèæ¯ãèšå®ããŸããbackdrop-filter: blur(10px);
: èŠçŽ ã®èåŸã«ããã³ã³ãã³ãã«10ãã¯ã»ã«ã®ãŒãããé©çšããŸãã-webkit-backdrop-filter: blur(10px);
: Safariãšã®äºææ§ã確ä¿ããããã®ãã³ããŒãã¬ãã£ãã¯ã¹ã§ããSafariã§ã¯ãã®ãã¬ãã£ãã¯ã¹ãå¿ èŠã§ããborder: 1px solid rgba(255, 255, 255, 0.3);
: 埮åŠãªå¢çç·ã远å ããŸããpadding: 20px;
ãšborder-radius: 10px;
: æŽç·ŽãããèŠãç®ã®ããã«ãäœçœãšè§äžžã远å ããŸãã
ããã«ãããèŠèŠçã«é åçãªããã¬ã©ã¹å¹æãçãŸããŸãããã«ã¹ã¯ãªãŒã³ã®ç»åã®äžã«éãªãããã²ãŒã·ã§ã³ã¡ãã¥ãŒã§ããã䜿çšãããããšãæ³åããŠã¿ãŠãã ããããŠãŒã¶ãŒãã¹ã¯ããŒã«ãããšãã¡ãã¥ãŒã®èåŸã«ãããŒãããã³ã³ãã³ãã埮åŠã«å€åããåçã§é åçãªäœéšãæäŸããŸãã
2. åçãªç»åãªãŒããŒã¬ã€
backdrop-filter
ã䜿çšããŠãèåŸã®ã³ã³ãã³ãã«åºã¥ããŠèª¿æŽãããåçãªç»åãªãŒããŒã¬ã€ãäœæã§ããŸããããã¯ãç»åãåç»ã®äžã«é
眮ãããããã¹ãã®å¯èªæ§ãåäžãããã®ã«åœ¹ç«ã¡ãŸãã
.image-overlay {
position: relative;
width: 100%;
height: 300px;
overflow: hidden;
}
.image-overlay img {
width: 100%;
height: 100%;
object-fit: cover;
}
.image-overlay .text-container {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
color: white;
padding: 20px;
background-color: rgba(0, 0, 0, 0.5);
backdrop-filter: blur(5px);
-webkit-backdrop-filter: blur(5px);
border-radius: 5px;
text-align: center;
}
解説ïŒ
.image-overlay
ã¯ã©ã¹ã¯ãã³ã³ããã«åºå®ã®é«ããšå¹ ãèšå®ããç»åãå®çŸ©ãããå¢çå ã«åãŸãããã«ããŸãã.image-overlay img
ã¯ã©ã¹ã¯ãç»åãã³ã³ããå šäœãèŠãããã«ã¹ã¿ã€ã«ãèšå®ããŸãã.image-overlay .text-container
ã¯ã©ã¹ã¯ãããã¹ããç»åã®äžå€®ã«é 眮ãã5ãã¯ã»ã«ã®ãŒãããããã£ãåéæã®èæ¯ãé©çšããŸãã
ããã«ãããèåŸã«ããç»åã³ã³ãã³ãã«é¢ä¿ãªããããã¹ãã®å¯èªæ§ãä¿ãããŸããããŸããŸãªåœã®ç»åã玹ä»ããæ è¡ããã°ã§ããã䜿çšããããšãèããŠã¿ãŠãã ããããªãŒããŒã¬ã€ã«ããããã£ãã·ã§ã³ãåžžã«èªã¿ããããªãããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãåäžããŸãã
3. ã¢ãŒãã«ãšãã€ã¢ãã°ã®åŒ·å
ã¢ãŒãã«ããã€ã¢ãã°ã¯ãå€ãã®å Žåãäžã«ããã³ã³ãã³ããšã®èŠèŠçãªåé¢ããæ©æµãåããŸããbackdrop-filter
ã䜿çšãããšãã¢ãŒãã«ã匷調ãããŠãŒã¶ãŒã®æ³šæãåŒãããã®ãããããªãã广çãªæ¹æ³ãäœãåºãããšãã§ããŸãã
.modal-overlay {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, 0.5);
backdrop-filter: blur(3px);
-webkit-backdrop-filter: blur(3px);
display: flex;
justify-content: center;
align-items: center;
}
.modal-content {
background-color: white;
padding: 20px;
border-radius: 5px;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.3);
}
解説ïŒ
.modal-overlay
ã¯ã©ã¹ã¯ãåéæã®é»ãèæ¯ãš3ãã¯ã»ã«ã®ãŒãããæã€ãã«ã¹ã¯ãªãŒã³ãªãŒããŒã¬ã€ãäœæããŸãã.modal-content
ã¯ã©ã¹ã¯ãã¢ãŒãã«ã®ã³ã³ãã³ããçœãèæ¯ãããã£ã³ã°ãè§äžžããããŠåŸ®åŠãªåœ±ã§ã¹ã¿ã€ã«ä»ãããŸãã
ãŒãããèæ¯ã¯ãã¢ãŒãã«ãèŠèŠçã«åé¢ããããŒãžã®ä»ã®éšåããéç«ãããã®ã«åœ¹ç«ã¡ãŸããããã¯ãéèŠãªéç¥ããŠãŒã¶ãŒã®æäœãå¿ èŠãšãããã©ãŒã ã«ç¹ã«äŸ¿å©ã§ãã
4. è€æ°ãã£ã«ã¿ãŒã«ããã¬ã€ã€ãŒå¹æã®äœæ
è€æ°ã®ãã£ã«ã¿ãŒãçµã¿åãããŠãããè€éã§èŠèŠçã«è峿·±ã广ãäœæã§ããŸããäŸãã°ããŒãããæãããäžéæåºŠãäžç·ã«äœ¿çšããŠãç¹å®ã®å€èгãå®çŸã§ããŸãã
.layered-effect {
background-color: rgba(0, 123, 255, 0.3);
backdrop-filter: blur(5px) brightness(1.2) opacity(0.8);
-webkit-backdrop-filter: blur(5px) brightness(1.2) opacity(0.8);
padding: 20px;
border-radius: 10px;
}
解説ïŒ
background-color: rgba(0, 123, 255, 0.3);
: åéæã®éãèæ¯ãèšå®ããŸããbackdrop-filter: blur(5px) brightness(1.2) opacity(0.8);
: 5ãã¯ã»ã«ã®ãŒãããé©çšããæããã20%å¢å ãããäžéæåºŠã80%ã«æžå°ãããŸãã
ããã«ãããèŠçŽ ã«æ·±ã¿ãšèŠèŠçãªé¢çœããå ããã¬ã€ã€ãŒå¹æãçãŸããŸãããŠããŒã¯ã§ã«ã¹ã¿ãã€ãºãããçµæãåŸãããã«ãããŸããŸãªãã£ã«ã¿ãŒã®çµã¿åããã詊ããŠã¿ãŠãã ããã
ãã©ãŠã¶ã®äºææ§ãšãã©ãŒã«ããã¯
backdrop-filter
ã¯çŸä»£ã®ãã©ãŠã¶ã§åºããµããŒããããŠããŸãããå€ããã©ãŠã¶ãšã®äºææ§ãèæ
®ããé©åãªãã©ãŒã«ããã¯ãæäŸããããšãäžå¯æ¬ ã§ãã
ãã©ãŠã¶ã®ãµããŒãç¶æ³
backdrop-filter
ã¯ä»¥äžã®ãã©ãŠã¶ã§ãµããŒããããŠããŸãïŒ
- Chrome 76+
- Edge 79+
- Firefox 70+
- Safari 9+
- Opera 63+
Internet Explorerã¯backdrop-filter
ããµããŒãããŠããŸããã
ãã©ãŒã«ããã¯æŠç¥
backdrop-filter
ããµããŒãããŠããªããã©ãŠã¶ã®ããã«ãããã€ãã®ãã¯ããã¯ãçµã¿åãããŠã劥åœãªãã©ãŒã«ããã¯ãæäŸã§ããŸãïŒ
- åè²ã®èæ¯è²ã䜿çšããïŒãã©ãŒã«ããã¯ãšããŠåéæã®èæ¯è²ãèšå®ããŸããããã«ããããŒãã广ããªããŠããããçšåºŠã®èŠèŠçãªåé¢ãæäŸãããŸãã
- JavaScriptã§ãµããŒããæ€åºããïŒJavaScriptã䜿çšããŠãã©ãŠã¶ã
backdrop-filter
ããµããŒãããŠãããã©ãããæ€åºããŸãããµããŒãããŠããªãå Žåã¯ãç°ãªãã¹ã¿ã€ã«ãã¯ã©ã¹ãé©çšããŸãã
äŸïŒ
.element {
background-color: rgba(255, 255, 255, 0.5); /* Fallback */
backdrop-filter: blur(5px);
-webkit-backdrop-filter: blur(5px); /* Safari */
}
ãã®äŸã§ã¯ãbackdrop-filter
ããµããŒãããŠããªããã©ãŠã¶ã¯ãåã«åéæã®çœãèæ¯ã衚瀺ãããŸãããµããŒãããŠãããã©ãŠã¶ã§ã¯ããŒãããèæ¯å¹æã衚瀺ãããŸãã
ããè€éãªãã©ãŒã«ããã¯ã·ããªãªã®ããã«JavaScriptã䜿çšããããšãã§ããŸãïŒ
if (!('backdropFilter' in document.documentElement.style || 'webkitBackdropFilter' in document.documentElement.style)) {
// Backdrop filter is not supported
document.querySelector('.element').classList.add('no-backdrop-filter');
}
ãããŠãCSSã§.no-backdrop-filter
ã¯ã©ã¹ã®ã¹ã¿ã€ã«ãå®çŸ©ã§ããŸãïŒ
.element.no-backdrop-filter {
background-color: rgba(255, 255, 255, 0.5);
}
ããã©ãŒãã³ã¹ã«é¢ããèæ ®äºé
backdrop-filter
ãé©çšãããšãç¹ã«äœã¹ããã¯ã®ããã€ã¹ã§ããã©ãŒãã³ã¹ã«åœ±é¿ãäžããå¯èœæ§ããããŸããããã©ãŒãã³ã¹ãæé©åããããã®ãã³ããããã€ã玹ä»ããŸãïŒ
- ãã£ã«ã¿ãŒãæ§ããã«äœ¿çšããïŒç¹ã«è€éãªã¬ã€ã¢ãŠãã§ã¯ã
backdrop-filter
ã®äœ¿ããããé¿ããŠãã ããã - ãã£ã«ã¿ãŒå€ãäœãä¿ã€ïŒãŒããã®å€ãé«ãã»ã©ããŸããã£ã«ã¿ãŒã®çµã¿åãããè€éã§ããã»ã©ãèšç®ã³ã¹ããé«ããªãå¯èœæ§ããããŸãã
- ããŸããŸãªããã€ã¹ã§ãã¹ãããïŒã¹ã ãŒãºãªããã©ãŒãã³ã¹ã確ä¿ããããã«ãããŸããŸãªããã€ã¹ã§ãŠã§ããµã€ãããã¹ãããŠãã ããã
will-change
ã®äœ¿çšãæ€èšããïŒwill-change: backdrop-filter;
ãé©çšãããšãèŠçŽ ã®backdrop-filterã倿Žãããããšããã©ãŠã¶ã«ãã³ããšããŠäŒããããšã§ãããã©ãŒãã³ã¹ãåäžããããšããããŸãããã ãã䜿ãããããšæªåœ±é¿ãåãŒãå¯èœæ§ããããããæ§ããã«æ³šæããŠäœ¿çšããŠãã ããã
é«åºŠãªãã¯ããã¯ãšãã³ã
1. Backdrop Filterã®ã¢ãã¡ãŒã·ã§ã³å
CSSã®ãã©ã³ãžã·ã§ã³ãã¢ãã¡ãŒã·ã§ã³ã䜿çšããŠbackdrop-filter
ããããã£ãã¢ãã¡ãŒã·ã§ã³åã§ããŸããããã«ãããåçã§é
åçãªèŠèŠå¹æãäœæã§ããŸãã
.animated-element {
backdrop-filter: blur(0px);
transition: backdrop-filter 0.3s ease;
}
.animated-element:hover {
backdrop-filter: blur(10px);
}
ãã®äŸã§ã¯ããŠãŒã¶ãŒãèŠçŽ ã«ã«ãŒãœã«ãåããããšããŒãã广ãã¢ãã¡ãŒã·ã§ã³åãããŸãã
2. ãã£ã«ã¿ãŒå€ãžã®å€æ°ã®äœ¿çš
CSS倿°ïŒã«ã¹ã¿ã ããããã£ïŒã䜿çšãããšãã¹ã¿ã€ã«ã·ãŒãå šäœã§ãã£ã«ã¿ãŒå€ã管çããã³æŽæ°ããã®ãç°¡åã«ãªããŸãã
:root {
--blur-value: 5px;
}
.element {
backdrop-filter: blur(var(--blur-value));
}
ããã«ããã1ãæã§ãŒããã®å€ãç°¡åã«å€æŽã§ãããã®å€æ°ã䜿çšãããã¹ãŠã®èŠçŽ ã§æŽæ°ãåæ ãããŸãã
3. ä»ã®CSSããããã£ãšã®çµã¿åãã
backdrop-filter
ã¯ãmix-blend-mode
ãbackground-blend-mode
ãªã©ã®ä»ã®CSSããããã£ãšçµã¿åãããããšã§ãããã«è€éã§è峿·±ãèŠèŠå¹æãçã¿åºãããšãã§ããŸãããããã®ããããã£ã¯ãèŠçŽ ãèåŸã®ã³ã³ãã³ããšã©ã®ããã«ãã¬ã³ããããããå¶åŸ¡ããåµé çãªå¯èœæ§ã倧ããåºããŸãã
æ§ã ãªæ¥çã§ã®äœ¿çšäŸ
backdrop-filter
ããããã£ã¯ãããŸããŸãªæ¥çã§ãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãåäžãããèŠèŠçã«é
åçãªã€ã³ã¿ãŒãã§ãŒã¹ãäœæããããã«é©çšã§ããŸãã以äžã«ããã€ãã®äŸãæããŸãïŒ
- Eã³ããŒã¹ïŒååã«ããŽãªãŒã®ãªãŒããŒã¬ã€ãããã¢ãŒã·ã§ã³ãããŒã«ããã¬ã©ã¹å¹æã䜿çšããŠãç¹å®ã®ååã«æ³šæãåŒããŸãã
- æ è¡ïŒæ è¡ããã°ããŠã§ããµã€ãã§åçãªç»åãªãŒããŒã¬ã€ãäœæããç»åã³ã³ãã³ãã«é¢ä¿ãªãããã¹ãã®å¯èªæ§ã確ä¿ããŸãã
- ã¡ãã£ã¢ïŒãšã³ã¿ãŒãã€ã¡ã³ãïŒãããªãã¬ãŒã€ãŒã®ã³ã³ãããŒã«ãåå¹ã®èæ¯ããŒããããšã§ãæ³šææ£æŒ«ãæå°éã«æããæ©èœã匷åããŸãã
- æè²ïŒãªã³ã©ã€ã³ã³ãŒã¹ãæè²ãã©ãããã©ãŒã ã§ãèæ¯ããŒãããã¢ãŒãã«ãŠã£ã³ããŠã䜿çšããŠéèŠãªæ å ±ã匷調ããŸãã
- ãã«ã¹ã±ã¢ïŒå»çã¢ããªã±ãŒã·ã§ã³åãã«ãããã²ãŒã·ã§ã³ã¡ãã¥ãŒããã€ã¢ãã°ããã¯ã¹ã«ããã¬ã©ã¹å¹æã䜿çšããŠãã¯ãªãŒã³ã§çŠç¹ã®åã£ãã€ã³ã¿ãŒãã§ãŒã¹ãèšèšããŸãã
ã¢ã¯ã»ã·ããªãã£ã«é¢ããèæ ®äºé
backdrop-filter
ã䜿çšããéã«ã¯ãèŠèŠå¹æãé害ã®ãããŠãŒã¶ãŒã«æªåœ±é¿ãäžããªãããã«ãã¢ã¯ã»ã·ããªãã£ãèæ
®ããããšãäžå¯æ¬ ã§ãã以äžã«ããã€ãã®ã¬ã€ãã©ã€ã³ã瀺ããŸãïŒ
- ååãªã³ã³ãã©ã¹ãã確ä¿ããïŒãŒãããèæ¯ã®äžã«ããããã¹ãããã®ä»ã®èŠçŽ ããWCAGã¬ã€ãã©ã€ã³ã«åŸã£ãŠååãªã³ã³ãã©ã¹ãæ¯ãæã€ããã«ããŠãã ããã
- é害ã®ãããŠãŒã¶ãŒã«ä»£æ¿ã¹ã¿ã€ã«ãæäŸããïŒç¹ã«èŠèŠé害ãèªç¥é害ãæã€ãŠãŒã¶ãŒã®ããã«ãbackdrop-filter广ãç¡å¹ã«ãããã匷床ãäžããããããªãã·ã§ã³ãæäŸããŠãã ããã
- æ¯æŽæè¡ã§ãã¹ãããïŒã¹ã¯ãªãŒã³ãªãŒããŒãªã©ã®æ¯æŽæè¡ã§åžžã«ãŠã§ããµã€ãããã¹ããã
backdrop-filter
ããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã劚ããªãããšã確èªããŠãã ããã
çµè«
backdrop-filter
CSSããããã£ã¯ããŠã§ãäžã§é«åºŠãªèŠèŠå¹æãäœæããããã®åŒ·åã§å€çšéãªæ¹æ³ãæäŸããŸãããã®æ©èœãšéçãçè§£ããé©åãªãã©ãŒã«ããã¯ãšããã©ãŒãã³ã¹ã®æé©åãå®è£
ããããšã§ãbackdrop-filter
ã䜿çšããŠãŠã§ããµã€ãã®ãã¶ã€ã³ã匷åããé
åçãªãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãåµé ã§ããŸããããã¬ã©ã¹å¹æããåçãªç»åãªãŒããŒã¬ã€ãŸã§ããã®å¯èœæ§ã¯åºå€§ã§ãæ¢æ±ãããã®ãåŸ
ã£ãŠããŸããèŠèŠå¹æãå
šäœçãªãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãæãªãã®ã§ã¯ãªããåäžãããããšã確å®ã«ããããã«ãã¢ã¯ã»ã·ããªãã£ãšããã©ãŒãã³ã¹ãåªå
ããããšãå¿ããªãã§ãã ããããã©ãŠã¶ã®ãµããŒããåäžãç¶ããã«ã€ããŠãbackdrop-filter
ã¯ééããªããã¹ãŠã®ããã³ããšã³ãéçºè
ã®æŠåšåº«ã«ãããŠããŸããŸãéèŠãªããŒã«ãšãªãã§ãããã