aeworks.tech/lab/texto-liquido
← AE Lab

El titular que se derrite

21 oct 2026· nivel avanzadocanvasSVG filterfísica

El titular de una heladería se funde bajo el ratón o el dedo: las letras se escurren, cuelgan gotas que se estiran con un hilo, caen y salpican en un charco, y al irte vuelven a solidificarse solas con un pequeño rebote. Todo en un canvas, sin librerías.

// CÓMO ESTÁ HECHO

  1. El titular se pinta una vez en un canvas oculto con degradado nata-pistacho; el h1 real queda en el DOM para lectores de pantalla.
  2. Cada fotograma, una campana de Gauss alrededor del puntero calienta columnas de 3-4 px; un muelle con poco rozamiento convierte ese calor en cuánto se descuelga cada columna (y en un rebote al enfriarse).
  3. Las columnas calientes se copian con drawImage en franjas que bajan y se alargan más cuanto más cerca del pie de la letra; las frías se copian de un solo trozo, nítidas.
  4. Del pie de cada letra derretida cuelgan gotas con forma de lágrima (curvas de Bézier) que engordan, se sueltan con un hilo que se rompe, caen con gravedad y salpican en un charco.
  5. La zona líquida pasa por un filtro SVG «goo» (feGaussianBlur + feColorMatrix) aplicado con ctx.filter solo al tramo caliente, para que gotas y letras se fundan; con prefers-reduced-motion solo cambia el brillo.

// EL CÓDIGO

<canvas id="lienzo" aria-hidden="true"></canvas>
<!-- Filtro «goo»: desenfoca y vuelve a endurecer el borde, así la gota y la letra se funden -->
<svg width="0" height="0" style="position:absolute" aria-hidden="true">
  <filter id="goo" color-interpolation-filters="sRGB">
    <feGaussianBlur id="goo-blur" in="SourceGraphic" stdDeviation="4" result="borroso"/>
    <feColorMatrix in="borroso" values="1 0 0 0 0  0 1 0 0 0  0 0 1 0 0  0 0 0 20 -8" result="liquido"/>
    <feComposite in="SourceGraphic" in2="liquido" operator="atop"/>
  </filter>
</svg>

<div class="app">
  <header class="marca">
    <div class="logo">
      <svg viewBox="0 0 32 32" aria-hidden="true">
        <circle cx="16" cy="11" r="8" fill="#00FF7F"/>
        <path d="M9 14 L16 30 L23 14 Z" fill="#E8F5EE" opacity=".85"/>
        <path d="M11.5 16 L20.5 16 M13 20 L19 20" stroke="#05070A" stroke-width="1.4"/>
      </svg>
      Gelato Bruma
    </div>
    <span class="abierto"><b>●</b> Abierto hasta las 23:00</span>
  </header>

  <main class="heroe">
    <p class="antetitulo">Helado artesano · pistacho tostado hoy</p>
    <h1 class="titular" id="titular" tabindex="0" aria-describedby="ayuda">
      <span class="solo-lector">Se derrite en la boca.</span>
    </h1>
    <p class="entrada">Pistacho tostado cada mañana, leche fresca y <strong>ni un gramo de prisa</strong>. Pruébalo antes de que se escape.</p>
    <div class="acciones">
      <button class="boton" id="sabores" type="button">Ver los sabores de hoy</button>
      <span class="precio">Cucurucho desde 3,20 €</span>
    </div>
    <p class="aviso" id="aviso" aria-live="polite"></p>
  </main>

  <p class="pista" id="pista"><i aria-hidden="true"></i><span id="pista-texto">Pasa el ratón por el titular</span></p>
  <p class="solo-lector" id="ayuda">Efecto visual: con las flechas del teclado derrites el titular.</p>
</div>
<div class="fantasma" id="fantasma" aria-hidden="true"></div>