← All posts
AccessibilityCSS

Glassmorphism, done accessibly

July 16, 2026 · 7 min read

Frosted glass is the most seductive UI trend in years — and the one most likely to quietly fail a real user. Translucent panels, blurred backdrops and soft gradients photograph beautifully in a portfolio and then, in production, put pale text on a busy background where a third of your visitors can't read it. The look isn't the problem. Shipping it without a few guardrails is.

Here are the four places glassmorphism breaks accessibility, and the concrete fix for each — the same decisions baked into Farvist so you get them for free.

1. Contrast on a moving target

The core tension of glass is that the surface is translucent: whatever is behind it bleeds through. That's the whole effect, and it's also why text contrast is unpredictable — the "background" of your text isn't a fixed color, it's a blurred average of whatever scrolled underneath it.

The fix is two-part. First, the glass fill needs enough opacity that text sits on a reasonably stable base — a fill that's 6–10% white on a dark theme is enough to anchor readability without killing the effect. Second, and more important, brand colors that look fine as a button fill are usually too dark to use as text. Farvist's electric-violet primary (#6d4af5) scores only about 3.7:1 as text on the dark surface — below the WCAG AA threshold of 4.5:1. So the framework exposes a separate, lighter token, --fv-primary-text, tuned to clear AA (~6:1), and uses that for links and text while the raw primary stays for fills. One color for painting, a readable sibling for reading.

/* fills use the brand color… */
.btn-primary { background: var(--fv-primary); }
/* …but text uses the readable sibling */
a { color: var(--fv-primary-text); }

2. When the blur isn't there

The property that makes glass, backdrop-filter, isn't universally supported, and some users disable it. When it fails, a translucent panel doesn't gracefully become opaque — it stays see-through, and now your text really is floating on raw background. That's the worst-case readability failure, and it happens silently.

The answer is a progressive-enhancement fallback: assume the surface must be readable without blur, and only add the frost when the browser can honor it.

.glass {
  background: var(--fv-surface-solid);   /* opaque, always readable */
}
@supports (backdrop-filter: blur(1px)) {
  .glass {
    background: var(--fv-glass-bg);       /* translucent frost */
    backdrop-filter: blur(16px) saturate(140%);
  }
}

Every glass surface in Farvist ships this way, so a browser that can't blur gets a solid panel instead of unreadable text. The effect degrades; the content never does.

3. Losing the user's place

Soft, low-contrast surfaces make it easy for keyboard focus to disappear. If your focus ring is a subtle glow that blends into a blurred panel, keyboard and switch users can't tell where they are. Glass UI needs focus states that are more assertive than usual, not less — a solid, high-contrast ring via :focus-visible, never removed, never reduced to a color shift. And because the whole aesthetic leans on color, nothing meaningful should be communicated by color alone: a form error is a red border and a message and an aria-invalid flag, a status dot is a color and a text label.

4. Motion that doesn't ask permission

Glass tends to travel with motion — drifting gradient backdrops, floating cards, pulsing glows. For someone with vestibular sensitivity, that ambient movement ranges from distracting to nauseating. The rule is simple and non-negotiable: every animation sits behind @media (prefers-reduced-motion: reduce) and switches off (or drops to a single static frame) when the user has asked for less. It's one media query, and it's the difference between a delightful site and one a real person has to close.

The checklist

If you're building frosted UI by hand, this is the whole list:

Farvist verifies the automatable parts of this with axe-core on every build (0 violations across the docs and templates, in both themes). Automated tools can't catch everything — they famously can't evaluate the contrast of gradient text, which we check by hand — but they catch the regressions that slip in between careful reviews.

The point isn't that glassmorphism is dangerous. It's that "looks great in a screenshot" and "works for everyone" are two different bars, and the gap between them is a handful of decisions you can make once. Make them once, and the beautiful version is also the accessible one.

Farvist bakes all of the above in — see the accessibility notes, or read how the theming architecture makes the readable-text token possible.


← All posts Read the docs →