ScrollTrigger con scrub y pin: cómo convertir el scroll en dirección cinematográfica

Aprende a usar `ScrollTrigger` con `scrub`, `pin` y una estructura de secciones que convierta el desplazamiento en narrativa visual. La meta no es fijar un canvas porque sí, sino decidir cuándo una escena debe quedarse en pantalla y cómo repartir el viaje para que el usuario entienda qué está ocurriendo.

El scroll cinematográfico no consiste en pegar una escena 3D al viewport y mover cosas al azar. Consiste en usar el desplazamiento como una línea de tiempo narrativa. Cada tramo del recorrido debe responder a una pregunta visual: qué entra, qué se revela, cuánto dura el foco y cuándo se libera la escena para seguir leyendo.

Aquí `scrub` y `pin` cumplen papeles distintos. `scrub` convierte el scroll en progreso temporal. `pin` mantiene la escena visible el tiempo suficiente para que ese progreso se aprecie sin que el usuario pierda la referencia. Juntos pueden generar una sensación muy dirigida o una experiencia torpe y bloqueante. La diferencia está en el criterio.

Una buena implementación no oculta que sigue siendo una web. Deja aire para leer, no fuerza movimientos infinitos y evita trayectos demasiado largos para una idea demasiado pequeña. Por eso esta lección no va solo de sintaxis de GSAP: va de reparto de atención.

Cuando termines deberías poder diseñar una sección pinned con una duración defendible, un scrub fluido y una transición limpia hacia el resto de la página.

  • Lo primero es cambiar el modelo mental.
  • Con `ScrollTrigger` no piensas solo en animaciones, sino en una relación entre posición del documento y progreso visual. Ese cambio de mentalidad es clave porque obliga a diseñar el recorrido: dónde empieza, cuánto dura, qué se queda fijo y qué se suelta.
  • En una landing 3D profesional, el scroll no debe competir con la historia. Debe ser el mando que regula el avance del capítulo. Si intentas usarlo como simple disparador de efectos, la escena se siente decorativa. Si lo usas como tiempo narrativo, empieza a sentirse dirigida.
  • La sincronización exacta no siempre produce la mejor sensación.
  • Con `scrub: true` la animación sigue de forma literal los saltos del dispositivo de scroll. En un trackpad puede sentirse bastante bien, pero en ratones más bruscos el resultado a veces parece rígido o entrecortado. Un valor numérico introduce inercia y deja que la escena alcance el punto de scroll con un pequeño retraso controlado.

ScrollTrigger no es un truco de scroll: es una línea de tiempo anclada al documento

Lo primero es cambiar el modelo mental.

Con `ScrollTrigger` no piensas solo en animaciones, sino en una relación entre posición del documento y progreso visual. Ese cambio de mentalidad es clave porque obliga a diseñar el recorrido: dónde empieza, cuánto dura, qué se queda fijo y qué se suelta.

En una landing 3D profesional, el scroll no debe competir con la historia. Debe ser el mando que regula el avance del capítulo. Si intentas usarlo como simple disparador de efectos, la escena se siente decorativa. Si lo usas como tiempo narrativo, empieza a sentirse dirigida.

Por qué `scrub: 1.2` suele funcionar mejor que `scrub: true`

La sincronización exacta no siempre produce la mejor sensación.

Con `scrub: true` la animación sigue de forma literal los saltos del dispositivo de scroll. En un trackpad puede sentirse bastante bien, pero en ratones más bruscos el resultado a veces parece rígido o entrecortado. Un valor numérico introduce inercia y deja que la escena alcance el punto de scroll con un pequeño retraso controlado.

Ese retraso es especialmente útil en recorridos de cámara, rotaciones largas o cambios de iluminación. No elimina la sensación de control, pero sí filtra parte de la vibración del scroll real y acerca el resultado a una experiencia más cinematográfica.

  • `scrub: true` es útil para depurar o para movimientos muy mecánicos.
  • Entre `1` y `1.5` segundos suele haber un equilibrio muy bueno entre control y suavidad.
  • Si el recorrido ya es lento, un scrub demasiado alto puede dar sensación de retraso excesivo.
  • Conviene probar con ratón y con trackpad antes de cerrar la duración.

Cuándo fijar la escena y cuándo no hacerlo

Pinning no significa prestigio; significa responsabilidad con el tiempo del usuario.

Fijar una escena tiene sentido cuando el usuario necesita permanecer dentro de un mismo plano mientras cambian cámara, producto, luces o capas de contenido. Si el efecto podría entenderse sin fijar, muchas veces es mejor no bloquear la página.

El error clásico es pinnear una sección durante miles de píxeles para contar algo mínimo. Ese abuso rompe ritmo, genera fatiga y empeora la percepción de velocidad del sitio. El pin debe durar lo justo para completar una idea con claridad.

Diseña por capítulos, no por efectos sueltos

La secuencia mejora cuando cada tramo tiene función visual y verbal.

Una estructura muy útil consiste en dividir la sección en tres o cuatro beats: entrada del escenario, momento de foco, detalle o giro de cámara, y liberación final. Eso te permite repartir duración, texto y cambios de estado de forma mucho más defensible.

Este método conecta muy bien con portfolios como el de Bruno Simon: detrás de la sensación lúdica hay una relación muy pensada entre interacción, cámara y descubrimiento progresivo. No se trata de copiar estética, sino de entender la intención.

Debug común: lo que suele romper una escena con scroll

Conviene detectar estos fallos antes de culpar al renderer o al modelo 3D.

Si el recorrido se siente brusco, primero revisa `scrub`, la longitud del `end` y si hay demasiadas propiedades compitiendo a la vez. Si el pin rompe el layout, revisa la estructura del contenedor y deja claro qué bloque fija la escena y qué bloque aporta texto o altura de scroll.

Otro fallo muy habitual es construir la secuencia sin una versión estática legible. Si la escena solo funciona cuando todo se mueve, el problema no es ScrollTrigger: el problema es la composición base.

  • Recorrido corto + demasiados cambios = sensación atropellada.
  • Recorrido larguísimo + poca información = sensación de bloqueo.
  • Falta de contraste textual = el usuario no entiende qué está guiando el scroll.
  • No usar `markers` durante el ajuste inicial suele alargar mucho el debug.
Animaciones 3D en la Web
04

ScrollTrigger con scrub y pin: cómo convertir el scroll en dirección cinematográfica

Aprende a usar `ScrollTrigger` con `scrub`, `pin` y una estructura de secciones que convierta el desplazamiento en narrativa visual. La meta no es fijar un canvas porque sí, sino decidir cuándo una escena debe quedarse en pantalla y cómo repartir el viaje para que el usuario entienda qué está ocurriendo.

Código del tema: ScrollTrigger · scrub · pin

📘 Teoría

ScrollTrigger no es un truco de scroll: es una línea de tiempo anclada al documento

Lo primero es cambiar el modelo mental.

Con `ScrollTrigger` no piensas solo en animaciones, sino en una relación entre posición del documento y progreso visual. Ese cambio de mentalidad es clave porque obliga a diseñar el recorrido: dónde empieza, cuánto dura, qué se queda fijo y qué se suelta.

En una landing 3D profesional, el scroll no debe competir con la historia. Debe ser el mando que regula el avance del capítulo. Si intentas usarlo como simple disparador de efectos, la escena se siente decorativa. Si lo usas como tiempo narrativo, empieza a sentirse dirigida.

1

`trigger`

Define qué zona del documento gobierna la secuencia.

2

`start` y `end`

Acotan la distancia de scroll que se convierte en tiempo.

3

`scrub`

Ata el progreso de la animación al progreso del scroll.

4

`pin`

Mantiene el escenario visible mientras ocurre el viaje.

Estructura mínima de una secuencia pinned
const tl = gsap.timeline({
  scrollTrigger: {
    trigger: '.stage',
    start: 'top top',
    end: '+=2200',
    scrub: 1.2,
    pin: true
  }
});

Por qué `scrub: 1.2` suele funcionar mejor que `scrub: true`

La sincronización exacta no siempre produce la mejor sensación.

Con `scrub: true` la animación sigue de forma literal los saltos del dispositivo de scroll. En un trackpad puede sentirse bastante bien, pero en ratones más bruscos el resultado a veces parece rígido o entrecortado. Un valor numérico introduce inercia y deja que la escena alcance el punto de scroll con un pequeño retraso controlado.

Ese retraso es especialmente útil en recorridos de cámara, rotaciones largas o cambios de iluminación. No elimina la sensación de control, pero sí filtra parte de la vibración del scroll real y acerca el resultado a una experiencia más cinematográfica.

  • `scrub: true` es útil para depurar o para movimientos muy mecánicos.
  • Entre `1` y `1.5` segundos suele haber un equilibrio muy bueno entre control y suavidad.
  • Si el recorrido ya es lento, un scrub demasiado alto puede dar sensación de retraso excesivo.
  • Conviene probar con ratón y con trackpad antes de cerrar la duración.

Cuándo fijar la escena y cuándo no hacerlo

Pinning no significa prestigio; significa responsabilidad con el tiempo del usuario.

Fijar una escena tiene sentido cuando el usuario necesita permanecer dentro de un mismo plano mientras cambian cámara, producto, luces o capas de contenido. Si el efecto podría entenderse sin fijar, muchas veces es mejor no bloquear la página.

El error clásico es pinnear una sección durante miles de píxeles para contar algo mínimo. Ese abuso rompe ritmo, genera fatiga y empeora la percepción de velocidad del sitio. El pin debe durar lo justo para completar una idea con claridad.

1

Sí merece pin

Hero de producto, despiece visual, transición entre vistas o recorrido guiado de una escena.

2

No merece pin

Pequeños adornos, cambios de opacidad o detalles que pueden resolverse con scroll normal.

3

Error común

Usar `pin` para compensar una narrativa débil en lugar de mejorarla.

4

Efecto secundario

Si el contenido textual no acompaña, la sección se siente como un bloqueo, no como una experiencia.

Diseña por capítulos, no por efectos sueltos

La secuencia mejora cuando cada tramo tiene función visual y verbal.

Una estructura muy útil consiste en dividir la sección en tres o cuatro beats: entrada del escenario, momento de foco, detalle o giro de cámara, y liberación final. Eso te permite repartir duración, texto y cambios de estado de forma mucho más defensible.

Este método conecta muy bien con portfolios como el de Bruno Simon: detrás de la sensación lúdica hay una relación muy pensada entre interacción, cámara y descubrimiento progresivo. No se trata de copiar estética, sino de entender la intención.

Debug común: lo que suele romper una escena con scroll

Conviene detectar estos fallos antes de culpar al renderer o al modelo 3D.

Si el recorrido se siente brusco, primero revisa `scrub`, la longitud del `end` y si hay demasiadas propiedades compitiendo a la vez. Si el pin rompe el layout, revisa la estructura del contenedor y deja claro qué bloque fija la escena y qué bloque aporta texto o altura de scroll.

Otro fallo muy habitual es construir la secuencia sin una versión estática legible. Si la escena solo funciona cuando todo se mueve, el problema no es ScrollTrigger: el problema es la composición base.

  • Recorrido corto + demasiados cambios = sensación atropellada.
  • Recorrido larguísimo + poca información = sensación de bloqueo.
  • Falta de contraste textual = el usuario no entiende qué está guiando el scroll.
  • No usar `markers` durante el ajuste inicial suele alargar mucho el debug.

🧭 Visuales clave

Relación entre trigger, scrub, pin y capítulos narrativos

Ayuda a entender cómo se reparte la distancia de scroll entre entrada, foco y liberación sin convertir la escena en un bloqueo arbitrario.

Diagrama de una sección scroll-driven con trigger, tramo pinned, scrub y tres capítulos narrativos de producto

🧪 Aprende probando

Ejemplo Demo guiada: una escena pinned que responde al scroll Este preview simula la lógica de `pin` y `scrub` dentro de un contenedor con scroll interno. Lo importante no es el motor 3D, sino observar cómo una escena fija gana narrativa cuando el desplazamiento controla el progreso visual.
Ejemplo Ejemplo resuelto: ScrollTrigger sincronizando una rotación en R3F Este patrón no se ejecuta en el preview, pero sí refleja la integración profesional entre GSAP, ScrollTrigger, refs y una malla en R3F.
Ejemplo Demo interactiva: capítulo editorial con ScrollTrigger Esta demo amplia enseña un patrón muy útil para landings 3D: una narrativa scroll-driven con barra de progreso, bloques que entran por fases y jerarquía visual clara.
Ejemplo Demo interactiva: trazados SVG que se dibujan con scroll Aquí el scroll no mueve una cámara, pero sí dirige el tiempo de revelado. Es un buen patrón para secciones técnicas, circuitos visuales o storytelling de producto entre capítulos 3D.
Ejemplo Demo interactiva: tarjetas que aparecen con ScrollTrigger Ejemplo práctico de ScrollTrigger básico con tarjetas que se animan al entrar en viewport, mostrando la integración con GSAP.

🏁 Retos

Reto Reto 1: prepara un capítulo pinned con una duración defendible Tu misión es convertir un fragmento de página en una secuencia guiada por scroll, con un `end` razonable y un scrub suave.

¿Qué es esto?

Soy Cristian Eslava y a veces hago webs para procrastinar yo y vosotros 😉.

Esta la hice en febrero de 2026 para facilitar el aprendizaje de mis alumnxs. Aprender desarrollo web practicando. La idea es que crezca semanalmente con nuevos temas, tests y retos.

Inspirado en MDN, en W3Schools, en Codepen, en el crack de Manz y en mil sitios de documentación sobre desarrollo web. Quería aportar además de bloques teóricos con ejemplos, la gamificación de los retos y el sistema de test que ya tenía en culTest .

Si te gustó, si no te gustó, si quieres saludarme, o invitarme a 🍻 no dudes en escribirme en cristianeslava@gmail.com .