CSSApril 2026 ยท 10 min read

CSS Noise Textures: Grain, Static & Organic Backgrounds

Create noise textures with CSS and SVG: grain overlays, static effects, organic backgrounds, and performance-friendly techniques for modern web design.

๐ŸŒซ๏ธ
Try the Noise Generator
Free, no signup
โ†’
DG
Derek Giordano
Designer & Developer
In this guide
01What Are Noise Textures?02SVG Filter Technique03CSS Gradient Noise04Grain Overlay Pattern05Performance Considerations06Design Use Cases07Customizing Noise08Animated Noise Effects
โšก Key Takeaways
  • Create noise textures with CSS and SVG: grain overlays, static effects, organic backgrounds, and performance-friendly techniques for modern web design.
  • What Are Noise Textures?.
  • Covers svg filter technique (recommended).
  • Covers css gradient noise (no svg).
  • The Grain Overlay Pattern.

What Are Noise Textures?

Noise textures are subtle, random visual patterns that add organic character to digital interfaces. In the physical world, every surface has texture โ€” paper has grain, concrete has speckle, fabric has weave. Flat digital backgrounds can feel sterile. Adding noise brings them to life.

Noise is used in film photography (grain), print design (halftone), and 3D rendering (Perlin noise). On the web, noise textures break up large solid-color areas, add depth to gradients, and create a premium, tactile feel. Apple, Linear, Vercel, and many other design-forward companies use noise overlays extensively.

SVG Filter Technique (Recommended)

The most versatile noise method uses an inline SVG filter with the feTurbulence element:

๐Ÿ’ก Tip
Use gap instead of margin hacks for flexbox spacing. It keeps layout code cleaner and is supported in all modern browsers.
\n \n \n \n

Then apply it with CSS:

.noise-overlay::before {\n content: '';\n position: fixed;\n inset: 0;\n filter: url(#noise);\n opacity: 0.05;\n pointer-events: none;\n z-index: 9999;\n}

baseFrequency controls the grain size โ€” higher values create finer grain. numOctaves adds detail layers โ€” more octaves create more complex patterns. stitchTiles ensures the pattern tiles seamlessly.

CSS Gradient Noise (No SVG)

You can approximate noise using tiny CSS gradients layered on top of each other. This technique doesn't require SVG but produces a coarser pattern:

โš  Warning
Avoid animating width, height, top, or left. These trigger layout recalculations on every frame and can drop performance below 60fps.
background-image:\n repeating-radial-gradient(\n circle at 17% 32%,\n rgba(255,255,255,0.04) 0px,\n transparent 1px\n ),\n repeating-radial-gradient(\n circle at 62% 78%,\n rgba(255,255,255,0.03) 0px,\n transparent 1px\n );\nbackground-size: 3px 3px, 4px 4px;

This creates a fine dot pattern that resembles grain when viewed at normal distance. It's less random than SVG noise but works without any SVG markup and has zero external dependencies.

The Grain Overlay Pattern

The most common implementation pattern is a full-viewport overlay that sits on top of all content:

body::after {\n content: '';\n position: fixed;\n inset: 0;\n background: url("data:image/svg+xml,...") repeat;\n opacity: 0.04;\n pointer-events: none;\n z-index: 9999;\n}

The overlay uses pointer-events: none so it doesn't block clicks, position: fixed so it covers the entire viewport even during scrolling, and a very low opacity (typically 3โ€“6%) so it's felt more than seen.

The Noise Generator tool creates these overlays with customizable grain size, opacity, and blend mode โ€” then gives you copy-ready CSS.

Performance Considerations

SVG filters with feTurbulence can be GPU-intensive, especially on mobile devices. The filter is computed per-pixel, and on high-DPI screens, that's a lot of pixels.

Optimization strategies:

Use a small, pre-rendered noise image (256ร—256 or 512ร—512 PNG with transparency) tiled with background-repeat instead of a live SVG filter. This trades a small network request for dramatically better runtime performance.

Limit the noise overlay to specific sections rather than the entire viewport. A noise overlay on a hero section has minimal performance impact; a full-viewport overlay on a page with heavy animations can cause jank.

Use will-change: transform on the noise overlay to promote it to its own compositing layer, reducing repaint impact on other elements.

Design Use Cases

Gradient enhancement: Noise prevents banding in CSS gradients โ€” the visible stepping between colors that occurs in smooth gradients, especially in dark color ranges.

Hero backgrounds: A solid or gradient hero section with a 3โ€“5% noise overlay feels more polished and intentional than a perfectly clean gradient.

Card surfaces: Very subtle noise on card backgrounds adds a paper-like texture that makes the interface feel tactile and premium.

Dark mode depth: In dark themes, noise adds perceived depth to surfaces that would otherwise look like flat black rectangles.

Vintage and analog aesthetics: Higher noise levels (8โ€“15% opacity) create a film grain or analog feel for retro-themed designs.

Customizing Noise Appearance

Grain size: Controlled by `baseFrequency` in SVG filters. Values between 0.5โ€“0.8 create fine grain suitable for backgrounds. Values below 0.3 create a cloud-like pattern.

Opacity: 2โ€“4% for subtle, barely-perceptible texture. 5โ€“8% for visible grain. 10โ€“15% for a strong analog feel.

Color: Most noise overlays use white noise (white dots at low opacity) on dark backgrounds and dark noise (black dots) on light backgrounds. You can also use colored noise to tint the surface.

Blend mode: `mix-blend-mode: overlay` creates a more pronounced effect than normal blending. `soft-light` produces a gentler result that works well on both light and dark backgrounds.

Animated Noise Effects

Animated noise creates a film grain or TV static effect. The simplest approach shifts the background position of a tiled noise image:

@keyframes grain {\n 0%, 100% { transform: translate(0, 0); }\n 10% { transform: translate(-5%, -10%); }\n 30% { transform: translate(3%, -15%); }\n 50% { transform: translate(12%, 9%); }\n 70% { transform: translate(9%, 4%); }\n 90% { transform: translate(-1%, 7%); }\n}\n\n.grain-animated::after {\n animation: grain 0.5s steps(6) infinite;\n}

Keep animated noise at very low opacity (2โ€“3%) to avoid distraction. Use steps() instead of smooth easing to create discrete jumps that feel like real film grain rather than a sliding texture.

Always wrap animated noise in a prefers-reduced-motion check โ€” users who have requested reduced motion should not see animated grain.

Frequently Asked Questions

What is a noise texture in CSS?+
A noise texture is a random, grain-like visual pattern applied as an overlay on web elements. It adds organic character to flat digital surfaces, prevents gradient banding, and creates a premium, tactile feel.
How do I add noise to a CSS gradient?+
Apply an SVG feTurbulence filter as a pseudo-element overlay on top of the gradient, or use a small tiled PNG noise image. Keep the opacity between 3โ€“6% for a subtle effect.
Does CSS noise affect performance?+
SVG feTurbulence filters can be GPU-intensive, especially on mobile. For better performance, use a pre-rendered PNG noise image tiled with background-repeat instead of a live SVG filter.
What is feTurbulence?+
feTurbulence is an SVG filter primitive that generates random noise patterns. The type can be 'fractalNoise' (smooth, cloud-like) or 'turbulence' (more chaotic). baseFrequency controls grain size, and numOctaves controls detail complexity.
Try it yourself

Use the Noise Generator โ€” free, no signup required.

โšก Open Noise Generator
DG
Derek Giordano
Written by the creator of Ultimate Design Tools. BA in Business Marketing.
โšก Try the free Particle Background Generator โ†’