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.

Caustics

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

Related Elemental & Nature effects