Skip to main content
Contenido de la guía

Contenido de la guía

Tiempo de estudio: 14 min
#automation#animated#video#scroll#creative-coding#frontend
Intermedio14 min

Sitios web con scroll de video animado: guía completa de producción

Cómo crear sitios web cinematográficos con reproducción de video controlada por scroll (estilo Apple): extracción de fotogramas WebP, suavizado LERP en Canvas, dwell-remap y el sistema Precision Editorial.

Publicado:

Animated Video Scroll es una técnica para crear páginas web cinematográficas de una sola página donde el desplazamiento del usuario controla directamente la reproducción fotograma a fotograma de un video en alta definición. A medida que el visitante utiliza la rueda del ratón o desliza en su móvil, el metraje avanza o retrocede sincronizado con su ritmo de lectura y la aparición de bloques informativos.

Este patrón interactivo es el estándar distintivo en los lanzamientos de productos de Apple, Tesla, Porsche y de los mejores estudios de diseño del mundo.

Importante

Esta técnica no consiste en incrustar un reproductor de video tradicional ni en usar archivos GIF pesados. Se basa en una secuencia de imágenes WebP optimizadas y renderizadas por aceleración de hardware en un elemento <canvas> mediante WebGL o 2D Context, garantizando una respuesta instantánea a cada píxel desplazado.


1. Qué es un sitio con scroll de video y por qué utilizarlo

El video de fondo con reproducción automática presenta dos graves inconvenientes: avanza independientemente de la atención del usuario y genera un consumo excesivo de batería y datos móviles.

Un sitio interactivo basado en canvas y scroll soluciona ambos problemas:

  • Control total de la atención: El usuario dicta la velocidad de exploración. Al detenerse en una especificación clave, la cámara congela el ángulo exacto.
  • Respuesta inmediata sin buffering: El video se extrae previamente en fotogramas WebP independientes, eliminando la pesada decodificación de contenedores MP4 durante desplazamientos rápidos.
  • Sincronización narrativa: Titulares, diagramas técnicos, métricas de telemetría y llamadas a la acción aparecen justo cuando la cámara revela el componente correspondiente.

Matriz de idoneidad del proyecto

Sector / ProductoPor qué encaja el scroll de videoSujeto visual principal
Automoción y maquinariaResalta la aerodinámica, ingeniería de chasis y acabadosVuelos fluidos de cámara a lo largo de la carrocería
Electrónica de consumoMuestra ensamblajes de precisión y acabados de metal/vidrioDespieces en perspectiva explotada, planos macro
Arquitectura e inmobiliariaTransmite sensación de volumen, luz y materialesRecorridos aéreos desde la fachada hasta los interiores
Moda y joyeríaCaptura la caída de los tejidos y el brillo de la luzMovimientos lumínicos sutiles sobre los materiales

2. Arquitectura y estructura de archivos del sistema

El flujo de trabajo se organiza como una cadena de ingeniería modular donde cada componente desempeña una función aislada:

text
animated-sites-engine/ ├── SKILL.md # Guion principal: del análisis del video a la maquetación ├── visual-system.md # Sistema de diseño Precision Editorial y reglas de cuadrícula ├── extract_frames.py # Utilidad en Python para extracción y compresión WebP └── evals.json # Criterios de evaluación y verificación de calidad

1. SKILL.md — Núcleo del proceso y algoritmo de capítulos

Define el ciclo de producción completo: análisis técnico con ffprobe, división en capítulos narrativos, cálculo de la altura de scroll y generación del código HTML/JS base.

2. visual-system.md — Sistema de diseño Precision Editorial

Establece estándares visuales estrictos: eliminación de clichés superficiales (brillos de neón, tarjetas de cristal translúcido y tipografía Playfair), paleta funcional «Trackline» y 5 esquemas de composición de contenido.

3. extract_frames.py — Script de extracción y optimización de fotogramas

Herramienta de consola en Python. Analiza los metadatos con ffprobe, calcula el número óptimo de fotogramas, genera flujos separados para escritorio y móvil en formato WebP y crea manifest.json.

4. evals.json — Criterios de verificación de calidad

Contiene un caso de prueba de referencia (utilizando un video de Porsche GT3 en pista) que evalúa la fluidez del LERP, el comportamiento adaptativo del canvas, la accesibilidad con teclado y el peso total de los recursos.


3. Mecánica de reproducción: Canvas, LERP y Dwell-Remap

En el núcleo de la interfaz se encuentra un elemento <canvas> fijado a pantalla completa (position: fixed). El desplazamiento se normaliza en un progreso relativo entre 0.0 y 1.0, el cual se asigna directamente al índice del fotograma activo.

text
Progreso de scroll (0.0 — 1.0) │ ▼ ┌───────────────────────┐ │ Dwell-Remap │ ──► Desaceleración en los centros de cada capítulo └──────────┬────────────┘ │ ▼ ┌───────────────────────┐ │ Filtro LERP │ ──► targetFrame suaviza los pasos bruscos del ratón └──────────┬────────────┘ │ ▼ ┌───────────────────────┐ │ HTML5 2D Canvas │ ──► ctx.drawImage(loadedImages[frameIndex], ...) └───────────────────────┘

1. Suavizado mediante LERP (Linear Interpolation)

Vincular el fotograma directamente a cada evento de scroll produce saltos bruscos en ratones con rueda por pasos.

Para lograr un movimiento cinematográfico, se implementa interpolación lineal: el fotograma mostrado en pantalla (currentFrame) persigue gradualmente al fotograma objetivo (targetFrame).

javascript
let currentFrame = 0; let targetFrame = 0; const lerpFactor = 0.075; // Factor de suavizado (habitualmente entre 0.05 y 0.1) function renderLoop() { // Aproximación suave del fotograma actual al objetivo currentFrame += (targetFrame - currentFrame) * lerpFactor; const frameToDraw = Math.round(currentFrame); drawCanvasFrame(frameToDraw); requestAnimationFrame(renderLoop); } window.addEventListener("scroll", () => { const maxScroll = document.documentElement.scrollHeight - window.innerHeight; const progress = Math.min(Math.max(window.scrollY / maxScroll, 0), 1); targetFrame = progress * (totalFrames - 1); }, { passive: true });

2. Desaceleración en capítulos (Dwell-Remap)

Para permitir que el usuario lea los títulos y descripciones sin necesidad de detener la rueda del ratón con precisión milimétrica, Dwell-Remap reduce deliberadamente la velocidad del video cerca de los puntos centrales de cada capítulo.

javascript
function applyDwellRemap(rawProgress, chapterPoints = [0.2, 0.5, 0.8], dwellWidth = 0.08, strength = 0.45) { let remapped = rawProgress; for (const center of chapterPoints) { const distance = Math.abs(rawProgress - center); if (distance < dwellWidth) { // Curva coseno de amortiguación suave const factor = Math.cos((distance / dwellWidth) * (Math.PI / 2)); const delta = (rawProgress - center) * (1 - factor * strength); remapped = center + delta; break; } } return Math.min(Math.max(remapped, 0), 1); }

3. Carga progresiva de fotogramas

Para evitar parpadeos blancos en el canvas y no obligar al visitante a esperar la descarga de más de 120 fotogramas, se utiliza un sistema en dos fases:

  1. Prioridad crítica: Se cargan de inmediato los primeros 5 fotogramas y los fotogramas clave de cada capítulo antes de mostrar la página.
  2. Cola en segundo plano: El resto de fotogramas se descarga en lotes mediante requestIdleCallback. Si el fotograma requerido aún no está disponible, el canvas muestra el más cercano ya descargado.

4. Proceso de producción paso a paso: del video al código

El desarrollo completo se estructura en siete etapas:

Paso 1. Análisis técnico mediante ffprobe

Antes de escribir código, se analizan las especificaciones del video original:

bash
ffprobe -v error -select_streams v:0 \ -show_entries stream=width,height,duration,r_frame_rate,codec_name \ -of default=noprint_wrappers=1 input.mp4

Se genera una hoja de contacto con 6 fotogramas clave para evaluar la trayectoria de la cámara, la posición del sujeto y el espacio negativo disponible para los textos.

Paso 2. Formulación del concepto de diseño

Se define una propuesta creativa precisa:

  • Sujeto protagonista: Elemento central del metraje.
  • Tono deseado: Precisión técnica, lujo sobrio, velocidad o minimalismo funcional.
  • Combinación tipográfica: Titular rotundo acompañado de un acento monoespaciado.
  • Detalle distintivo: Panel HUD de telemetría, estiramiento de tipografía variable o contador de fotogramas.

Paso 3. Extracción y optimización de fotogramas

El número de fotogramas y la altura de scroll se calculan en función de la duración del video:

Duración del videoNúmero de fotogramasAltura de scroll recomendadaLímite de peso total (WebP)
0–5 segundos60–80 fotogramas450–550vh4–7 MB
5–15 segundos90–130 fotogramas600–750vh8–12 MB
15–30 segundos130–180 fotogramas750–900vh10–15 MB
30+ segundos180–200 fotogramas900–1000vh12–16 MB

Comando de extracción en Python:

bash
python3 extract_frames.py \ --input ./raw/porsche-gt3.mp4 \ --output ./public/frames \ --desktop-frames 120 \ --mobile-frames 80 \ --quality 62

Paso 4. Estructuración en capítulos

El contenido se divide en 4 a 6 secciones temáticas. Por ejemplo:

  1. Capítulo 1: Introducción (0–15%) — Nombre del modelo y silueta inicial.
  2. Capítulo 2: Aerodinámica (20–40%) — Detalle del alerón trasero y tomas de aire.
  3. Capítulo 3: Propulsión (45–65%) — Chasis o vano motor con telemetría.
  4. Capítulo 4: Llamada a la acción (75–100%) — Vista global del vehículo y botón de prueba.

Paso 5. Composición en capas y espacio negativo

El texto nunca debe solaparse con el elemento en movimiento. Según se mueva la cámara, el texto se desplaza de la columna izquierda a la derecha o se ancla en el tercio inferior.

Paso 6. Ensamblaje con la plantilla base

Se introducen los tokens de color, el manifiesto de fotogramas y los contenidos en la plantilla HTML5 optimizada.

Paso 7. Verificación y crítica

Consejo

Prueba siempre el sitio mediante un servidor HTTP local (python3 -m http.server) y no abriendo archivos file:///. Las políticas CORS de los navegadores bloquean las peticiones asíncronas de imágenes WebP al abrir archivos directamente desde el disco.


5. Sistema visual: tipografía y paleta Trackline

La filosofía Precision Editorial descarta los adornos innecesarios en favor del rigor tipográfico suizo y la estética de instrumentación técnica.

Parejas tipográficas recomendadas

  • Titulares: Archivo (Black, tracking ajustado -0.03em)
  • Texto general: Archivo (Regular, 15px)
  • Telemetría e indicadores: IBM Plex Mono (Medium, 11px, Uppercase)
  • Recomendado para: Automoción, aeroespacial, alta ingeniería, relojería.

Paleta cromática «Trackline»

Inspirada en el asfalto de circuito, materiales compuestos y luces de control:

css
:root { /* Superficies base */ --color-carbon: #080a09; /* Negro carbono mate (fondo principal) */ --color-paper: #f1f0e9; /* Blanco cálido mate (texto principal) */ --color-alloy: #a8aca8; /* Gris aluminio anodizado (texto secundario) */ --color-track: #414541; /* Gris asfalto (guías de cuadrícula y divisores) */ /* Acentos de señalización */ --color-petrol: #12372d; /* Verde petróleo de competición (fondo de tarjetas) */ --color-signal: #d9381e; /* Rojo FIA (estados activos y avisos) */ --color-heritage: #c5a059; /* Tono dorado tenue (barra de progreso y tiempos) */ }
Nota

Los colores de acento (--color-signal y --color-heritage) se aplican con moderación, ocupando no más del 3% de la superficie visual para mantener la sobriedad técnica.


6. Composición en capas, movimiento y recursos de autor

Cada página se compone de tres capas visualmente independientes:

text
┌─────────────────────────────────────────────────────────────┐ │ 3. Capa de interfaz: barra de progreso, píldora de capítulo │ ├─────────────────────────────────────────────────────────────┤ │ 2. Capa de información: títulos, textos y panel telemetría │ ├─────────────────────────────────────────────────────────────┤ │ 1. Capa de Canvas: video a pantalla completa con LERP │ └─────────────────────────────────────────────────────────────┘

5 esquemas de distribución del contenido

Esquema de composiciónDisposición del contenidoCaso de uso idóneo
Masthead StatementTitular de gran formato centrado en pantallaPantalla de apertura al inicio del video
Side Margin AnnotationColumna estrecha (3–4 cols) fijada a un ladoEl objeto se desplaza por el lado opuesto
Split StatementTitular a la izquierda, especificaciones a la derechaEl sujeto permanece fijo en el centro
Telemetry DockPanel horizontal bajo con datos instrumentalesMuestra de métricas de potencia, velocidad o cotas
Final CalloutTarjeta de cierre con una única acción principalPantalla final tras concluir la reproducción

Principios de animación en el DOM

Dado que el video en el canvas ya proporciona un movimiento intenso, las capas de texto deben animarse con contención:

  • Aparición con máscara: El texto asciende desde un contenedor con overflow: hidden.
  • Desplazamiento reducido: No superior a 16–24px en el eje Y.
  • Tiempos: Entre 600 y 800ms con curva cubic-bezier(0.16, 1, 0.3, 1).
  • Cero desenfoques: La propiedad filter: blur() queda vetada para asegurar 60 FPS estables.

7. Antipatrones: eliminación de clichés anticuados

Muchos sitios de video caen en recursos genéricos que abaratan el diseño. Conviene descartarlos por completo:

Cliché obsoletoPor qué perjudica al proyectoAlternativa profesional
Playfair Display + grotesca finaPlantilla genérica de «falso lujo»Tipografías con carácter industrial: Archivo, Roboto Flex
Glassmorphism (vidrio esmerilado)Enturbia el video y sobrecarga la GPUTipografía nítida y contrastada sobre espacio negativo
Partículas y polvo flotanteDistrae la atención del producto realCanvas despejado sin efectos decorativos artificiales
Gradientes de neón azul y moradoCliché asociado a páginas cripto genéricasColores naturales extraídos directamente del video
Cursor personalizado con retrasoIntroduce sensación de lag y empeora el usoCursor del sistema nativo con estados hover claros

8. Rendimiento, accesibilidad (A11y) y optimización móvil

1. Limitación del Device Pixel Ratio (DPR)

En pantallas móviles con DPR 3.0, renderizar un canvas completo satura la GPU. Limita el DPR a un máximo de 2.0:

javascript
// Limitamos el DPR máximo a 2.0 const dpr = Math.min(window.devicePixelRatio || 1, 2); canvas.width = window.innerWidth * dpr; canvas.height = window.innerHeight * dpr; ctx.scale(dpr, dpr);

2. Pausa del bucle en pestañas ocultas

Detén el renderizado cuando el usuario cambie de pestaña:

javascript
document.addEventListener("visibilitychange", () => { if (document.hidden) { cancelAnimationFrame(animationFrameId); } else { requestAnimationFrame(renderLoop); } });

3. Soporte para reducción de movimiento (prefers-reduced-motion)

Importante

Si el sistema operativo tiene activado prefers-reduced-motion: reduce, sustituye la secuencia continua de fotogramas por un póster estático en alta resolución o una composición fotográfica clásica.

css
@media (prefers-reduced-motion: reduce) { .scroll-container { height: auto !important; } canvas { display: none !important; } .static-hero-fallback { display: block !important; } }

9. Taller práctico: creación y puesta en marcha

Paso 1. Extracción de fotogramas

Ubica el archivo de video en la carpeta de trabajo y ejecuta:

bash
mkdir my-scroll-site && cd my-scroll-site python3 extract_frames.py --input sample.mp4 --output ./frames --desktop-frames 120

Se generará el archivo frames/manifest.json:

json
{ "totalFrames": 120, "desktop": { "pathPattern": "frames/desktop/frame-%04d.webp", "width": 1920, "height": 1080, "totalWeightMb": 9.4 }, "recommendedScrollVh": 700 }

Paso 2. Estructura de archivos del proyecto

text
my-scroll-site/ ├── index.html # Estructura del reproductor canvas ├── styles.css # Tokens Precision Editorial y media queries ├── app.js # Bucle LERP, dwell-remap y listeners de scroll └── frames/ ├── desktop/ # frame-0001.webp ... frame-0120.webp ├── mobile/ # frame-0001.webp ... frame-0080.webp └── manifest.json # Metadatos y dimensiones

Paso 3. Inicio del servidor local

bash
python3 -m http.server 3000

Abre http://localhost:3000 en tu navegador y comprueba la sincronización de fotogramas con el desplazamiento.


10. Lista de comprobación final de lanzamiento

Ingeniería y rendimiento

  • El peso de los fotogramas de escritorio no supera 12 MB (móvil hasta 5 MB).
  • Los primeros 5 fotogramas cuentan con precarga prioritaria (preload).
  • El DPR del canvas está limitado a 2.0.
  • El bucle requestAnimationFrame se detiene cuando la pestaña está en segundo plano.

Experiencia de usuario y accesibilidad

  • La interpolación LERP ofrece una transición continua sin sacudidas.
  • Dwell-Remap permite leer con comodidad el texto de cada capítulo.
  • Existe alternativa estática para prefers-reduced-motion.
  • Las zonas de interacción táctil superan las dimensiones mínimas de 44×44px.

Estética y dirección de arte

  • Se emplea una combinación tipográfica con carácter industrial.
  • La disposición del texto respeta el espacio del sujeto en movimiento.
  • Los colores de la interfaz se derivan de la paleta real del video.
  • La página finaliza con una llamada a la acción (CTA) rotunda y clara.
Esta guía es completamente gratuita. Si te ahorró una noche, puedes apoyar el crecimiento del proyecto.
Apoyar al autor