Creando una Animación de Texto 3D con GSAP y ScrollTrigger

En este post, te mostraré cómo crear una animación de texto con efecto 3D utilizando GSAP y ScrollTrigger.

¿Qué vamos a lograr?

Vamos a animar varias palabras para que aparezcan y desaparezcan con un efecto de desplazamiento vertical y rotación 3D, sincronizado con el scroll. Cada palabra entrará desde abajo, girando en el eje X, y saldrá hacia arriba con una transición suave.

  • Tecnologías utilizadas
  • GSAP (GreenSock Animation Platform) para manejar las animaciones.
  • ScrollTrigger para sincronizar la animación con el desplazamiento.
  • SplitType para dividir el texto en caracteres animables.

Estructura HTML

Nuestro HTML contiene una sección con varias palabras dentro de etiquetas <h2>

<section class="section-fh section-intro">
   <h1>Scroll Down</h1>
</section>

<section id="texts-animation" class="section-texts-animation">
   <h2>Businessman</h2>
   <h2>Entrepreneur</h2>
   <h2>Philanthropist</h2>
   <h2>Mentor</h2>
   <h2>Deejay</h2>
</section>

<section class="section-fh section-intro">
   <h1>Scroll Up</h1>
</section>

Estilos CSS

Para que la animación luzca bien, agregamos algunos estilos básicos:

 .section-intro {
    text-align: center;
    align-content: center;
 }

 .section-texts-animation {
    padding: 24px
 }

 .section-texts-animation {
    background-image: url(https://picsum.photos/id/22/1920/1080?grayscale);
    background-size: cover;
    background-attachment: fixed;
    position: relative;
    background-color: #f4f3ec;
    &:before {
       content: '';
       position: absolute;
       top: 0;
       left: 0;
       width: 100%;
       height: 100%;
       background-color: rgba(244, 243, 236, 0.7);
    }
 }

 #texts-animation {
    width: 100%;
    height: 100vh;
    flex-shrink: 0;
    display: flex;
    justify-content: center;
    align-items: center;
    h2 {
       font-size: 9vw;
       position: absolute;
       transform-origin: 50% 50%;

       span {
          display: inline-block;
       }
    }
 }

Script con GSAP y ScrollTrigger

Aquí es donde ocurre la magia. Primero, importamos las librerías necesarias y luego aplicamos las animaciones.

document.addEventListener("DOMContentLoaded", function () {
   window.addEventListener("load", function () {

      new SplitType('#texts-animation h2', {
         types: 'chars',
         tagName: 'span',
      });

      const words = gsap.utils.toArray('#texts-animation h2');
      const splits = words.map((word) => {
         return word.getElementsByTagName('span');
      });

      let tl = gsap.timeline({
         ease: "none",
         scrollTrigger: {
            trigger: "#texts-animation",
            pin: true,
            scrub: true,
            anticipatePin: 1,
            end: "+=4000"
         }
      });

      words.forEach((word, i) => {
         tl.from(word, { y: 200, duration: 1, opacity: 0, rotationX: -45 }).from(
            splits[i],
            { y: 100, rotationX: -90, stagger: 0.05 },
            "<"
         );
         tl.to(word, { y: -200, duration: 1, opacity: 0, rotationX: -135 }).to(
            splits[i],
            { rotationX: -120, stagger: 0.1, opacity: 0 },
            "<"
         );
      });

   }, false);
});

Explicación del código

Dividimos las palabras en caracteres usando SplitType para poder animar cada letra individualmente.

  • Creamos una animación con GSAP, donde cada palabra:
  • Aparece desde abajo (y: 200), con opacidad 0 y una rotación en el eje X de -45°.
  • Sus letras se desplazan hacia arriba (y: 100) con una rotación X de -90°, apareciendo de manera escalonada (stagger: 0.05).
  • Luego, la palabra desaparece hacia arriba (y: -200) con una rotación X de -135° y opacidad 0.
  • Las letras también giran más (rotationX: -120°) antes de desaparecer completamente.
  • Sincronizamos la animación con el scroll usando ScrollTrigger, asegurándonos de que la sección quede «fijada» (pin: true) hasta que termine la animación.

Conclusión

Este efecto crea una sensación de texto emergiendo y desapareciendo en 3D, agregando dinamismo a la web. Con GSAP y ScrollTrigger, podemos lograr efectos avanzados de manera sencilla y optimizada.

Galería de videos personalizada en JavaScript

Cuando trabajamos con galerías de videos en la web, lo normal es apoyarnos en librerías externas o depender de los controles nativos del navegador. Sin embargo, con un poco de JavaScript puro (vanilla JS) podemos tener un control total sobre la experiencia de usuario. En este artículo te mostraré cómo…