A pastel word trailed by hollow outline echoes in pink, cyan and purple that slide out diagonally and back. Each echo is a stroked copy offset by its index, so one keyframe drives all three.
Also known as: vaporwave text effect, aesthetic text css, echo outline text.
<div class="txt-vaporwave-echo-text"> <span class="txt-vaporwave-echo-text-echo" aria-hidden="true" style="--i: 3">AESTHETIC</span> <span class="txt-vaporwave-echo-text-echo" aria-hidden="true" style="--i: 2">AESTHETIC</span> <span class="txt-vaporwave-echo-text-echo" aria-hidden="true" style="--i: 1">AESTHETIC</span> <span class="txt-vaporwave-echo-text-main">AESTHETIC</span> </div>
.txt-vaporwave-echo-text {
--c: var(--txt-color, #3b82f6);
font-size: var(--txt-size, 32px);
font-family: system-ui, sans-serif;
font-weight: 700;
line-height: 1.2;
display: inline-grid;
font-style: italic;
font-weight: 900;
letter-spacing: 0.1em;}
.txt-vaporwave-echo-text > span {
grid-area: 1 / 1;
}
.txt-vaporwave-echo-text-main {
position: relative;
background: linear-gradient(90deg, #ff71ce, color-mix(in srgb, var(--c) 50%, #b967ff), #01cdfe);
-webkit-background-clip: text;
background-clip: text;
color: transparent;
-webkit-text-fill-color: transparent;
}
.txt-vaporwave-echo-text-echo {
color: transparent;
-webkit-text-stroke: 0.025em #01cdfe;
opacity: calc(1 - var(--i) * 0.22);
animation: txt-vaporwave-echo-text-drift 3s cubic-bezier(0.45, 0, 0.55, 1) infinite alternate;
}
.txt-vaporwave-echo-text-echo:nth-child(2) { -webkit-text-stroke-color: #b967ff; }
.txt-vaporwave-echo-text-echo:nth-child(3) { -webkit-text-stroke-color: #ff71ce; }
@keyframes txt-vaporwave-echo-text-drift {
from { transform: translate(calc(var(--i) * 0.02em), calc(var(--i) * 0.02em)); }
to { transform: translate(calc(var(--i) * 0.09em), calc(var(--i) * 0.09em)); }
}
@media (prefers-reduced-motion: reduce) {
.txt-vaporwave-echo-text, .txt-vaporwave-echo-text *, .txt-vaporwave-echo-text::before, .txt-vaporwave-echo-text::after, .txt-vaporwave-echo-text *::before, .txt-vaporwave-echo-text *::after {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
}
}--txt-color on the element or a parent.
Currently previewing #3b82f6.--txt-size. Every other dimension is in
em, so the whole thing scales together. Currently previewing 40px.transition or animation
shorthand. Staggered delays are relative, so they keep their rhythm.