Backgrounds✨ Premium

Paper Texture

Paper parchment background from fractalNoise in multiply — natural grain, inked stamp, zero JavaScript, zero dependencies.

CSSSVGVintage

You'll get access to the interactive demo with a free account.

This effect is part of Effect.Labs — 811 vanilla effects, some free, some premium. Backgrounds has 50 effects, including 6 free. Explore the category →

3 usage examples

Full-page cover — Artisan brand hero section — Paper Texture example 1

① Full-page cover — Artisan brand hero section

WhenOpening section of a bakery, craft brewery, or independent publisher website, where the effect replaces a background image.
WhyThe fractalNoise grain on cream faithfully reproduces the look of aged printed paper — vector-based, infinitely scalable, no external asset required. The inked stamp reinforces the handmade identity.
SettingsSet background on .ng-paper-scene to #ede8dc for darker parchment. Raise opacity on ::before to 0.14 to accentuate grain. Set width/height to 100% to cover the full section.
Recipe card — Culinary app vintage card component — Paper Texture example 2

② Recipe card — Culinary app vintage card component

WhenDisplaying a recipe in a cooking app or food blog, where the paper-textured card is the primary visual unit.
WhyThe parchment texture turns a generic card into a recipe sheet from an old cookbook, without a background image or external asset.
SettingsKeep baseFrequency at 0.65 (tight grain) and numOctaves at 5. Change the stamp color to ink blue (rgba(30, 60, 120, .45)) for a notarial or gourmet style.
Digital certificate — Diploma or completion badge — Paper Texture example 3

③ Digital certificate — Diploma or completion badge

WhenGenerating a completion certificate, diploma, or attestation in an e-learning or event platform — displayed full-screen or exported as PDF.
WhyThe parchment background and stamp convey immediate visual authenticity. Being static, the texture survives screenshots, PDF exports, and print without quality loss.
SettingsUse background: #f8f4ea for slightly lighter parchment and opacity: 0.12. Rotate the stamp to rotate(-8deg) and change its color to navy blue for a more formal look.

How it works

The texture is produced by an SVG feTurbulence filter with type="fractalNoise" — a multi-scale Perlin-like noise that generates a natural, non-periodic random field. With baseFrequency="0.65" and numOctaves="5", it produces a fine grain that closely resembles wood-pulp paper fibers.

This SVG filter is embedded as a complete document inside a data:image/svg+xml URL applied to the ::before pseudo-element of .ng-paper-scene, at opacity: 0.08. The mix-blend-mode: multiply operator blends the noise with the cream background — dark grains subtract from the base, bright values leave it intact, producing the characteristic natural-fiber look of aged paper.

The .ng-paper-stamp element is a 100% CSS circular badge: border-radius: 50%, a border in semi-transparent red-ink tones (rgba(180, 50, 50, .4)), and a <span> in tight uppercase letters (letter-spacing: 1px, font-size: 0.55rem). A transform: rotate(-15deg) gives it the look of a stamp applied diagonally.

The effect has no JavaScript. The texture, cream background, and stamp are pure CSS layers stacked via pseudo-elements and normal DOM flow — no canvas, no requestAnimationFrame, no dependencies. The SVG filter is a static render the browser paints once and caches.

Accessibility

  • prefers-reduced-motion not required — the effect is entirely static. No animation runs. Users sensitive to vestibular motion are unaffected.
  • The ::before pseudo-element carrying the noise is purely decorative. Add aria-hidden="true" to the scene when it is ornamental; keep it in the accessibility tree when it wraps readable content.
  • Text contrast: title color #2d2418 on cream background #f5f0e8 achieves a ratio ≈ 14:1, well above WCAG AA (4.5:1) and AAA (7:1).
  • Stamp text uses rgba(180, 50, 50, 0.5) on #f5f0e8 — contrast below 3:1 at that opacity. The stamp is decorative; if it carries meaningful information, raise opacity to at least 0.85.
  • No keyboard interaction — the component is passive (no click, no focus logic). No extra ARIA roles are required beyond standard document structure.

Browser compatibility

Requires mix-blend-mode and SVG filters in data URIs — supported in all modern browsers since Edge 79 (2020).

Chrome 79+✓ Full
Firefox 87+✓ Full
Safari 14+✓ Full
Edge 79+✓ Full
Mobile iOS 14+✓ Full
Android Chrome✓ Full

On Internet Explorer (not targeted), <code>mix-blend-mode</code> is ignored — the <code>::before</code> renders as a plain gray-noise overlay at 8% opacity without blending. Content legibility is preserved.

The code

HTML structure to paste into your page (CSS + JS available with a premium account):

index.html — structure
<div class="ng-paper-scene">
  <!-- Parchment texture rendered in CSS via ::before -->
  <div class="ng-paper-content">
    <h3 class="ng-paper-title">…</h3>
    <div class="ng-paper-line"></div>
    <p class="ng-paper-text">…</p>
  </div>
  <div class="ng-paper-stamp">
    <span>…</span>
  </div>
</div>
🔒 Unlock the full code — from €2.99 the first month

Full HTML + CSS + JS, copy-paste ready — with hundreds of premium effects.

Customize

Options passed to the API or data-* attributes:

Option / propertyDefaultEffect
background on .ng-paper-scene #f5f0e8 Paper sheet color. #ede8dc = dark parchment, #fff8f0 = light cream, #e8e4d8 = aged sand-grey.
baseFrequency in feTurbulence 0.65 Fractal noise grain in the SVG data URI. 0.40–0.50 = coarse grain like kraft paper; 0.80–0.90 = fine even grain like offset paper. Edit the value directly inside the url() string.
numOctaves in feTurbulence 5 Noise detail level in the SVG data URI. 3 = smooth uniform texture; 7 = rich micro-detail. Zero render cost — the SVG is static.
opacity on .ng-paper-scene::before 0.08 Texture intensity. 0.04 = barely perceptible on bright screens; 0.18–0.22 = heavy grain like newsprint or blotting paper.
mix-blend-mode on .ng-paper-scene::before multiply Blend mode between texture and background. multiply = grain melted into the cream color. On dark backgrounds, multiply is invisible — use soft-light or overlay instead.
transform on .ng-paper-stamp rotate(-15deg) Stamp rotation. -30° to +10° for a casual look; 0° or -5° for formal use (certificate, official document).
border-color + span color on .ng-paper-stamp rgba(180, 50, 50, .4/.5) Stamp color. rgba(30, 60, 120, .45) = notarial blue ink; rgba(20, 80, 40, .45) = official green. Keep border-color and span color in sync.
width / height on .ng-paper-scene 280px / 220px Scene dimensions. The ::before stretches to fill any size — set 100% / 100% for a full-screen or full-section background.

FAQ

Yes, feTurbulence is deterministic by default: same frequency = same pattern. To vary the grain between cards, add seed="N" to the feTurbulence element inside the data URI (N = any integer) — each seed value produces a distinct noise pattern.
Copy only the ::before rule onto the target element (it needs position: relative and a light background color). The SVG data URI is self-contained — it works on a div, a section, an article, or even a table cell. No other effect class is required.
No. On dark backgrounds, multiply makes the texture invisible (black × noise ≈ black). Use mix-blend-mode: soft-light or overlay instead. A warm dark background (#2a2318 rather than #000) keeps the grain perceptible.