You can reach text filled with an animated wave in several ways. The following is an SVG approach using a template element. The text is filled with a wave-like pattern, and the picture is animated with SMIL animation. Here's what it looks like:

This approach allows you to fill in a template with a non-simple background (for example, a gradient) and display text above the image or any non-main background.
You can see it in action herer: An animated wave clipped with text .
body,html{margin:0;padding:0;height:100%;} body{ background:url('https://farm9.staticflickr.com/8760/17195790401_ceeeafcddb_o.jpg'); background-size:cover; font-family: 'Cabin Condensed', sans-serif; display:flex; flex-direction:column; justify-content:center; align-items:center; } svg{font-weight:bold;max-width:600px;height:auto;}
<svg viewbox="0 0 100 20"> <defs> <linearGradient id="gradient" x1="0" x2="0" y1="0" y2="1"> <stop offset="5%" stop-color="#326384"/> <stop offset="95%" stop-color="#123752"/> </linearGradient> <pattern id="wave" x="0" y="0" width="120" height="20" patternUnits="userSpaceOnUse"> <path id="wavePath" d="M-40 9 Q-30 7 -20 9 T0 9 T20 9 T40 9 T60 9 T80 9 T100 9 T120 9 V20 H-40z" fill="url(#gradient)"> <animateTransform attributeName="transform" type="translate" begin="0s" dur="1.5s" from="0,0" to="40,0" repeatCount="indefinite" /> </path> </pattern> </defs> <text text-anchor="middle" x="50" y="15" font-size="17" fill="url(#wave)" fill-opacity="0.6">LOADING</text> <text text-anchor="middle" x="50" y="15" font-size="17" fill="url(#gradient)" fill-opacity="0.1">LOADING</text> </svg>
EDIT ----
I switched from CSS keyframe animation to SMIL animations for this example, since Firefox does not yet support CSS keyframes for elements defined in the <defs>
(see https://bugzilla.mozilla.org/show_bug.cgi?id= 1118710 ).
source share