Wood Grain

Fill & Texture · Static · pure CSS

Glyphs cut from planed timber: an anisotropic SVG turbulence stretches the noise into long horizontal fibers, which a component-transfer remaps into repeating dark-and-light ring bands over a warm brown base — tunable from pale pine through walnut to deep mahogany. A soft vertical sheen and a darker sawn-edge rim finish the boards, so the letters read as obviously wood, not marble.

Wood Grain

How it works

Wood Grain is a static fill & texture text effect rendered entirely in CSS. It relies on an inline SVG <defs> block (filters, gradients or clip-paths), which the HTML export carries alongside the CSS.

Controls

Wood Grain exposes 4 dedicated controls — Wood Tone, Grain, Sheen and Figure — on top of the shared type controls (font, weight, letter-spacing and case). Open it in the generator to tune every value live, then copy the updated CSS.

CSS

/* Wood Grain — made with TEXT-FX · https://text-fx.app
 * HTML: requires the inline <svg> filter defs — see the HTML export.
 * Font: 'Archivo Black', sans-serif (load from Google Fonts).
 */

.text-effect {
  font-family: 'Archivo Black', sans-serif;
  font-weight: 900;
  letter-spacing: -1px;
  text-transform: none;
}

.text-effect {
  background: linear-gradient(180deg, hsl(0 0% 40.7%) 0%, hsl(0 0% 74.4%) 24%, hsl(0 0% 52%) 58%, hsl(0 0% 37.2%) 100%);
  -webkit-background-clip: text;
  background-clip: text;
  -webkit-text-fill-color: transparent;
  color: transparent;
  filter: url(#text-effect-wood);
}

HTML

This effect needs the markup below (per-letter spans, SVG defs, or a data-text attribute).

<!-- Made with TEXT-FX · https://text-fx.app -->

<style>
.text-effect {
  font-family: 'Archivo Black', sans-serif;
  font-weight: 900;
  letter-spacing: -1px;
  text-transform: none;
}

.text-effect {
  background: linear-gradient(180deg, hsl(0 0% 40.7%) 0%, hsl(0 0% 74.4%) 24%, hsl(0 0% 52%) 58%, hsl(0 0% 37.2%) 100%);
  -webkit-background-clip: text;
  background-clip: text;
  -webkit-text-fill-color: transparent;
  color: transparent;
  filter: url(#text-effect-wood);
}
</style>

<svg width="0" height="0" style="position:absolute" aria-hidden="true"><defs>
<filter id="text-effect-wood" x="-6%" y="-6%" width="112%" height="112%" color-interpolation-filters="sRGB">
  <feTurbulence type="fractalNoise" baseFrequency="0.014 0.246" numOctaves="3" seed="1" stitchTiles="stitch" result="noise"/>
  <feColorMatrix in="noise" type="matrix" values="1 1 1 0 -1  1 1 1 0 -1  1 1 1 0 -1  0 0 0 0 1" result="gray"/>
  <feComponentTransfer in="gray" result="wood">
    <feFuncR type="table" tableValues="0.643 0.384 0.643 0.384 0.643 0.384 0.643 0.384 0.643 0.384 0.643 0.384 0.643 0.384 0.643"/>
    <feFuncG type="table" tableValues="0.416 0.243 0.416 0.243 0.416 0.243 0.416 0.243 0.416 0.243 0.416 0.243 0.416 0.243 0.416"/>
    <feFuncB type="table" tableValues="0.29 0.18 0.29 0.18 0.29 0.18 0.29 0.18 0.29 0.18 0.29 0.18 0.29 0.18 0.29"/>
  </feComponentTransfer>
  <feBlend in="SourceGraphic" in2="wood" mode="soft-light" result="litFull"/>
  <feComposite in="litFull" in2="SourceGraphic" operator="in" result="lit"/>
  <feMorphology in="SourceAlpha" operator="erode" radius="1.1" result="inner"/>
  <feComposite in="SourceAlpha" in2="inner" operator="out" result="rim"/>
  <feFlood flood-color="rgb(54,34,25)" flood-opacity="0.55" result="edgeFlood"/>
  <feComposite in="edgeFlood" in2="rim" operator="in" result="edge"/>
  <feMerge>
    <feMergeNode in="lit"/>
    <feMergeNode in="edge"/>
  </feMerge>
</filter>
</defs></svg>

<div class="text-effect">Your text</div>
Category
Fill & Texture
Type
Static
Browser support
background-clip:text sheen + SVG feTurbulence/feComponentTransfer wood grain (soft-light feBlend needs a modern browser)
Capabilities
pure, svgDefs

Related Fill & Texture effects