Caustics
Elemental & Nature · Animated · pure CSS
Sunlight caustics ripple across the letters like light on a pool floor: the glyphs sit in a deep-aqua gradient while thin, branching white-cyan webs — an SVG turbulence spiked into ridge lines — drift and shimmer inside them. Two layers at different scales crawl at different speeds for real underwater depth, clipped strictly to the text with a soft blue bloom.
How it works
Caustics is an animated elemental & nature 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
Caustics exposes 3 dedicated controls — Water Hue, Shimmer Speed and Web Brightness — 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
/* Caustics — made with TEXT-FX · https://text-fx.app
* HTML: requires the inline <svg> filter defs — see the HTML export.
* Font: 'Anton', sans-serif (load from Google Fonts).
*/
.text-effect {
font-family: 'Anton', sans-serif;
font-weight: 900;
letter-spacing: -1px;
text-transform: none;
}
.text-effect {
background: linear-gradient(180deg, hsl(205 68% 46%) 0%, hsl(211 78% 34%) 55%, hsl(217 85% 24%) 100%);
-webkit-background-clip: text;
background-clip: text;
-webkit-text-fill-color: transparent;
color: transparent;
filter: url(#text-effect-caustics) drop-shadow(0 0 5px hsl(209 90% 62% / 0.5)) drop-shadow(0 0 15px hsl(213 95% 55% / 0.32));
}
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: 'Anton', sans-serif;
font-weight: 900;
letter-spacing: -1px;
text-transform: none;
}
.text-effect {
background: linear-gradient(180deg, hsl(205 68% 46%) 0%, hsl(211 78% 34%) 55%, hsl(217 85% 24%) 100%);
-webkit-background-clip: text;
background-clip: text;
-webkit-text-fill-color: transparent;
color: transparent;
filter: url(#text-effect-caustics) drop-shadow(0 0 5px hsl(209 90% 62% / 0.5)) drop-shadow(0 0 15px hsl(213 95% 55% / 0.32));
}
</style>
<svg width="0" height="0" style="position:absolute" aria-hidden="true"><defs>
<filter id="text-effect-caustics" x="-25%" y="-25%" width="150%" height="150%" color-interpolation-filters="sRGB">
<feTurbulence type="fractalNoise" baseFrequency="0.013 0.018" numOctaves="2" seed="4" result="tA">
<animate attributeName="baseFrequency" dur="7.5s" values="0.013 0.018;0.018 0.014;0.013 0.018" calcMode="spline" keyTimes="0;0.5;1" keySplines="0.4 0 0.6 1;0.4 0 0.6 1" repeatCount="indefinite"/>
</feTurbulence>
<feColorMatrix in="tA" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0" result="fA"/>
<feComponentTransfer in="fA" result="rA">
<feFuncA type="table" tableValues="0 0 0 0 1 0 0 0 0"/>
</feComponentTransfer>
<feFlood flood-color="hsl(205 82% 90%)" flood-opacity="1" result="flA">
<animate attributeName="flood-opacity" dur="6.8s" values="1;0.72;1" repeatCount="indefinite"/>
</feFlood>
<feComposite in="flA" in2="rA" operator="in" result="colorA"/>
<feTurbulence type="fractalNoise" baseFrequency="0.006 0.009" numOctaves="2" seed="11" result="tB">
<animate attributeName="baseFrequency" dur="15s" values="0.006 0.009;0.009 0.006;0.006 0.009" calcMode="spline" keyTimes="0;0.5;1" keySplines="0.4 0 0.6 1;0.4 0 0.6 1" repeatCount="indefinite"/>
</feTurbulence>
<feColorMatrix in="tB" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0" result="fB"/>
<feComponentTransfer in="fB" result="rB">
<feFuncA type="table" tableValues="0 0 0 0 1 0 0 0 0"/>
</feComponentTransfer>
<feFlood flood-color="hsl(209 88% 76%)" flood-opacity="1" result="flB">
<animate attributeName="flood-opacity" dur="9.8s" values="0.9;1;0.9" repeatCount="indefinite"/>
</feFlood>
<feComposite in="flB" in2="rB" operator="in" result="colorB"/>
<feBlend mode="screen" in="colorA" in2="colorB" result="webs"/>
<feComponentTransfer in="webs" result="websAdj">
<feFuncA type="linear" slope="1.01"/>
</feComponentTransfer>
<feComposite in="websAdj" in2="SourceAlpha" operator="in" result="websIn"/>
<feBlend mode="screen" in="SourceGraphic" in2="websIn" result="lit"/>
</filter>
</defs></svg>
<div class="text-effect">Your text</div>
- Category
- Elemental & Nature
- Type
- Animated
- Browser support
- SVG feTurbulence spiked to ridge lines + background-clip:text (SMIL-animated)
- Capabilities
- pure, svgDefs