La validation W3C : parce que coder comme un sauvage, ça finit toujours mal.
La validation HTML, ce n'est pas pour faire joli dans un portfolio.
C'est aussi et surtout pour éviter qu'un site ressemble à une tour Jenga après trois bières. Et demie.
Valider son code ou assumer de coder comme en 1999 ?
C'est quoi ?
Le W3C (les gentils qui définissent les règles du web) a créé un validateur qui vérifie si le code respecte les standards. En gros, c'est le correcteur orthographique du HTML. Sauf que là, les fautes coûtent cher.
Pourquoi c'est indispensable
-
Compatibilité navigateurs.
Le code marche sur Chrome ? Cool. Maintenant sur Safari, Firefox, et ce vieux Edge que mamie refuse de mettre à jour. Spoiler : ça va piquer.
Les navigateurs sont tolérants et corrigent les bourdes à la volée, mais pas tous pareil. Un code invalide qui marche aujourd'hui peut exploser demain avec une mise à jour. C'est la roulette russe du dev web. -
Accessibilité (non, ce n'est pas optionnel).
Un HTML moisi = lecteurs d'écran perdus. Les personnes aveugles ou malvoyantes naviguent avec des outils qui se basent sur une structure HTML propre. Un<div>mal fermé et pouf, tout un bloc de contenu disparaît pour eux. Visuellement on y voit que du feu, mais techniquement c'est le chaos.
La validation W3C, c'est le strict minimum avant de parler d'accessibilité.
Pas de code valide ? Même pas la peine de tester ARIA. On ne pose pas la tapisserie avant le placo ! -
SEO (Google juge).
Google ne pénalise pas directement le code invalide. Mais un HTML cassé peut empêcher l'indexation correcte des contenus. En clair : bosser sur le référencement tout en sabotant avec une structure bancale. -
Maintenance (penser au futur soi).
-
Conformité légale.
L'European Accessibility Act (EAA) aussi. C'est non négociable.
Un code valide c'est :
- Moins de bugs mystérieux
- Des évolutions sans peur de tout casser
- Un successeur qui ne maudira pas (trop) son prédécesseur
Sans validation, la dette technique s'empile. Un jour ça pète, et ce jour-là, les regrets arrivent.
Les erreurs qui font mal
Les balises en vrac.
<p>
<div>Nan mais sérieux ?</div>
</p>
Version "flemme de fermer mes balises"
<ul>
<li>Item 1
<li>Item 2
</ul>
déjà vu aussi…
<a href="https://www.pouet.com">
[…]
<button>j'ose tout !</button>
[…]
</a>
Résultat : DOM imprévisible, CSS qui part en vrille, lecteurs d'écran en PLS.
Les IDs dupliqués (si si…), le classique du chef.
<!-- Non non non -->
<div id="main">...</div>
<section id="main">...</section>
Résultat : JavaScript pète, navigation clavier impossible, formulaires cassés. Bravo champion.
Les balises vintage. Le vintage est à la mode, mais ça coûte cher.
<!-- Bienvenue en 1998 -->
<center>Texte centré</center>
<font color="red">Texte rouge</font>
Résultat : ça marche (pour le moment), mais c'est moche, inaccessible et ça peut lâcher n'importe quand.
Comment faire ?
En développement : valider sans attendre
Bookmarklet pour valider la page courante
Parce qu'attendre la mise en production, c'est déjà trop tard, cette petite chose permet de vérifier son code à tout moment.
Et il s'agit bien du code "lu" par le navigateur, pas le code source brut. Tout ce qui s'affiche est testé.
javascript:(()=>{const c=document.documentElement.cloneNode(!0);['style','script','svg'].forEach(t=>c.querySelectorAll(t).forEach(e=>e.remove()));const f=document.createElement('form');f.method='POST';f.action='https://validator.w3.org/nu/';f.enctype='multipart/form-data';f.target='_blank';f.acceptCharset='utf-8';const i=document.createElement('input');i.type='hidden';i.name='showsource';i.value='yes';f.appendChild(i);const a=document.createElement('textarea');a.name='content';a.value='<!DOCTYPE html>\n'+c.outerHTML;f.appendChild(a);document.body.appendChild(f);f.submit();f.remove()})();
Copier le code et créer un raccourcis dans vos bookmarks, en le nommant comme vous voulez.
La flemme ? Faire glisser ce lien dans la barre de favoris du navigateur : Validation W3C.
Ensuite, il n'y a plus qu'à cliquer dessus. Ça prend une seconde, au pire.
Par défaut, cette version exclut les balises style, script et svg afin de limiter l'analyse aux éléments pertinents.
Pour exclure des éléments transverses, header, footer ou autre, il suffit d'ajouter ces éléments avec le bon sélecteur, au début du script.
C'est même pertinent pour se concentrer sur le coeur des pages.
Script JS pour afficher les erreurs en console
Pour les plus geeks, un petit script à insérer dans le DOM.
Ça interroge poliment l'API W3C et affiche les résultats directement dans les dev tools :
Taille brute : 3,20 kilo-octets (~1,32 kilo-octets gzip)
(() => {
'use strict';
/**
* Valide le HTML de la page courante via l'API W3C Nu HTML Checker
* et affiche les résultats dans la console
*
* Fonctionnement :
* - Clone le document pour ne pas affecter la page
* - Supprime style, script et svg du clone
* - Envoie le HTML nettoyé à l'API W3C
* - Affiche erreurs et avertissements dans la console
*
* @global
* @function validateHTML
* @returns {void}
*
* @example
* // Appel manuel depuis la console
* validateHTML();
*
* @throws {Error} Si CORS bloque la requête (solutions affichées en console)
*/
window.validateHTML = () => {
try {
/**
* Active/désactive l'affichage des avertissements
* @type {boolean}
*/
const enableWarning = false;
const clone = document.documentElement.cloneNode(true);
['style', 'script', 'svg'].forEach(tag =>
clone.querySelectorAll(tag).forEach(el => el.remove())
);
let doctype = '<!DOCTYPE html>';
if (document.doctype) {
doctype = `<!DOCTYPE ${document.doctype.name}>`;
}
const html = doctype + '\n' + clone.outerHTML;
fetch('https://validator.w3.org/nu/?out=json', {
method: 'POST',
headers: {'Content-Type': 'text/html; charset=utf-8'},
body: html
})
.then(response => response.json())
.then(result => {
const errors = result.messages.filter(m => m.type === 'error');
const warnings = result.messages.filter(m => m.type === 'info' && m.subType === 'warning');
console.group(`Validation W3C`);
if (enableWarning && warnings.length) {
console.groupCollapsed(`⚠️ Avertissement(s) ${warnings.length}`);
warnings.forEach(w => console.warn(`Ligne ${w.lastLine}: ${w.message}`));
console.groupEnd();
}
if (errors.length) {
console.groupCollapsed(`❌ Erreur(s) ${errors.length}`);
errors.forEach(err => console.error(`Ligne ${err.lastLine}: ${err.message}`));
console.groupEnd();
} else {
console.log('✅ Aucune erreur');
}
console.groupEnd();
})
.catch(e => {
console.group('⚠️ Validation W3C impossible');
console.warn('CORS bloqué. Solutions :');
console.log('1. Lancer Chrome avec --disable-web-security --user-data-dir=/tmp/chrome');
console.log('2. Utiliser une extension CORS (CORS Unblock)');
console.log('3. Utiliser le bookmarklet (demandez…)');
console.groupEnd();
});
} catch (error) {
console.group('⚠️ Validation W3C - Erreur');
console.error('Impossible de valider le HTML :', error.message);
console.groupEnd();
}
};
/**
* Optionnel : lance automatiquement la validation après le chargement complet de la page
* (DOM + ressources + scripts exécutés)
*/
/*
window.addEventListener('load', () => {
try {
validateHTML();
} catch (error) {
console.warn('Validation W3C non exécutée :', error.message);
}
});
*/
})();
Télécharger kortic-w3-api-validator.js
Ouvrir la console et .
En plus, c'est configurable. Lire la doc…
Ça permet de valider sans quitter l'onglet et d'avoir un retour immédiat pendant l'intégration.
Il faut demander à qui de droit de l'injecter sur tous les environnements avant la prod. Comme ça, tout le monde peut contempler la console, qui est ouverte bien entendu…
En pré-prod
Tests automatisés dans le pipeline CI/CD. Si ça passe pas la validation, ça ne se déploie pas. Ouais, c'est dur mais négociable…
En production
Monitoring pour détecter les régressions. Parce que oui, même les meilleurs se plantent.
Les limites (soyons honnêtes)
Un code 100% valide peut quand même être :
- Inaccessible (mauvaise sémantique, contrastes nuls)
- Moche comme un pot (l'UX c'est autre chose)
- Plein de bugs JS (la validation ne vérifie pas la logique)
La validation W3C est nécessaire, pas suffisante. C'est la base, pas l'arrivée.
Documentation et API W3C
Conclusion
Valider le code W3C, ce n'est pas être un perfectionniste relou. C'est être un professionnel qui respecte son métier. Et ses utilisateurs, au passage.
Un code valide = compatibilité assurée, accessibilité possible, maintenance vivable, conformité légale.
Ne pas valider, c'est construire sur du sable. Ça tient un moment, puis ça s'effondre.
Alors autant utiliser le validateur W3C maintenant. Les remerciements viendront plus tard.
That's all, Folks !