Skip to main content
Sommaire du guide

Sommaire du guide

Temps de lecture : 14 min
#automation#animated#video#scroll#creative-coding#frontend
Intermédiaire14 min

Sites à défilement animé avec vidéo : guide complet de création

Comment créer un site premium avec effet de vidéo au défilement (style Apple) : découpe d'images en WebP, lissage LERP sur Canvas, remap de temps d'attente et système éditorial Precision Editorial.

Publié :
POUR AGENT IAChatGPTClaude

Animated Video Scroll est une technique de conception de sites one-page cinématographiques où le défilement de la page pilote directement la lecture du contenu vidéo. Lorsque l'utilisateur fait défiler la page à l'aide de la molette de la souris ou par un geste sur l'écran d'un smartphone, la vidéo change image par image en douceur, se synchronisant avec le rythme de lecture et l'apparition des blocs d'information.

Cet effet est devenu la signature des présentations de produits premium d'Apple, Tesla, Porsche et des principaux studios de design mondiaux.

Important

Cette technique ne consiste pas à intégrer un lecteur vidéo classique et n'utilise pas de GIF animés. Elle repose sur une séquence image par image de légères images WebP, rendues matériellement sur un élément <canvas> via WebGL ou 2D Context, garantissant une réactivité immédiate à chaque pixel de scroll.


1. Qu'est-ce qu'un site scroll-vidéo et ses avantages

La vidéo traditionnelle en arrière-plan de page présente deux inconvénients majeurs : elle suit son propre cours, ignorant l'attention du lecteur, et génère une charge élevée sur le réseau et la batterie des appareils mobiles.

Le site piloté par le scroll résout ce problème :

  • Contrôle total de l'attention : L'utilisateur choisit lui-même le rythme de visualisation. S'il s'arrête sur un paragraphe important, l'objet dans le cadre se fige sous l'angle souhaité.
  • Absence de latences et de buffering : Le fichier vidéo est pré-découpé en statiques WebP optimisés, évitant ainsi au navigateur de devoir effectuer un décodage lourd de conteneurs MP4 lors d'un scroll rapide.
  • Synchronisation narrative : Les thèses textuelles, les annotations graphiques, les métriques numériques et les spécifications techniques apparaissent précisément lorsque la caméra met en évidence le détail correspondant de l'objet.

Adéquation avec le type de projet

Type de produitPourquoi le scroll-vidéo convientFocus clé dans le cadre
Automobiles et machinesMet en valeur l'aérodynamisme, les détails du châssis, les matériaux de l'intérieurMouvement fluide de la caméra le long de la carrosserie, changement d'angles
Électronique premiumDémontre l'assemblage de précision, l'épaisseur du boîtier, l'optiqueÉclatement en composants (exploded view), macrophotographie
Architecture et immobilierCrée une sensation spatiale de volume et d'éclairageVol à travers la façade vers l'intérieur
Mode et joaillerieMontre la texture du tissu, le jeu de lumière sur le métalDélicat mouvement de la lumière autour de l'objet

2. Architecture et structure de fichiers de la compétence

La compétence est construite comme un pipeline d'ingénierie modulaire. Chaque composant gère une étape isolée du travail :

text
animated-sites-engine/ ├── SKILL.md # Instructions scénarisées : de l’analyse vidéo à la mise en page ├── visual-system.md # Système de design Precision Editorial et règles de grille ├── extract_frames.py # Utilitaire Python pour l’extraction et l’optimisation des images WebP └── evals.json # Benchmark et critères d’évaluation de la qualité du site

1. SKILL.md — Instruction principale et algorithme scénaristique

Décrit le cycle de vie de la création de la page : depuis l'analyse technique du matériau source via ffprobe jusqu'à la structuration en chapitres sémantiques, le calcul de la durée du scroll et l'assemblage de l'application HTML/JS finale.

2. visual-system.md — Guide du système Precision Editorial

Établit des règles esthétiques strictes : rejet des clichés bon marché (lueurs néon injustifiées, panneaux en verre et police Playfair), palette « Trackline » prête à l'emploi pour les récits techniques, 5 schémas de base pour le placement du texte et paires typographiques.

3. extract_frames.py — Script d'extraction et de compression des images

Utilitaire console en Python. Lit automatiquement les métadonnées vidéo via ffprobe, calcule le nombre proportionnel d'images, découpe des flux séparés pour Desktop et Mobile au format WebP et génère le manifest.json.

4. evals.json — Scénarios de vérification de qualité

Contient un cas de référence test (basé sur une vidéo Porsche) qui vérifie la fluidité du LERP, le comportement du canvas lors du redimensionnement de la fenêtre, l'accessibilité clavier et le poids des assets.


3. Mécanique de lecture : Canvas, LERP et Dwell-Remap

Le cœur du fonctionnement repose sur un élément <canvas> fixé plein écran (position: fixed). Le défilement de la page est converti en un progrès relatif allant de 0.0 à 1.0, qui détermine quel numéro d'image doit être affiché.

text
Position de défilement (0.0 — 1.0) │ ▼ ┌───────────────────────┐ │ Dwell-Remap │ ──► Ralentissement artificiel près des centres des chapitres └──────────┬────────────┘ │ ▼ ┌───────────────────────┐ │ Filtre LERP │ ──► targetFrame rattrape le défilement par un pas progressif et fluide └──────────┬────────────┘ │ ▼ ┌───────────────────────┐ │ Canvas HTML5 2D │ ──► ctx.drawImage(loadedImages[frameIndex], ...) └───────────────────────┘

1. Lissage via LERP (Linear Interpolation)

Si les images sont changées strictement à chaque événement de scroll, l'animation paraîtra saccadée, surtout avec des souris à molette discrète.

Pour obtenir une fluidité cinématographique, on applique une interpolation linéaire : l'image affichée à l'écran (currentFrame) « rattrape » progressivement l'image cible (targetFrame).

javascript
let currentFrame = 0; let targetFrame = 0; const lerpFactor = 0.075; // Коефіцієнт згладжування (0.05 — 0.1) function renderLoop() { // Наближаємо поточний кадр до цільового 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. Ralentissement près de chaque chapitre (Dwell-Remap)

Pour permettre à l'utilisateur de lire le titre et le texte sans avoir besoin d'arrêter finement la molette de la souris, la technique Dwell-Remap est appliquée. Au centre de chaque chapitre, la vitesse de défilement des images est artificiellement ralentie, maintenant un mouvement fluide entre eux.

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) { // Плавне згасання коефіцієнта швидкості по косинусоїді 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. Chargement progressif des images

Pour éviter les flashs blancs et ne pas attendre le chargement de tout le paquet (100–150 images), une stratégie en deux étapes est utilisée :

  1. Priorité critique : Les 5 premières images et les images clés des chapitres principaux sont chargées instantanément.
  2. File d'attente en arrière-plan : Les autres images sont récupérées par petits lots via requestIdleCallback ou une file de promesses. Si l'image requise est encore en transit, le canvas affiche l'image chargée la plus proche.

4. Processus de développement étape par étape : de la vidéo au code

L'ensemble du processus de production est divisé en sept étapes séquentielles :

Étape 1. Analyse de la vidéo via ffprobe

Avant la génération du code, les paramètres techniques du fichier source sont analysés :

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

Une planche contact de 6 images clés est créée pour évaluer le mouvement de la caméra, la position de l'objet et la disponibilité d'espace négatif (negative space) pour le texte.

Étape 2. Formulation du concept de design

Une thèse claire est formulée :

  • Protagoniste : Qui ou quoi est au centre de l'attention.
  • Émotion cible : Précision technique, luxe sobre, adrénaline, méditation.
  • Paire de polices : Titre contrasté et accent monospace ingénierie.
  • Touche signature : Télémétrie, tracking variable, compteur de micro-images.

Étape 3. Découpe et optimisation des images

Le nombre d'images et la hauteur du scroll sont ajustés selon la durée de la vidéo :

Durée vidéoNombre d'imagesHauteur de scroll recommandéePoids cible total (WebP)
0–5 secondes60–80 images450–550vh4–7 Mo
5–15 secondes90–130 images600–750vh8–12 Mo
15–30 secondes130–180 images750–900vh10–15 Mo
30+ secondes180–200 images900–1000vh12–16 Mo

Lancement de l'extraction via le script Python :

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

Étape 4. Scénario par chapitres

La page est divisée en 4–6 sections substantielles. Par exemple :

  1. Chapitre 1 : Introduction (0–15%) — Nom du modèle, silhouette minimaliste.
  2. Chapitre 2 : Aérodynamique (20–40%) — Focus sur la géométrie de l'aileron et des conduits d'air.
  3. Chapitre 3 : Groupe motopropulseur (45–65%) — Présentation du moteur ou du châssis avec données télémétriques.
  4. Chapitre 4 : Final et action (75–100%) — Révélation complète de la voiture et bouton d'essai.

Étape 5. Composition des couches et mise en page autour de la vidéo

Le texte ne doit jamais recouvrir les détails clés dans le cadre. Selon la trajectoire de mouvement de l'objet, la position des blocs de texte change doucement du bord gauche au droit ou se fixe dans le tiers inférieur de l'écran.

Étape 6. Assemblage basé sur un template de départ

Un squelette HTML5 robuste avec logique de chargement prête et support responsive est utilisé, auquel sont connectés les tokens de couleurs individuels et le manifest des images.

Étape 7. Vérification et critique

Astuce

Testez toujours les sites scroll via un serveur HTTP local (python3 -m http.server), plutôt qu'en ouvrant le fichier directement via file:///. Les politiques CORS des navigateurs bloquent le chargement des images WebP via fetch() lors de l'ouverture locale de fichiers.


5. Système visuel : typographie et palette Trackline

Le système Precision Editorial exige l'abandon des excès décoratifs au profit d'une mise en page suisse éprouvée et d'une esthétique d'instruments de contrôle.

Combinaisons typographiques

  • Titres : Archivo (Black, Tracking serré -0.03em)
  • Texte principal : Archivo (Regular, 15px)
  • Légendes techniques et télémétrie : IBM Plex Mono (Medium, 11px, Majuscules)
  • Idéal pour : Automobiles, aviation, ingénierie lourde, mécanismes horlogers.

Palette de couleurs « Trackline »

La palette est construite sur les couleurs d'une vraie piste : carbone mat, aluminium froid et accents de course sobres.

css
:root { /* Базові відтінки */ --color-carbon: #080a09; /* Глибокий чорний вуглепластик (основний фон) */ --color-paper: #f1f0e9; /* Теплий матовий білий (основний текст) */ --color-alloy: #a8aca8; /* Металевий алюміній (другорядні підписи) */ --color-track: #414541; /* Графітовий асфальт (межі сітки, розділювачі) */ /* Акцентні інженерні маркери */ --color-petrol: #12372d; /* Глибокий петролеум для підкладок карток */ --color-signal: #d9381e; /* Гоночний червоний (активні стани, алерти) */ --color-heritage: #c5a059; /* Золотистий колір для прогрес-бару та таймінгу */ }
Note

Les couleurs signalétiques (--color-signal et --color-heritage) sont utilisées ponctuellement — pour indiquer le chapitre actif ou l'indicateur de position, occupant moins de 3% de la surface de l'écran.


6. Composition des couches, mouvement et touches signature

La page est construite à partir de trois couches indépendantes en profondeur visuelle :

text
┌─────────────────────────────────────────────────────────────┐ │ 3. Couche interface : barre de progression, indicateur de │ │ chapitre, boutons d'action │ ├─────────────────────────────────────────────────────────────┤ │ 2. Couche informationnelle : titre, description, bloc │ │ de télémétrie │ ├─────────────────────────────────────────────────────────────┤ │ 1. Couche Canvas : vidéo plein écran avec rendu LERP │ └─────────────────────────────────────────────────────────────┘

5 variantes de composition du texte

Schéma de compositionEmplacement du contenuScénario d'utilisation optimal
Masthead StatementTitre géant centré sur tout l'écranPremier écran d'ouverture (intro de la vidéo)
Side Margin AnnotationColonne étroite (3–4 cols) à droite ou à gaucheL'objet bouge dans la partie opposée du cadre
Split StatementTitre à gauche, description technique à droiteL'objet est stablement fixé strictement au centre
Telemetry DockBandeau horizontal en bas avec données d'instrumentationDémonstration de dynamique, vitesse, puissance
Final CalloutBloc focalisé avec une seule action principale (CTA)Écran final après la fin de la séquence vidéo

Principes d'animation des éléments DOM

Puisque la vidéo sur canvas crée déjà un mouvement intense, l'animation des blocs de texte doit être sobre :

  • Apparition via masque : Le texte monte depuis le bas à travers un conteneur avec overflow: hidden.
  • Décalage : Pas plus de 16–24px sur l'axe Y.
  • Timings : 600–800ms à l'entrée du chapitre avec la courbe cubic-bezier(0.16, 1, 0.3, 1).
  • Aucun flou : Le filtre filter: blur() est strictement interdit — il provoque le recalcul des couches du navigateur et détruit la stabilité des 60 FPS.

7. Antipatterns : abandon des clichés « luxe » obsolètes

La plupart des landing pages vidéo génériques paraissent bon marché à cause d'un ensemble de clichés designers typiques. Voici ce qu'il faut totalement abandonner :

Cliché obsolètePourquoi c'est mauvaisAlternative professionnelle
Playfair Display + grotesque finTemplate standard de « pseudo-luxe »Grotesques de précision : Archivo, Roboto Flex, Manrope
Glassmorphism (verre dépoli)Floute la vidéo de fond, surcharge le GPUTexte pur contrasté dans l'espace libre du cadre
Particules flottantes et poussièreDétournent l'attention de l'objet réelCanvas propre sans déchets décoratifs artificiels
Dégradés néon violet-bleuAssociés aux templates crypto génériquesCouleurs naturelles prises directement des images vidéo
Curseur custom avec délaiCrée une sensation de lag et est inconfortableCurseur système natif avec hovers clairs

8. Performance, Accessibilité (A11y) et Optimisation Mobile

Les sites scroll avec beaucoup de graphismes nécessitent une discipline technique rigoureuse :

1. Limitation du Device Pixel Ratio (DPR)

Les smartphones modernes ont des écrans avec un DPR de 3.0 ou 3.5. Si le canvas est rendu à cette résolution, la surface de calcul augmente presque 10 fois, surchauffant immédiatement le processeur.

javascript
// Обмежуємо максимальний DPR значенням 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. Pause du rendu pour les onglets cachés

Lorsque l'utilisateur change d'onglet, le rendu doit s'arrêter instantanément :

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

3. Mode réduction d'animation (prefers-reduced-motion)

Pour les personnes ayant un appareil vestibulaire sensible, le défilement constant image par image peut provoquer des vertiges.

Important

Si le paramètre prefers-reduced-motion: reduce est activé dans le système d'exploitation, le site doit afficher un poster statique de haute qualité ou une galerie diaporama simplifiée à la place du défilement infini des images.

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

9. Atelier pratique : création et lancement du projet

Créons une structure minimale fonctionnelle de site scroll.

Étape 1. Génération des images depuis la vidéo

Placez la vidéo dans le dossier de travail et lancez la découpe :

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

Le script créera le fichier manifest frames/manifest.json :

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

Étape 2. Structure de fichiers du projet fini

text
my-scroll-site/ ├── index.html # Structure HTML et logique du lecteur canvas ├── styles.css # Tokens Precision Editorial et requêtes média ├── app.js # Boucle LERP, remap de dwell et gestion du défilement └── frames/ ├── desktop/ # frame-0001.webp ... frame-0120.webp ├── mobile/ # frame-0001.webp ... frame-0080.webp └── manifest.json # Métadonnées et dimensions

Étape 3. Lancement de l'environnement local

Pour un chargement correct des ressources, lancez un serveur HTTP local :

bash
python3 -m http.server 3000

Ouvrez l'adresse http://localhost:3000 dans le navigateur et vérifiez la fluidité du défilement des images et la correction du changement de chapitres.


10. Checklist finale de préparation du site scroll

Avant la release du projet, vérifiez la conformité à tous les critères techniques et visuels :

Métriques techniques

  • Le poids total des images de la version desktop ne dépasse pas 12 Mo (mobile — jusqu'à 5 Mo).
  • Les 5 premières images ont un preload prioritaire (preload).
  • Le coefficient DPR est limité à la valeur 2 pour éviter la surchauffe des appareils mobiles.
  • La boucle requestAnimationFrame s'arrête lors du passage à un autre onglet du navigateur.

Expérience utilisateur et accessibilité

  • Transition LERP douce entre les images sans à-coups brusques implémentée.
  • Dwell-Remap configuré pour une lecture confortable du texte près de chaque chapitre.
  • Le mode prefers-reduced-motion avec poster statique est supporté.
  • La taille minimale des éléments cliquables est de 44×44px.

Design et esthétique

  • Une paire de polices d'ingénierie nette est utilisée, sans clichés pseudo-luxe.
  • Le texte ne recouvre pas l'objet mobile principal dans le cadre.
  • Les couleurs de l'interface sont empruntées directement au matériau vidéo.
  • La page se termine par un appel à l'action (CTA) clair et unique.
Ce guide est entièrement gratuit. S'il vous a fait gagner une soirée, vous pouvez soutenir la croissance du projet.
Soutenir l'auteur