Page d’atterrissage HTML/CSS pure : Hero, Fonctionnalités, Tarifs, FAQ (style Documentation)
Vous n’avez pas besoin d’un framework pour publier une page d’atterrissage crédible. Il faut du HTML discipliné, du CSS sobre et la paranoïa opérationnelle pour la garder rapide quand le marketing ajoute inévitablement « encore un badge ».
Ceci est une feuille de route orientée production : une page style documentation qui se lit comme de la doc d’ingénierie, vend comme une landing, et se comporte comme du contenu statique doit le faire — prévisible, cacheable et ennuyeuse dans le bon sens.
- Aucun JavaScript requis
- Accessible par défaut
- Bonnes pratiques méta SEO
- Dépannage niveau SRE
Table des matières
- Objectifs de conception pour une landing docs-style
- Structure HTML qui évolue sans drame
- Section fonctionnalités qui répond aux véritables objections
- Tarification qui évite les tickets support
- FAQ qui réduit le bruit commercial
- Faits et histoire : pourquoi « juste HTML/CSS » gagne encore
- Tâches opératoires pratiques : commandes, sorties, décisions
- Playbook de diagnostic rapide
- Erreurs courantes : symptômes → cause racine → correctif
- Trois mini-histoires d’entreprise issues du terrain
- Checklists / plan étape par étape
- Étapes suivantes
Objectifs de conception pour une landing docs-style
Une landing docs-style, c’est ce qui se produit quand vous respectez le temps du lecteur. L’objectif n’est pas d’hypnotiser quelqu’un avec des dégradés jusqu’à ce qu’il clique sur un bouton. L’objectif est de lui permettre de s’auto-qualifier rapidement : « Est-ce pour moi ? » et « Est-ce que ça marchera dans mon environnement ? »
Si vous avez déjà été d’astreinte tandis qu’une expérience marketing déployait une vidéo hero de 5 Mo, vous comprenez déjà la prémisse : la fiabilité est une fonctionnalité, et une landing fait partie du système. Elle participe à vos SLOs que quelqu’un l’admette en réunion de planification ou non.
Opinion tranchée : le HTML/CSS pur est un comportement par défaut, pas un artifice. Ajoutez du JavaScript seulement s’il apporte une valeur mesurable (conversion, accessibilité ou utilisabilité), et gardez-le optionnel.
Ce que « docs-style » signifie vraiment
Docs-style n’est pas que de la typographie. C’est un contrat d’information. Vous indiquez ce que le produit fait, comment il se comporte, combien il coûte et ce qu’il ne fait pas — sans forcer le lecteur à décoder des métaphores marketing.
Concrètement :
- La navigation est prévisible : une table des matières, des ancres et des titres stables.
- La tarification est explicite : ce qui est inclus, ce qui ne l’est pas, ce qui se passe en cas de dépassement.
- La FAQ est rédigée comme si le support avait déjà reçu le ticket.
- La performance est traitée comme une infrastructure budgétée, pas comme une ambiance.
Contraintes qui améliorent la page
Le HTML/CSS pur vous impose des contraintes qui vous épargnent vous-même. Pas de chaîne de build, pas de dérive de dépendances, pas de « quelqu’un a mis à jour le routeur et la landing a cassé ». Votre surface de risque diminue. L’histoire de déploiement devient : téléverser un fichier, définir les en-têtes de cache, vérifier.
La contrainte est aussi un outil de design. Quand vous ne pouvez pas vous reposer sur un composant framework pour tout, vous écrivez moins et vous choisissez plus soigneusement : moins de polices, moins de layouts, moins de breakpoints, moins de miracles.
Structure HTML qui évolue sans drame
Les pages d’atterrissage pourrissent quand elles grandissent. Quelqu’un ajoute une section, puis une barre latérale, puis un « CTA flottant », et soudain vos titres sont hors ordre et votre CSS ressemble à un site archéologique.
La solution n’est pas un framework. La solution, c’est la structure : HTML sémantique, noms de classes prévisibles et une mise en page qui se dégrade gracieusement.
Utilisez des repères sémantiques pour que votre page ait un manuel d’exploitation
Employez <header>, <nav>, <main>, <section> et <footer> comme il se doit. Une page docs-style doit être navigable sans souris et sans deviner où l’auteur a caché le contenu.
Les titres sont une API : ne les cassez pas
Gardez un seul <h1>. Utilisez <h2> pour les sections principales : Fonctionnalités, Tarifs, FAQ, et vos sections opérationnelles comme diagnostics et erreurs. À l’intérieur, <h3> sert les sous-thèmes. Cela compte pour l’accessibilité, le SEO et pour les humains qui parcourent la page à 1,7 seconde par paragraphe.
Faites de la TOC une vraie fonctionnalité, pas une décoration
Une table des matières avec liens d’ancrage fait trois choses : elle réduit le rebond car les gens peuvent sauter directement à la question, elle donne l’impression d’un document référencé, et elle fournit des cibles stables pour des liens internes depuis des emails, tickets et chats.
L’astuce est la stabilité. Ne basez pas les ancres sur du contenu qui change chaque semaine. Utilisez des ids qui survivent aux révisions. Si vous devez renommer un titre, gardez les ids stables à moins d’être prêt à supporter les liens anciens.
FAQ en pur CSS : utilisez details/summary intentionnellement
L’élément details est le héros méconnu de l’interactivité « sans JS ». Il est accessible au clavier et fonctionne sans script. Stylisez-le légèrement. Ne le transformez pas en imitation fragile d’un accordéon JavaScript.
Deux règles qui évitent 80% des bugs de layout
- Définissez les dimensions des images (ou leur ratio) pour éviter les sauts de mise en page. Le CLS est une taxe SEO et une taxe de confiance utilisateur.
- Utilisez des conteneurs
max-width. Le full-bleed convient aux arrière-plans. Le texte a besoin d’une mesure lisible, pas d’une piste d’atterrissage.
Une petite plaisanterie, parce qu’on l’a méritée : le CSS est facile jusqu’à ce qu’il ne le soit plus, et là il devient un débat religieux avec de pires outils.
Section fonctionnalités qui répond aux véritables objections
Les fonctionnalités ne sont pas une liste de courses. Ce sont des réfutations d’objections. Sur une page docs-style, chaque fonctionnalité doit expliquer : ce qu’elle fait, ce qu’elle remplace, et quel mode de défaillance elle évite. Si elle ne change pas une décision, c’est de la décoration.
Livraison statique prioritaire avec cache agressif. Le HTML peut être à courte durée ; les assets peuvent être à longue durée et immuables.
Traduction : chargements globaux plus rapides et moins d’incidents « pourquoi la landing est-elle down ? ».
HTML sémantique qui fonctionne avec clavier et lecteurs d’écran sans rustines ARIA.
La navigation docs-style est une fonctionnalité d’utilisabilité, pas du théâtre de conformité.
Faible surface de dépendances. Pas de pipeline de build requis. Livrez-le comme de la configuration.
Moins d’outils signifie moins de surprises de chaîne d’approvisionnement et moins d’environnements locaux cassés.
Parité titre et description, titres cohérents et ancres stables.
Les moteurs de recherche préfèrent les pages qui se comportent comme des documents bien organisés. Les humains aussi.
Allégations véridiques avec limites énoncées. Vous évitez les conversations coûteuses du type « mais vous n’avez pas dit… ».
La tarification et la FAQ deviennent une déviation du support, ce qui veut poliment dire « moins de chaos ».
Livraison diagnostiquable : politique de cache claire, chemins d’assets explicites, points d’observabilité clairs.
Quand quelque chose casse, on trouve la cause en minutes, pas en légendes urbaines.
Textes de fonctionnalités qui ne vieillissent pas mal
Évitez les affirmations datées comme « le plus rapide du marché » à moins d’être prêt à le prouver chaque semaine. Préférez des affirmations que vous pouvez tenir par process : « static-first », « sans JavaScript requis », « repères accessibles », « cache prévisible ».
C’est là qu’un état d’esprit ops aide le marketing. Les promesses deviennent des contraintes. Les contraintes deviennent fiabilité.
Tarifs qui évitent les tickets support
La tarification est opérationnelle. Si elle est vague, vous la payerez en appels pré-ventes, remboursements, emails furieux et ingénieurs entraînés dans des « petites questions ». Une section tarification docs-style doit se lire comme un extrait de contrat : ce que vous obtenez, ce qui n’est pas inclus, et ce qui se passe aux limites.
Starter
$0
Pour prototypes internes et pages personnelles.
- Layout mono-page
- TOC basique + ancres
- FAQ avec
details/summary - Pas de polices personnalisées (utiliser les polices système)
Team
$29/mo
Pour pages produit qui doivent tenir la charge.
- Hero + grille de fonctionnalités + tarification + FAQ
- Checklist budget performance
- Conseils cache et CDN
- Patrons de navigation accessibles
Enterprise
$Custom
Pour organisations sensibles à la conformité et achats fastidieux.
- Relecture de contenu pour légal + accessibilité
- Patterns de déploiement multi-région
- Diagnostics prêts pour incidents
- Modèles de contrôle de changement
Règles de conception des tarifs à adopter
| Règle | Ce que cela empêche | Comment l’écrire |
|---|---|---|
| Indiquer les limites explicitement | Surcharges surprises et escalades « ce n’est pas ce qu’on pensait » | Utilisez des nombres et des valeurs par défaut : nombre de pages, taille de build, attentes de réponse support |
| Rendre le plan du milieu réel | Des entonnoirs uniquement Enterprise qui font perdre du temps | Mettez le plan utile au centre ; donnez-lui assez de détails pour le choisir |
| Clarifier ce qui est exclu | Des exigences cachées qui deviennent du scope creep | Listez les éléments « non inclus » : analytics personnalisés, A/B testing, design sur-mesure |
| Utiliser une terminologie stable | Tickets support causés par des changements de nommage | Ne renommez pas « Team » chaque trimestre ; la stabilité construit la confiance |
Deuxième petite blague (et c’est le quota) : « Illimité » signifie généralement « réunions illimitées », et vous serez facturé en attention.
FAQ qui réduit le bruit commercial
Votre FAQ n’est pas un dump de questions aléatoires. C’est un bouclier. Elle bloque les conversations prévisibles « et sinon… » avant qu’elles ne deviennent des invitations de calendrier. Gardez les réponses concises, testables et rédigées comme si vous aviez déjà rencontré le client.
Une page d’atterrissage peut-elle vraiment être « docs-style » et convertir ?
Oui, si le lecteur est technique ou pressé. Une structure claire réduit la charge cognitive. Les gens cliquent quand ils font confiance à la page. La confiance se bâtit par des affirmations spécifiques et une navigation prévisible.
Ai-je besoin de JavaScript pour un accordéon FAQ ?
Non. Utilisez details/summary. C’est interactif, accessible et fonctionne dans les navigateurs modernes. Si vous avez besoin d’analytics pour ouverture/fermeture, ajoutez du JS plus tard et conservez la base fonctionnelle.
Comment éviter le layout shift (CLS) sans framework ?
Définissez width/height sur les images, réservez de l’espace pour les médias et évitez les polices chargées tardivement. Utilisez font-display: swap quand vous chargez des polices, et préférez les polices système quand c’est possible.
Quelle est la stratégie de déploiement la plus simple ?
Servez des fichiers statiques via Nginx (ou un CDN). Cachez les assets immuables longtemps. Cachez le HTML peu de temps. Utilisez des déploiements atomiques pour ne jamais servir un HTML qui référence des assets manquants.
Comment garder les liens d’ancre stables si les titres changent ?
Gardez l’id stable même si le texte visible du titre change. Traitez les ancres comme des endpoints d’API : la compatibilité ascendante compte car des liens externes existeront.
Quelle est la bonne stratégie de polices ?
Commencez par les polices système. Ajoutez une police personnalisée seulement si elle améliore matériellement la perception de la marque. Si vous en ajoutez, hébergez-la vous-même, sous-ensemblez-la et préchargez-la de manière responsable.
Comment rédiger les tarifs pour que le support ne me déteste pas ?
Définissez les limites, indiquez ce qui se passe en cas de dépassement et listez les exclusions. Si le « fair use » porte toute la charge, réécrivez-le jusqu’à ce qu’il ne le fasse plus.
Le HTML/CSS pur est-il bon pour le SEO ?
Souvent excellent. Le contenu est immédiatement présent, les titres sont propres et le rendu est rapide. Les problèmes SEO viennent généralement de métadonnées manquantes, de titres dupliqués ou d’hypothèses canoniques cassées.
Comment garantir que la page reste rapide à mesure qu’elle évolue ?
Définissez un budget de performance (octets, requêtes et plus grand élément de contenu). Examinez les changements comme vous examinez l’infrastructure : mesurez avant/après et reculez si nécessaire.
Faits et histoire : pourquoi « juste HTML/CSS » gagne encore
Un peu de contexte vous aide à défendre la simplicité dans des pièces qui aiment la complexité. Voici des faits concrets qui comptent lorsque vous choisissez le HTML/CSS pur pour une landing.
details/summary existe pour fournir des widgets de divulgation natifs. C’est une manière native de révéler du contenu progressivement sans script.« L’espoir n’est pas une stratégie. » — General Gordon R. Sullivan
Cette phrase devrait trôner près de votre demande « ajoutons un troisième script analytics ». Si vous ne pouvez pas expliquer le mode de défaillance et le plan de rollback, vous n’envoyez pas une fonctionnalité ; vous envoyez une surprise.
Tâches opératoires pratiques : commandes, sorties, décisions
C’est la partie que la plupart des pages d’atterrissage n’incluent pas : comment exécuter la chose comme si ça avait de l’importance. Ci‑dessous des tâches pratiques sur un hôte Linux servant votre HTML statique, avec commandes, sorties réalistes et la décision à prendre en fonction d’elles.
Supposez que Nginx serve /var/www/landing, et que vous déployiez sur un hôte nommé server. Adaptez les chemins et noms à votre environnement, mais conservez la logique décisionnelle.
Tâche 1 : Valider que le HTML est effectivement servi
cr0x@server:~$ curl -I http://127.0.0.1/
HTTP/1.1 200 OK
Server: nginx/1.24.0
Content-Type: text/html
Content-Length: 48231
Last-Modified: Mon, 29 Dec 2025 10:15:44 GMT
ETag: "67713d10-bc67"
Accept-Ranges: bytes
Ce que cela signifie : Vous obtenez un 200 et le contenu est du HTML. ETag et Last-Modified existent, donc les requêtes conditionnelles peuvent fonctionner.
Décision : Si ce n’est pas 200, corrigez le routage/virtual host avant de chasser des fantômes de performance. Si Content-Type est incorrect, votre config serveur ou vos fichiers sont erronés.
Tâche 2 : Vérifier les en-têtes de cache pour le HTML (cache court par conception)
cr0x@server:~$ curl -I http://127.0.0.1/ | grep -i cache-control
Cache-Control: public, max-age=60
Ce que cela signifie : Le HTML est mis en cache 60 secondes. C’est un compromis courant : évite les thrashs et permet aux mises à jour d’apparaître rapidement.
Décision : Si le HTML est mis en cache pendant des heures, vous déploierez les correctifs lentement et confondrez les utilisateurs. S’il n’est pas du tout mis en cache, votre origine travaillera plus que nécessaire.
Tâche 3 : Vérifier les en-têtes de cache pour les assets immuables (longue durée)
cr0x@server:~$ curl -I http://127.0.0.1/assets/app.3f2c1a9e.css | egrep -i 'cache-control|content-type'
Content-Type: text/css
Cache-Control: public, max-age=31536000, immutable
Ce que cela signifie : Le CSS est mis en cache pour un an et marqué immutable, ce qui est correct seulement si le nom de fichier contient un hash de contenu.
Décision : Si vous n’avez pas de fichiers hashés, n’utilisez pas immutable. Vous vous créerez des tickets « pourquoi le style ne se met-il pas à jour ? ».
Tâche 4 : Confirmer que gzip/brotli est efficace (les octets comptent)
cr0x@server:~$ curl -I -H 'Accept-Encoding: gzip' http://127.0.0.1/ | egrep -i 'content-encoding|content-length'
Content-Encoding: gzip
Content-Length: 8421
Ce que cela signifie : Le HTML est compressé. Transfert plus petit, rendu initial plus rapide sur réseaux lents.
Décision : Si la compression manque, activez-la pour les types texte. Si elle est active mais que Content-Length reste énorme, vérifiez les contenus déjà compressés ou une mauvaise configuration.
Tâche 5 : Vérifier que vous ne servez pas des 404 accidentels (chemins d’assets cassés)
cr0x@server:~$ tail -n 20 /var/log/nginx/access.log
127.0.0.1 - - [29/Dec/2025:10:27:05 +0000] "GET /assets/app.3f2c1a9e.css HTTP/1.1" 200 21844 "-" "curl/8.5.0"
127.0.0.1 - - [29/Dec/2025:10:27:06 +0000] "GET /assets/hero.webp HTTP/1.1" 200 148920 "-" "curl/8.5.0"
127.0.0.1 - - [29/Dec/2025:10:27:07 +0000] "GET /assets/font.woff2 HTTP/1.1" 404 153 "-" "curl/8.5.0"
Ce que cela signifie : Un fichier de police manquant est demandé. Cela peut causer FOIT/FOUT, des sauts de mise en page et un rendu inesthétique.
Décision : Corrigez le chemin ou enlevez la référence. N’ignorez pas les 404 « parce que la page fonctionne en grande partie ». Les 404 sont aussi des problèmes de performance.
Tâche 6 : Repérer les requêtes lentes à l’origine (timing Nginx)
cr0x@server:~$ awk '{print $NF}' /var/log/nginx/access.log | tail -n 5
0.001
0.002
0.001
0.089
0.001
Ce que cela signifie : Une requête a pris 89 ms côté Nginx. Si c’est fréquent, vous avez une lenteur IO, CPU ou upstream.
Décision : Si le contenu statique est lent localement, vérifiez la latence disque, le système de fichiers et si vous proxiez accidentellement du contenu dynamique.
Tâche 7 : Confirmer que votre config Nginx est celle que vous pensez
cr0x@server:~$ nginx -T 2>/dev/null | sed -n '1,40p'
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
# configuration file /etc/nginx/nginx.conf:
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
Ce que cela signifie : La configuration chargée est valide et vous voyez la config réellement en cours d’exécution.
Décision : Si vous ne pouvez pas reproduire un comportement d’en-tête ou de routage, commencez ici. Beaucoup de problèmes « mystères » viennent d’un « mauvais fichier édité ».
Tâche 8 : Vérifier TLS et validité du certificat (n’attendez pas l’alerte)
cr0x@server:~$ echo | openssl s_client -servername example.com -connect example.com:443 2>/dev/null | openssl x509 -noout -dates
notBefore=Dec 10 00:00:00 2025 GMT
notAfter=Mar 10 23:59:59 2026 GMT
Ce que cela signifie : Les dates du certificat sont visibles. Si vous êtes proche de notAfter, vous êtes sur le point d’avoir une panne très publique.
Décision : Renouvelez tôt, automatisez les renouvellements et surveillez les expirations. Les pannes de certif sont les plus évitables, d’où leur embarras.
Tâche 9 : Vérifier le temps de résolution DNS (latence avant la connexion)
cr0x@server:~$ dig example.com +stats | egrep 'Query time|SERVER'
;; Query time: 42 msec
;; SERVER: 127.0.0.53#53(127.0.0.53) (UDP)
Ce que cela signifie : La requête DNS a pris 42 ms localement. Pour les utilisateurs finaux, le DNS peut être pire. Un DNS lent augmente la lenteur perçue.
Décision : Si le DNS est lent, investiguez les resolvers, le caching et la santé des enregistrements. Ne blâmez pas le CSS pour des problèmes DNS.
Tâche 10 : Inspecter les tailles d’assets sur le disque (faire respecter le budget)
cr0x@server:~$ du -h /var/www/landing/assets | sort -h | tail -n 8
56K /var/www/landing/assets/app.3f2c1a9e.css
148K /var/www/landing/assets/hero.webp
320K /var/www/landing/assets/logo.svg
1.2M /var/www/landing/assets/screenshot.png
Ce que cela signifie : Une capture d’écran PNG fait 1,2 Mo. C’est un candidat à convertir en WebP/AVIF et à redimensionner.
Décision : Fixez un budget de taille par asset et appliquez-le en revue. Si une image dépasse quelques centaines de Ko, elle doit le justifier.
Tâche 11 : Confirmer que vos références HTML sont correctes (pas de hashes manquants)
cr0x@server:~$ grep -nE 'assets/.*\.(css|js|png|webp|woff2)' /var/www/landing/index.html | head
34: <link rel="stylesheet" href="/assets/app.3f2c1a9e.css">
66: <img src="/assets/hero.webp" width="1200" height="700" alt="...">
Ce que cela signifie : Votre page référence des assets hashés et les images ont des dimensions explicites. Bien.
Décision : Si les assets ne sont pas hashés mais longuement mis en cache, corrigez le pipeline. Si les images manquent de dimensions, ajoutez-les pour réduire le CLS.
Tâche 12 : Vérifier les limites de fichiers ouverts et la santé des workers (l’OS compte toujours)
cr0x@server:~$ cat /proc/$(pgrep -n nginx)/limits | egrep 'Max open files|Max processes'
Max open files 1024 1024 files
Max processes 62967 62967 processes
Ce que cela signifie : Nginx ne peut ouvrir que 1024 fichiers par processus worker. Sous charge, cela peut causer des erreurs ou de la latence.
Décision : Si vous attendez une forte concurrence, augmentez les limites via des overrides systemd et la config Nginx. Les pages statiques peuvent tout de même subir un DoS par popularité.
Tâche 13 : Valider que votre CDN (ou reverse proxy) met bien en cache
cr0x@server:~$ curl -I https://example.com/ | egrep -i 'age|via|x-cache|cache-control'
cache-control: public, max-age=60
via: 1.1 varnish
age: 38
x-cache: HIT
Ce que cela signifie : La réponse est servie depuis le cache (HIT) et a un Age de 38 secondes.
Décision : Si vous voyez toujours MISS, vous payez pour un CDN que vous n’utilisez pas. Corrigez les clés de cache, les cookies ou les en-têtes empêchant le cache.
Tâche 14 : Détecter l’efficacité de la compression sur les assets (ne compressez pas l’incompressible)
cr0x@server:~$ curl -I -H 'Accept-Encoding: gzip' http://127.0.0.1/assets/hero.webp | egrep -i 'content-encoding|content-type'
Content-Type: image/webp
Ce que cela signifie : Aucun Content-Encoding, ce qui est correct. WebP est déjà compressé ; gzipping gaspille du CPU pour peu de gain.
Décision : Compressez le texte ; ne gaspillez pas de cycles sur des images déjà compressées.
Tâche 15 : Confirmer le niveau de logs et la visibilité des erreurs (ne volez pas à l’aveugle)
cr0x@server:~$ tail -n 20 /var/log/nginx/error.log
2025/12/29 10:27:07 [error] 1402#1402: *91 open() "/var/www/landing/assets/font.woff2" failed (2: No such file or directory), client: 127.0.0.1, server: _, request: "GET /assets/font.woff2 HTTP/1.1", host: "127.0.0.1"
Ce que cela signifie : Preuve claire de ce qui manque et où Nginx l’a cherché.
Décision : Corrigez le chemin du fichier et redéployez. Ajoutez aussi une vérification de déploiement qui échoue si les assets référencés n’existent pas.
Playbook de diagnostic rapide
Si la landing est lente ou cassée, vous ne voulez pas d’une séance de brainstorming. Vous voulez une séquence qui trouve rapidement le goulot. Ce playbook est ordonné pour éliminer rapidement des classes entières de problèmes.
Première étape : confirmer ce que « lent » signifie et où
- Est-ce global ou local ? Testez depuis le serveur lui‑même (
curlvers localhost) et depuis un réseau client. - Est-ce le premier octet ou le rendu ? Si le TTFB est élevé, regardez l’origine/proxy. Si le TTFB est correct mais la page « paraît » lente, inspectez la charge utile et le rendu (images, polices).
- Est-ce constant ou en pics ? Les pics impliquent contention de ressources, limitation de débit ou churn de cache.
Deuxième étape : exclure les erreurs de cache et de routage
- Vérifiez les 404 dans les logs access/error. Les assets cassés ressemblent à des lenteurs à cause des retries et comportements de fallback.
- Inspectez
Cache-Controlet si le CDN retourne des HITs. - Vérifiez que vous servez la bonne build (pas de versions mélangées entre hôtes).
Troisième étape : cherchez les coupables classiques de performance
- Images : le plus gros asset domine. Redimensionnez, convertissez et chargez paresseusement sous le pli si approprié.
- Polices : des polices chargées tard peuvent bloquer le rendu du texte ou provoquer des shifts. Privilégiez les polices système ou sous‑ensemblez correctement les WOFF2.
- Trop de requêtes : chaque requête coûte en latence. Inlinez le petit CSS critique, mais n’inlinez pas tout au point d’alourdir le HTML.
Quatrième étape : vérifiez que l’OS et le disque ne sont pas des goulots cachés
- Si Nginx est lent à servir des fichiers locaux, vérifiez la latence disque, les limites de fichiers et la saturation CPU.
- Si les handshakes TLS sont lents, vérifiez la chaîne de certificats, le CPU et si HTTP/2 est activé.
Position opérationnelle : traitez votre landing comme un mini-service. Donnez‑lui des budgets, des logs et un plan de rollback. C’est moins coûteux que d’expliquer des pannes aux dirigeants.
Erreurs courantes : symptômes → cause racine → correctif
La plupart des défaillances de landing ne sont pas mystérieuses. Ce sont des motifs récurrents avec des symptômes spécifiques. Voici ceux que je vois souvent quand des équipes expédient du « contenu statique simple » puis le rendent accidentellement complexe.
| Symptôme | Cause racine | Fix (spécifique) |
|---|---|---|
| La page « se met à jour » mais certains utilisateurs voient encore d’anciens styles | Le CSS est mis en cache longuement mais le nom de fichier n’est pas hashé | Utilisez des noms de fichiers hashés pour les assets et Cache-Control: immutable. Ou raccourcissez le cache si vous ne pouvez pas hasher. |
| Le layout saute après le chargement (CLS) | Images sans width/height ; polices chargées tard ; bannières injectées | Définissez les dimensions des images ; réservez l’espace pour les bannières ; privilégiez les polices système ou preload/subset WOFF2. |
| Chargement initial lent sur mobile | Média hero trop lourd ; trop de variantes de polices ; HTML/CSS non compressés | Compressez le texte ; réduisez les variantes de polices ; convertissez les images en WebP/AVIF ; limitez les octets du hero. |
| Le CDN ne met jamais en cache (toujours MISS) | Les cookies varient la clé de cache ; en-têtes empêchent le cache ; HTML marqué privé | Supprimez les cookies pour les chemins statiques ; définissez un Cache-Control explicite ; confirmez les en-têtes au edge. |
| Les liens d’ancre cassent après une réécriture | IDs dérivés des titres et régénérés ; ids renommés sans précaution | Gardez des IDs stables ; ajoutez des redirections si vous devez changer ; traitez les ancres comme une API publique. |
| Titres/descriptions SEO incorrects dans les aperçus | Le <title> diffère du H1 ; meta description manquante ou trop longue |
Alignez le H1 avec l’intention ; gardez la description entre 140 et 160 caractères et stable entre déploiements. |
| Les utilisateurs signalent du contenu « blanc » brièvement | Chargement de police bloque le texte (FOIT), defaults agressifs de font-display | Utilisez font-display: swap ; préchargez uniquement les polices essentielles ; envisagez de supprimer les polices custom. |
| 404s intermittents après déploiement | Déploiement non atomique : le HTML référence des assets nouveaux avant qu’ils ne soient présents sur tous les nœuds | Déployez d’abord les assets, puis le HTML ; ou utilisez des répertoires de release atomiques et un swap de symlink. |
| Le scanner de sécurité signale du « mixed content » | Liens assets en dur en http ou inclusions tierces | Utilisez https partout ; hébergez les assets critiques ; envisagez une CSP pour faire respecter. |
Trois mini-histoires d’entreprise issues du terrain
Ces cas sont anonymisés, plausibles et douloureusement familiers. Chacun a une leçon que vous pouvez appliquer à votre propre landing HTML/CSS pure avant que la pager ne vous l’applique.
Mini-histoire 1 : L’incident causé par une mauvaise hypothèse
Une entreprise SaaS de taille moyenne a déployé une nouvelle landing pour un lancement produit. Elle était « statique », hébergée derrière un CDN, et tout le monde a supposé que cela la rendait pratiquement incassable. L’équipe a fait le classique : un hero, une grille de fonctionnalités et un tableau de tarifs. Ils ont aussi ajouté une police personnalisée hébergée par un tiers pour des raisons de « branding ».
Le matin du lancement, le trafic est arrivé. La page a chargé lentement pour une partie des utilisateurs, et une plus petite fraction a vu la typographie cassée et des sauts de mise en page. Le tunnel de conversion ressemblait à quelqu’un qui avait coupé la prise au milieu du parcours. Le marketing a accusé le CDN. L’ingénierie a accusé « les mobiles ». Le support a accusé tout le monde.
La mauvaise hypothèse était subtile : ils pensaient que le CDN cacherait le HTML de manière consistante. Mais l’origine posait un cookie pour un A/B test sur le chemin racine. Le CDN a respecté ce cookie et a varié la clé de cache, désactivant de fait le caching du HTML. Désormais chaque requête allait à l’origine, et l’origine devait récupérer une police distante sur la première requête pour chauffer les connexions.
À mesure que la charge augmentait, la latence de l’origine a grimpé. Le CDN a cessé d’être un accélérateur et est devenu un simple forwarder. La première métrique évidente fut l’augmentation du TTFB. La seconde fut des logs d’erreur remplis de timeouts lors de la récupération de la police tierce, car les dépendances externes ne s’échelonnent pas selon votre calendrier de lancement.
La correction fut ennuyeuse : arrêter de définir des cookies sur le chemin statique et héberger la police soi‑même. Une fois que le HTML a été rendu cacheable à nouveau et que le saut tiers a disparu, le TTFB s’est stabilisé et le layout a cessé de bouger. La page n’est pas devenue « fancy ». Elle est devenue fiable. C’est ce dont l’entreprise avait besoin.
Mini-histoire 2 : L’optimisation qui s’est retournée contre eux
Une autre organisation, plus grande et « mature en process », a décidé d’optimiser sa landing en inlineant tout le CSS dans le HTML. L’argument semblait raisonnable : réduire les requêtes, accélérer le rendu initial. Quelqu’un a mesuré une petite amélioration en local et a proclamé victoire. Ils ont déployé en production.
Deux semaines plus tard, un designer a ajusté le style des boutons. Un simple changement est devenu un incident de déploiement : les caches se sont comportés de façon imprévisible, et les utilisateurs voyaient un mélange d’anciens et de nouveaux styles selon le nœud edge contacté. Parce que le CSS était inliné, on ne pouvait pas le mettre en cache séparément avec un TTL long. Chaque modification HTML invalidait tout. Le taux de HIT du CDN a chuté dès que quelqu’un éditait une virgule.
Pire, les réponses HTML ont gonflé. Le TTFB restait correct, mais le temps de téléchargement augmentait sur les réseaux lents parce que chaque requête portait tout le CSS. L’« optimisation » a rendu la page plus sensible au churn de contenu. Dès que le marketing a commencé à expérimenter, la performance est devenue inconsistante.
Ils ont fini par adopter un compromis sensé : un petit CSS critique inline (juste pour l’above-the-fold) et un fichier CSS externe hashé pour le reste. Maintenant le CDN peut mettre les assets en cache agressivement, tandis que le HTML reste un objet court‑vérité. La landing est redevenue plus rapide et plus simple à modifier sans transformer le caching en roulette.
Leçon : toutes les réductions de requêtes ne sont pas des gains. La cacheabilité est une fonctionnalité de performance. Traitez votre CDN comme un allié, pas comme un tuyau bête.
Mini-histoire 3 : La pratique ennuyeuse mais correcte qui a sauvé la situation
Une fintech maintenait un ensemble de pages statiques : marketing, status et une vue produit style docs. Ils déployaient via un pattern de répertoire de release atomique : téléverser une nouvelle build dans un répertoire versionné, vérifier localement, puis basculer un symlink que Nginx sert.
Un vendredi après‑midi, une mise à jour de contenu incluait un renommage de répertoire d’assets. Le HTML référençait /assets/app.9c0a...css, mais le script de déploiement a par erreur téléversé les assets dans /static/ pour cette release. Si l’entreprise avait fait des téléversements non atomiques en place, la page aurait servi des références cassées de façon intermittente au fur et à mesure que les fichiers apparaissaient et disparaissaient pendant le déploiement.
Au contraire, le pattern atomique a empêché l’état partiel de jamais être en ligne. Leur étape de vérification — curl vers localhost et grep pour les 404 dans les logs access — a échoué avant le swap de symlink. La release n’est jamais passée en production. Aucun incident. Aucun rollback nocturne. Juste un ingénieur qui grogne, corrige le script et rentre chez lui.
C’est le genre de « correction ennuyeuse » qui est rarement célébrée et qui sauve fréquemment votre week-end. Restez ennuyeux. L’ennuyeux scale.
Checklists / plan étape par étape
Voici le plan que je confierais à une équipe qui veut une landing docs-style en HTML/CSS pur et souhaite qu’elle reste saine après mise en production. Suivez‑le dans l’ordre. N’« optimisez » pas avant d’avoir des données.
Étape 1 : Structure du contenu avant le style
- Rédigez le H1 comme la promesse que vous pouvez tenir.
- Rédigez un lead de 1–2 paragraphes qui nomme un vrai point de douleur.
- Créez une TOC avec des ancres stables.
- Rédigez les fonctionnalités comme des objections répondues, pas des adjectifs.
- Rédigez la tarification comme un extrait de contrat : inclusions, exclusions, limites.
- Rédigez la FAQ à partir de tickets réels et d’appels commerciaux.
Étape 2 : CSS qui se comporte lors des changements
- Utilisez un conteneur max-width et une longueur de ligne lisible.
- Utilisez
clamp()pour la typographie afin d’éviter la soupe de breakpoints. - Privilégiez grid/flex avec des breakpoints simples.
- Évitez les resets globaux qui surprennent les éléments de formulaire et les outils d’accessibilité.
- Gardez des noms de classes descriptifs ; évitez les imbrications trop « malignes » que le futur vous ne pourra pas déboguer.
Étape 3 : Politique d’assets (là où vit la performance)
- Décidez : polices système en priorité ; polices custom seulement avec justification écrite.
- Fixez un budget image par section ; appliquez-le en revue.
- Utilisez WebP/AVIF pour les grandes images ; gardez SVG pour logos/illustrations qui en bénéficient.
- Hash des noms de fichiers pour les assets cacheables.
Étape 4 : Déploiement qui évite l’état partiel
Déployez les pages statiques comme vous déployez des binaires : atomiquement, avec vérification. Un pattern propre : répertoires de release + swap de symlink.
cr0x@server:~$ sudo mkdir -p /var/www/landing/releases/2025-12-29_1015/assets
cr0x@server:~$ sudo rsync -a ./site/ /var/www/landing/releases/2025-12-29_1015/
cr0x@server:~$ sudo ln -sfn /var/www/landing/releases/2025-12-29_1015 /var/www/landing/current
cr0x@server:~$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
cr0x@server:~$ sudo systemctl reload nginx
Ce que l’output signifie : La config est valide ; le reload est sûr. Le swap de symlink est atomique, donc les utilisateurs ne verront jamais un état mi‑déployé.
Décision : Si nginx -t échoue, ne reload pas. Corrigez la config, puis retestez. Si vous ne pouvez pas expliquer les modes de défaillance de votre déploiement, vous déployez de l’espoir.
Étape 5 : Passerelles de vérification (simples mais strictes)
- Exécutez
curl -Iet vérifiez les en-têtes de cache. - Récupérez le HTML et grep pour les références d’assets attendues.
- Scannez les logs pour les 404 immédiatement après le déploiement.
- Vérifiez les dates d’expiration TLS si vous avez changé de domaine ou de certificat.
Étape 6 : Propriété opérationnelle
Attribuez un propriétaire pour le budget de performance de la page et le processus de déploiement. « Le marketing en est responsable » est la recette pour 12 trackers et une vidéo hero en autoplay. « L’ingénierie en est responsable » est la façon d’obtenir une page qui n’est jamais livrée. La bonne réponse est partagée : le marketing possède le contenu, l’ingénierie possède les contraintes de livraison.
Étapes suivantes
Si vous voulez une landing docs-style qui fonctionne en production, faites trois choses cette semaine :
- Geler la structure : sections sémantiques, ancres stables et une FAQ qui répond aux vraies questions.
- Fixer des budgets : tailles d’images, nombre de polices et règles de cache pour le HTML vs les assets.
- Rendre les déploiements atomiques : répertoires de release et swap de symlink, plus une vérification post-déploiement pour 404s et en-têtes.
Le HTML/CSS pur n’est pas de la nostalgie. C’est une décision pour expédier moins de risques. Vous pouvez toujours ajouter de la complexité plus tard. La retirer est la partie qui fait mal.