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.
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