aeworks.tech/lab/titular-ola
← AE Lab

Titular que reacciona como una ola

14 oct 2026· nivel mediotipografíascrollrequestAnimationFrame

Un titular gigante de portada en el que cada letra engorda, se estira y se inclina al pasar el cursor, el dedo o el scroll, como una ola que lo recorre, y deja una estela verde que se apaga. Parece una fuente variable animada, pero solo mueve opacidad y transform.

// CÓMO ESTÁ HECHO

  1. El JS parte el titular en letras y cada letra lleva tres copias apiladas en la misma celda de grid: fina (200), gruesa (900) y verde; todo aria-hidden, con el texto completo en el aria-label del h1.
  2. Cada fotograma calcula la fuerza de la ola en cada letra con una campana de Gauss según su distancia al cursor, a un barrido diagonal (scroll, demo o botón) o a un anillo que crece desde el clic.
  3. En vez de animar font-weight (que recalcula el maquetado), se cruza la opacidad de la copia fina y la gruesa y se deforma la letra con scale, translateY y skewX.
  4. La estela es un valor que sube al instante y baja multiplicándose por 0,965 en cada fotograma: así el verde se apaga solo.
  5. Modo demostración con una ola cada 3,2 s que se para al interactuar, y con prefers-reduced-motion solo cambian grosor y color.

// EL CÓDIGO

<div class="recorrido">
  <section class="portada">

    <header class="cabecera">
      <div class="marca">Taller <b>Nómada</b></div>
      <nav aria-label="Principal">
        <a href="#">Mujer</a><a href="#">Hombre</a><a href="#">Tienda</a>
      </nav>
    </header>

    <div class="centro">
      <p class="etiqueta"><i>●</i> Colección otoño · Lino y lana cruda</p>

      <!-- Para un lector de pantalla esto es UNA frase: aria-label en el
           contenedor y todas las letras sueltas con aria-hidden (las pone el JS). -->
      <h1 class="titular" id="titular" aria-label="Ropa que se mueve contigo">Ropa que se mueve contigo</h1>

      <div class="pie">
        <a class="boton" href="#">Ver colección</a>
        <button class="boton secundario" id="lanzar" type="button"><span>≈</span> Lanzar ola</button>
      </div>
    </div>

    <aside class="ficha" aria-label="Producto destacado">
      <div class="tejido"></div>
      <p>Chaqueta de lana cruda <b>89 €</b></p>
      <small>Nuevo · 4 colores</small>
    </aside>

    <div class="pista" aria-hidden="true">
      <span id="ayuda">Mueve el cursor · Desplaza ↓</span>
      <span class="progreso"><i id="barra"></i></span>
    </div>

  </section>
</div>