Premium background design: subtle gradients and CSS recipes

Last reviewed on 3 October 2026.

"Premium" backgrounds — the dark, softly lit gradients behind luxury product pages, the barely-there textures behind high-end portfolios — are less about any single effect than about restraint. They tend to share a handful of traits you can reproduce deliberately: a narrow palette, low contrast within the background itself, no banding, subtle depth, and plenty of empty space. This page breaks those traits down, with CSS you can copy.

What makes a background feel premium

Recipe 1: dark premium gradient

Dark spotlightNear-black with a soft top light
Black to graphiteTwo close values, long angle
.premium-dark {
  background:
    radial-gradient(120% 80% at 50% 0%, #2a2a35 0%, #121218 45%, #08080b 100%);
  color: #e5e5e5;
}

The ellipse is wider than the element and centred at the top edge, so the "light" feels like it comes from above the frame. Keep the brightest stop well below mid-grey; the effect should be noticed only when it is missing.

Recipe 2: subtle light gradient

Paper whiteWhite to warm off-white
Cool studioFaint blue-grey glow
.premium-light {
  background: linear-gradient(180deg, #ffffff 0%, #f4f3f0 100%);
  color: #1a1a1a;
}

Recipe 3: colour accent glow

Many modern product sites place one or two soft, blurred colour blooms on a dark base. Keep them large, low-opacity and off to the edges so text in the middle stays on the dark base.

Indigo and pink bloomTwo blooms at opposite corners
.premium-glow {
  background:
    radial-gradient(40% 50% at 15% 20%, rgba(99, 102, 241, 0.35), transparent 70%),
    radial-gradient(40% 50% at 85% 80%, rgba(236, 72, 153, 0.25), transparent 70%),
    #0a0a12;
}

Adding grain to stop banding

A tiny inline SVG using the feTurbulence filter produces noise without an image request. Layer it on top of the gradient at very low opacity.

.grain {
  position: relative;
}
.grain::after {
  content: "";
  position: absolute;
  inset: 0;
  pointer-events: none;
  opacity: 0.06;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='160' height='160'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='2'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");
}

Opacity between about 0.03 and 0.08 is usually enough. Higher values start to look like a deliberate texture — which can also be premium, as with paper textures, but is a different look.

Motion, carefully

Slow, ambient movement — a gradient that drifts over 20 seconds or more — can feel high-end; fast loops feel like an advert. Animate background-position on an oversized gradient, or animate transform on a blurred layer (cheaper to render), and switch it off for visitors who ask for less motion:

@media (prefers-reduced-motion: reduce) {
  .animated-bg { animation: none; }
}

More techniques are on the animated gradient backgrounds page.

What cheapens a background

Frequently asked questions

How do I make a gradient look premium?

Keep it to one hue or two related hues, keep the lightness change small, use a near-black or off-white base rather than pure black or white, and add a faint layer of grain so the gradient does not band.

Why does my dark gradient show stripes?

Most screens show 256 levels per colour channel, so a long gradient between two close dark colours has only a few steps available and they become visible as bands. Adding subtle noise, shortening the gradient or widening the colour range reduces it.