Ce que c’est
Un site d’opérateur de vols privés, complet : accueil sur un ciel animé avec moteur de recherche de vol, présentation, séquence « votre vol étape par étape » en trois photographies pleine page, services, hublot d’avion qui s’ouvre jusqu’à remplir l’écran, flotte, globe des destinations, histoire de l’entreprise, actualités, Instagram, demande de devis, pied de page. Une seule page, un seul fichier HTML.
Le design reprend celui d’un site néerlandais d’aviation d’affaires dont seules les photos ont été conservées. Tout le code a été réécrit : l’original tient dans 28 bundles Next.js (2,7 Mo), GSAP et son module ScrollTrigger, three.js pour le globe (1,8 Mo à lui seul), Lenis pour le défilement inertiel, Swiper pour les carrousels, 196 Ko de Tailwind compilé et trois domaines de mesure d’audience. Illisible, et impossible à modifier sans relancer une chaîne de build.
Le contenu de la démo reste en néerlandais, comme l’original. Ce n’est pas un oubli : un template se lit mieux quand le texte n’est pas du faux latin.
Ce que tu changes en premier
Les couleurs — six lignes
Tout en haut de assets/css/style.css :
--navy: #05275b; /* le texte, les boutons pleins, les épingles */
--navy-dark: #071831; /* le voile du hublot */
--cloud: #fcfdfe; /* le fond de page */
--accent: #0069c8; /* les surtitres, le focus */
--accent-strong: #004e96; /* le survol des boutons pleins */
--accent-light: #5eb2ff; /* le même bleu, éclairci pour le texte sur photo */
Une chose à comprendre avant de toucher au reste : il y a trois bleus d’accent, pas un. L’accent plein passe le contraste AA sur le blanc nuage (5,35:1), mais il disparaît dans le ciel d’une photo. C’est pour ça que la version éclaircie existe (7,84:1 sur le bleu nuit). Si tu changes l’accent, change les trois.
Le ciel lui-même est un dégradé à quatre arrêts, repris tel quel :
linear-gradient(#214c6f -10%, #7495b5 33.18%, #b4cadd 70.2%, #e5eaf0 100%).
Le nom
Cherche « Aerivo » dans index.html. Aucune classe CSS ne
contient la marque : un rechercher-remplacer ne peut rien casser.
Les tailles
L’échelle typographique est déclarée une fois, puis redéclarée à chacun des
quatre points de rupture — 1200, 991, 767 et 479 px, ceux du site d’origine.
Un titre n’a donc jamais sa propre media query : tu changes
--fs-h2 et toute la page suit.
Les 22 effets, et comment ils sont faits
Tous relevés dans le site d’origine par script, pas à l’œil : ses réglages
GSAP sont portés par des attributs data-* sur les éléments
eux-mêmes, ce qui donne les durées, les courbes et les plages de défilement
exactes. Ce qui n’y était pas a été mesuré au navigateur.
| Effet | Où | Comment |
|---|---|---|
| Rideau d’ouverture | page entière | un voile percé d’un trou en forme de pilule qui grandit jusqu’à tout avaler — mask-composite: subtract |
| Apparition au scroll | 12 blocs | IntersectionObserver, déclenchement à 15 % du bas de l’écran |
| Apparition mot à mot | 9 titres | le JS découpe en mots numérotés, le CSS traduit le numéro en retard de 50 ms |
| Parallaxe des nuages | accueil, 3 couches | −90 %, −80 % et −60 % de course, aux échelles 1 / 1,06 / 1,12 |
| Dérive sans fin des nuages | accueil, hublot | @property --drift : sans syntaxe déclarée, une variable saute au lieu de glisser |
| Descente de la barre de recherche | accueil | 70 vh de course, pilotée par la progression du bloc |
| Le cadre s’élargit | séquence | de la largeur du contenu à l’écran entier, et le rayon des coins tombe à zéro |
| Trois photos empilées | séquence | position: sticky sur trois éléments d’une liste |
| Puces de progression | séquence | la puce active s’étire en barre (600 ms) et se remplit au défilement |
| Carrousels | services, flotte | scroll-snap natif : glisser, balayer et le clavier marchent sans JS |
| Le hublot s’ouvre | « The sky is yours » | un masque de 320 px à 152 vmax : le voile bleu nuit est percé à la forme du hublot |
| Titre en diagonale | hublot | il traverse l’écran d’un coin à l’autre pendant les 200 vh de la section |
| Le globe | destinations | la même texture équirectangulaire que l’original, sur un disque ombré par trois dégradés |
| Épingles solidaires | destinations | le défilement tourne la texture de 30 % et décale les épingles d’autant |
| Bandes de nuages | globe, devis | la même bande retournée, en parallaxe — la rotation va dans transform, pas à côté |
| Voile blanc de raccord | globe, devis | il se rétracte à l’arrivée du bloc, la couture ne se voit jamais |
| Parallaxe des photos | séquence, histoire | image agrandie de 10 % pour que la dérive ne montre pas de bord |
| Le devis remonte | devis | 120 % de course sur la traversée de la section |
| Navigation escamotable | partout | elle s’efface en descendant, revient en remontant, 400 ms |
| Pastille de navigation | partout | le fond blanc apparaît une fois le premier écran passé |
| Survol des liens | navigation | le mot glisse vers le haut, sa copie prend sa place |
| Sélecteur aller-retour | accueil | deux boutons radio et :has() — la pastille glisse sans une ligne de JS |
Ce qu’il faut savoir
-
Un seul mécanisme pilote tout le défilement. Le script
écrit
--p, un nombre entre 0 et 1, sur chaque bloc qui portedata-track; le CSS s’en sert comme il veut. Trois façons de le mesurer — à l’arrivée du bloc, sur sa traversée, ou pendant qu’il est plus haut que l’écran. Pour ajouter une parallaxe : un attribut sur le conteneur, uncalc()sur l’enfant, zéro ligne de JavaScript. - Aucune requête externe. Vérifié en servant le dossier en HTTP : 0 requête hors du dossier. L’original en fait vers trois domaines de mesure d’audience et un espace de stockage.
-
Sans JavaScript, rien n’est caché. L’état caché n’existe
que si le script a tourné. Vérifié en retirant les balises
<script>: 15 titres sur 15 et 17 paragraphes sur 17 restent visibles, le rideau n’existe pas, le menu est une liste. -
Zéro style et zéro script en ligne. Le template respecte
la politique de sécurité stricte du site, vérifiée en servant le dossier
avec l’en-tête : 0 violation. C’est ce qui explique une particularité du
globe — les douze épingles sont placées par
:nth-child()dans la feuille, parce que l’attributstyleest bloqué. -
Pas d’
animation-timeline, qui n’existe que dans Chrome. Tout passe parIntersectionObserveret une variable CSS. -
Accessibilité : lien d’évitement, état du menu annoncé et
fermeture à Échap, position des carrousels annoncée, focus visible,
décorations masquées aux lecteurs d’écran, et
prefers-reduced-motionqui remet les durées et les retards à zéro. - Responsive vérifié à 390, 1440 et 2560 px, au chargement comme après défilement complet, sans débordement horizontal.
Ce qui n’est pas parfait
Autant le dire ici plutôt que te le laisser découvrir.
-
Le globe n’est pas une sphère. L’original en fait un
rendu WebGL : projection réelle, épingles qui disparaissent au bord,
rotation libre. Ici c’est un disque habillé de la même texture, ombré
par trois dégradés. La silhouette et les épingles y sont, la déformation
aux bords non. Coût de la fidélité complète : 1,8 Mo de bibliothèque et
un
<canvas>qu’aucun élève ne peut relire. - Le rideau d’ouverture dure 1,2 s au lieu de 5,4 s. L’original bloque le défilement, attend le chargement du globe puis le décodage de six images de nuages : cinq secondes et demie d’écran blanc avant le premier mot. C’est un défaut, pas un parti pris.
- Pas de défilement inertiel. L’original passe par Lenis. Une dépendance de plus pour un confort que la moitié des visiteurs trouve gênant.
- Le formulaire de recherche de vol ne cherche rien. Il pointait sur un moteur de tarification propriétaire ; c’est maintenant un lien vers le bloc de devis. Les champs restent modifiables et le sélecteur aller-retour fonctionne sans JavaScript.
- La page fait de 0,3 à 3,3 % de moins que la référence selon la largeur. La police de titre libre est plus étroite que la police commerciale d’origine : les titres tiennent parfois sur une ligne de moins. Rien ne se chevauche.
- Les gris de texte ont été assombris. L’original écrit ses libellés en bleu nuit à 50 %, soit 3,07:1 sur blanc — sous le seuil pour du texte de 13 px. Ils sont ici à 65 %, soit 4,82:1.
- Les photos viennent du site d’origine et sont vraisemblablement des prises de vue commandées par l’entreprise : elles ne sont pas redistribuables. Le code est à toi ; remplace les visuels. Les polices, elles, sont libres — les deux familles commerciales de l’original ont été remplacées.
Prends-le, ouvre-le, casse-le.
Aerivo est gratuit. La bibliothèque complète — les autres templates et les composants — est incluse dans l’abonnement, avec la formation.
Accès immédiat · Sans engagement · Annulation en 1 clic