Glassmorphism — backdrop-filter Performance on Mobile
Frosted glass nav bars photograph beautifully in Figma. On a three-year-old Android phone, the same backdrop-filter: blur(20px) on a sticky header can turn scroll into a slideshow. Glassmorphism is a visual style, not a free GPU effect.
The CSS looks simple. The cost is sampling and blurring whatever sits behind the element — continuously, while content moves.
What the browser is actually doing
.glass {
background: rgba(255, 255, 255, 0.55);
backdrop-filter: blur(12px);
-webkit-backdrop-filter: blur(12px);
border: 1px solid rgba(255, 255, 255, 0.35);
}
backdrop-filter composites the backdrop into an offscreen buffer, applies the filter, then draws your translucent fill on top. Large blur radii and large surfaces (full-width sticky headers, full-screen modals) multiply the work. Safari and Chromium both support it; they do not have identical performance profiles, and older WebViews may ignore the property entirely.
Always include -webkit-backdrop-filter for Safari. Always plan a non-blur look.
Mobile-first constraints that keep FPS alive
- Shrink the blurred region. Prefer a compact toolbar over a 200px frosted hero that covers half the fold.
- Lower the radius on small screens.
blur(8px)often reads as “glass” whileblur(24px)only burns battery. - Avoid stacking multiple glass layers. Nested blur-on-blur is a known jank recipe.
- Watch
position: sticky+ blur + heavy DOM behind it. Infinite feeds behind a glass chrome are the worst case. - Offer a solid fallback.
.glass {
background: rgba(20, 24, 32, 0.92);
}
@supports ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
.glass {
background: rgba(20, 24, 32, 0.55);
backdrop-filter: blur(10px);
-webkit-backdrop-filter: blur(10px);
}
}
@media (max-width: 768px) {
.glass {
backdrop-filter: blur(6px);
-webkit-backdrop-filter: blur(6px);
}
}
@media (prefers-reduced-transparency: reduce) {
.glass {
backdrop-filter: none;
-webkit-backdrop-filter: none;
background: rgba(20, 24, 32, 0.96);
}
}
If you need to prototype fills, blur, and border tokens quickly, a glassmorphism CSS playground helps you see the tradeoff before you paste magic numbers into production.
Design choices that look intentional, not gimmicky
Glass reads best when the backdrop has something to show: soft gradients, photography, or colorful UI. Over a flat gray app shell, blur just looks like a muddy translucent rectangle.
Contrast matters. White text on rgba(255,255,255,0.4) fails WCAG fast. Tint the glass dark enough for type, or place text on an opaque inner surface and reserve blur for chrome only.
Borders and subtle inner highlights sell the “glass edge” more than extreme blur. Many strong UIs use 8–12px blur plus a 1px light border — not 40px blur with no structure.
When to skip the effect
- Data-heavy dashboards with constant repainting
- Low-end or battery-sensitive audiences
- Critical path LCP heroes where every composite counts
- Environments where
prefers-reduced-transparencyis common
A matte translucent panel (background: color-mix(...) or solid rgba) often communicates the same hierarchy without the filter cost.
FAQ
Is backdrop-filter “free” if hardware acceleration is on?
No. It is accelerated relative to software blur, not free relative to opaque UI.
Why does Safari look different from Chrome?
Different blur implementations, gamma, and overscroll behavior. Always screenshot both.
Can I animate blur radius?
You can; you usually should not on scroll-linked UI. Animate opacity of a pre-styled layer instead.
Ship glass as an accent, measure on a mid-tier phone, and keep a solid background ready. Pretty CSS that drops frames is still a bug.