← All essays
Design9 min read

Liquid Glass Interfaces: Depth Without Noise

Blur is not a design system. A practical recipe for surfaces that feel physical without wrecking contrast, hierarchy, or frame rate.

Abstract cover artwork for this essay

Glassmorphism got a bad reputation because most implementations stopped at backdrop-filter: blur(). A frosted rectangle floating on a busy gradient is a texture, not an interface. Real depth comes from a consistent light source, a legible hierarchy, and restraint.

When I redesigned this journal, I gave myself one constraint: every glass surface must still be readable on a cheap laptop, in daylight, with reduced motion enabled. That constraint turned out to be the whole design method.

Start with a light source

Physical glass is convincing because it has a highlight on one edge and a soft shadow on the opposite one. Pick a single direction — here, 135 degrees from the top-left — and never break it. Every panel, chip, and button inherits the same specular line.

.glass {
  position: relative;
  background: linear-gradient(135deg,
              rgba(255,255,255,.10), rgba(255,255,255,.035));
  backdrop-filter: blur(22px) saturate(170%);
  border: 1px solid rgba(255,255,255,.12);
  box-shadow: 0 24px 60px rgba(0,0,0,.40),
              inset 0 1px 0 rgba(255,255,255,.22),
              inset 0 -1px 0 rgba(255,255,255,.04);
}

That inset top line does more for perceived depth than any amount of blur. Remove it and the card immediately reads as a flat translucent sticker.

The three-layer recipe

I treat each surface as three stacked layers, from back to front:

  1. Atmosphere — slow-moving colour fields behind everything. They give the blur something to refract.
  2. Surface — the glass itself: tint, blur, hairline border, specular inset.
  3. Content — typography and controls, always on top, always at full opacity.

The mistake is letting the atmosphere leak into the content layer. Text should never be blurred, never be semi-transparent, and never sit directly on a moving blob. If a headline competes with the background, the background has already won.

Depth is a hierarchy tool. The moment it becomes decoration, it becomes noise.

A note pinned above my desk

Contrast is the constraint

Translucent panels inherit whatever is behind them, so a static contrast check is not enough. I sample the darkest and lightest regions of the aurora backdrop and tune the surface tint until body text clears 7:1 in both. On light themes the same problem appears in reverse: white glass on a pale gradient disappears, so the border has to carry the edge.

A performance budget

backdrop-filter is not free. Each blurred element asks the compositor to sample and re-blur the pixels behind it, every frame, while anything underneath animates. Three rules kept this site smooth:

  • Animate background blobs with transform only — never with gradients or filter values.
  • Keep blurred surfaces to a handful per viewport. Cards use a plain translucent fill; only the header, sidebar and overlays get real blur.
  • Provide a @supports not (backdrop-filter: blur(1px)) fallback with a solid surface, and honour prefers-reduced-motion.

The result is a site that still hits a steady frame rate on a mid-range phone, with zero external requests.

When to skip the glass

Long-form reading is where glass earns its bad name. Article bodies on this site sit on an opaque, quiet panel: no blur, no gradient, no movement. Glass belongs to chrome — navigation, cards, overlays, controls — the things you touch briefly. The thing you read for nine minutes should be as boring as paper.

That is the whole trick. Use depth to explain where the edges of the interface are, then get out of the way.