Statistieken over HTML- & CSS-fouten: we hebben de top 5.000 websites gevalideerd

Van de top 5.000 domeinen volgens Tranco konden we van 2.655 sites de homepagina lezen. We hebben voor elke pagina dezelfde validators gebruikt die deze site gratis aanbiedt en de resultaten geteld: 100.399 schendingen van de HTML-specificaties en 17.599 CSS-fouten, verdeeld over 220 verschillende categorieën (message families).

Gepubliceerd op 11 augustus 2026. Vrij om te citeren met een link.

Belangrijkste bevindingen

  • 90,5% van de sites heeft minstens één HTML-fout: Dit betreft 2.402 van de 2.655 sites. Het gaat hier niet om waarschuwingen, maar om schendingen van de vastgelegde standaard.
  • Slechts 2,6% is volledig foutloos: Slechts 69 sites vertoonden nul fouten en nul best-practice-waarschuwingen.
  • Mediaan van 12 fouten per site: Het gemiddelde ligt op 37,8 en de slechtste site had er 2.209. Een kleine groep sites is verantwoordelijk voor het grootste deel van de fouten.
  • 65,1% van de sites heeft een CSS-fout: Gemeten over 2.471 sites, inclusief alle gekoppelde stylesheets.
  • Mediaan van 1 CSS-fout per site: CSS-fouten treden anders op; de meeste sites hebben één foutieve declaratie in plaats van honderden. Het gemiddelde is 7,1.
  • 220 verschillende categorieën berichten: Hiervan zijn er 187 schendingen van de specificaties. De markup van het hele web faalt op een beperkt aantal manieren.

Wat de cijfers vertellen

Geldige HTML is de uitzondering, niet de regel. Negen van de tien meest bezochte websites op het web schenden de standaard op hun homepagina; slechts 2,6% is volledig schoon. Omdat browsers zeer goed zijn in foutherstel, is er voor websitebeheerders weinig urgentie om dit te repareren, waardoor fouten zich ophopen.

De distributie is sterk scheefgetrokken. De mediaan is 12 fouten, het gemiddelde 37,8 en de slechtste site heeft er 2.209. De meeste sites hebben een handvol fouten die een paar keer herhaald worden; een minderheid heeft één template-bug die in elk component op de pagina terugkomt. Bij een audit is het aantal unieke overtreden regels daarom veel belangrijker dan het totale aantal fouten. Daarom zijn onze scores berekend per regel en niet per voorkomst.

De grootste fouten zijn structureel, geen typefouten. De meest voorkomende bevinding is dat een <X> element niet is toegestaan als inhoud onder een <X> element (59,5% van de sites). Dit wordt zelden handmatig geschreven; het gebeurt wanneer componenten worden samengesteld door een framework dat niet weet in welk element het wordt geplaatst. Het is een nestingsprobleem dat ontstaat tijdens het build-proces, niet in een editor.

Fouten in toegankelijkheid zijn bijna universeel. Bevindingen van de Accessibility Checker (zoals kopniveaus, niet-gelabelde invoervelden en links zonder tekst) verschijnen op meer dan een derde van de sites. Met de Europese Toegankelijkheidswet die sinds juni 2025 van kracht is, is dit geen kwestie van stijlvoorkeur, maar van compliance.

CSS gaat meestal op één plek fout, niet overal. Hoewel 65,1% van de sites een CSS-fout heeft, is het mediane aantal slechts 1. De meest voorkomende fout is een ongeldige waarde voor een specifieke property. Een stylesheet met een defecte declaratie blijft renderen; de browser negeert de regel en gaat verder. Deze stilte is de reden waarom dergelijke fouten jarenlang in productie blijven bestaan.

De 25 meest voorkomende HTML-bevindingen

Gerangschikt op basis van het aantal unieke sites dat het bericht geeft, niet op het totale aantal voorkomsten.

RangBerichtSitesPercentage
1<style> element is not permitted as content under <div> (spec violation)1.58159,5%
2"type" attribute is unnecessary for javascript resources (best practice)1.45254,7%
3<button> is missing recommended "type" attribute (best practice)1.31649,6%
4Prefer to use the native <button> element (best practice)1.10741,7%
5<img> is missing required "src" attribute (spec violation)1.09341,2%
6Anchor link must have a text describing its purpose (best practice)1.00137,7%
7Landmarks must have a non-empty and unique accessible name (aria-label or aria-labelledby) (best practice)91834,6%
8Initial heading level must be <h1> but got <h2> (best practice)82331,0%
9<input> element does not have a <label> (best practice)79730,0%
10Attribute "target" has invalid value "" (spec violation)77829,3%
11Redundant role "link" on <a> (best practice)74828,2%
12Heading level can only increase by one, expected <h3> but got <h4> (best practice)66825,2%
13Duplicate ID "porb" (spec violation)62123,4%
14<button> must have accessible text (best practice)58922,2%
15Attribute "name" is deprecated on <a> element (spec violation)51219,3%
16<img> is missing required "alt" attribute (spec violation)50719,1%
17Class "][" duplicated (best practice)44716,8%
18Element references missing id "Browse" (spec violation)43216,3%
19"aria-label" cannot be used on this element (spec violation)42816,1%
20Prefer to use <button> instead of <input type="submit"> when adding buttons (best practice)40915,4%
21<form> element must have a submit button (best practice)35713,4%
22<a> element is not permitted as a descendant of <a> (spec violation)33912,8%
23title text cannot be longer than 70 characters (best practice)33312,5%
24Stray end tag </p> (spec violation)26810,1%
25Unclosed element <div> (spec violation)2298,6%

De 15 meest voorkomende CSS-bevindingen

Elke stylesheet die een pagina linkt is afzonderlijk gevalideerd.

RangBerichtSitesPercentage
1Invalid value for transition-delay property (spec violation)1.34150,5%
2Unknown property font-smoothing (spec violation)43616,4%
3Unknown at-rule @if (spec violation)1234,6%
4Unexpected end of input (spec violation)863,2%
5Invalid value for src descriptor (spec violation)712,7%
6Unexpected token Semicolon (spec violation)622,3%
7Unknown at-rule descriptor font-named-instance (spec violation)361,4%
8Invalid value for @media prelude (spec violation)301,1%
9Invalid empty selector (spec violation)220,8%
10Unexpected token Ident("padding-top") (spec violation)130,5%
11Unexpected token Delim('!') (spec violation)80,3%
12Unexpected token Delim('*') (spec violation)70,3%
13Invalid dangling combinator in selector (spec violation)70,3%
14Unexpected token AtKeyword("media") (spec violation)50,2%
15Pseudo-elements like '::before' or '::after' can't be followed by selectors like 'Delim('.')' (spec violation)40,2%

Hoe we dit hebben gemeten

We hebben de top 5.000 lijst van Tranco gebruikt—een onderzoeksranking die verschillende populariteitslijsten middelt om manipulatie tegen te gaan. In augustus 2026 hebben we via HTTPS de homepagina van elk domein opgevraagd.

Elke pagina is door dezelfde publieke endpoints gegaan als deze site voor haar gebruikers aanbiedt: HTML via html-validate (met standaard preset) en CSS via csstree-validator, waarbij lightningcss moderne syntax beoordeelt. Door de werkelijke API te gebruiken in plaats van alleen de engines, zijn alle filters voor foutpositieven toegepast. De getallen weerspiegelen dus wat een gebruiker van de tool daadwerkelijk ziet.

Ernst is geen kwestie van stijl. We tellen alleen zaken als "fout" als ze de geschreven HTML-standaard schenden. Meningen over wat goede code is, maar die nog steeds geldige HTML zijn (zoals inline styles of een ontbrekende type op een button), worden apart geteld als best practice en zo gelabeld in de tabellen. Veel gepubliceerde statistieken over "fouten" voegen deze twee samen, wat het totale aantal fouten vaak verdrievoudigt.

Berichten zijn gegroepeerd in families door variabele delen te maskeren; bijvoorbeeld: Unknown property colr en Unknown property bakground tellen als één probleem. De exacte bewoording in elke rij is de meest voorkomende variant.

Van de 5.000 domeinen produceerden er 2.345 geen meetresultaat en deze zijn uitgesloten van alle percentages op deze pagina. Een groot deel van de top van de lijst bestaat uit infrastructuur: CDN- en DNS-hostnames die nooit bedoeld waren om een pagina te serveren. De redenen hiervoor waren:

  • 1.479: URL kon niet worden bereikt (ongeldig of ontoegankelijk).
  • 433: Failed to fetch: Forbidden.
  • 248: Respons te groot (max NKB).
  • 81: Failed to fetch: Not Found.
  • 21: Geen HTML-inhoud geleverd.

Ook hebben we de test op onszelf uitgevoerd. Elke pagina van deze site, alle 102 stuks inclusief deze pagina, valideert met nul fouten en nul waarschuwingen tegen de bovenstaande engine. Het schrijven van deze studie was de aanleiding om dit te controleren; we vonden vier problemen die we vervolgens hebben opgelost. Het publiceren van een cijfer dat je niet op je eigen site hebt toegepast is geen onderzoek, maar marketing.

Wat deze studie niet kan vertellen

  • Alleen homepages: Er is slechts één pagina per domein gemeten, en dat is meestal de pagina die een bedrijf het meest polijst. Checkout-flows, dashboards en CMS-gegenereerde artikelpagina's zijn bijna zeker slechter; deze worden hier niet gemeten.
  • Alleen populaire sites: De Tranco top 5.000 bestaat uit grote teams en volwassen stacks. Het is geen representatieve steekproef van het gehele web, noch van de sites waar de meeste ontwikkelaars aan werken.
  • Alleen HTML en CSS: Geen JSON, XML of robots.txt. Dit zijn zaken die mensen handmatig in een validator plakken, niet zaken die een homepagina standaard uitzendt; een crawl kan ze dus niet zien.
  • Het oordeel van onze engines: Elke validator hanteert eigen beslissingen over wat er gerapporteerd moet worden. De onze zijn gedocumenteerd en bewust conservatief: we laten bevindingen weg waar we niet zeker van zijn in plaats van het aantal kunstmatig op te krikken. Een andere tool zou een andere ranking produceren.
  • Een momentopname: Gemeten op 11 augustus 2026. Sites veranderen, vandaar dat deze pagina de datum vermeldt.
  • Een open gat: 132 van de 220 families hebben nog geen handleiding voor oplossingen op deze site, waarvan <img> is missing required "src" attribute (bij 41,2% van de sites) de grootste is. We schrijven deze in de volgorde van deze ranking.

Elke gemeten fout met een oplossing

Percentage van de 2.655 geteste sites dat elke specifieke fout vertoonde.

HTML

  • 61,7% onjuiste nesting
  • 54,7% overbodige script type
  • 49,6% button mist type
  • 48,4% native element in plaats van role
  • 46,4% sprong in kopniveau (heading level skip)
  • 43,0% ontbrekend formulierlabel
  • 29,9% ongeldige attribuutwaarde
  • 28,2% overbodige aria role
  • 23,4% dubbel ID
  • 19,3% verouderd attribuut (deprecated)
  • 19,2% ontbrekend alt-attribuut
  • 16,0% niet gesloten tag
  • 9,7% ontbrekend lang-attribuut
  • 7,9% lege kop (heading)
  • 6,3% verouderd element (deprecated)
  • 2,3% ontbrekende titel
  • 2,2% ontbrekende doctype

CSS

  • 51,6% ongeldige property waarde
  • 16,4% onbekende property
  • 7,2% niet gesloten bracket
  • 6,0% media query syntax

Toegankelijkheid (Accessibility)

  • 46,4% overgeslagen kopniveau
  • 43,0% ontbrekende formulierlabels
  • 41,3% ontbrekend aria label
  • 37,7% lege linktekst
  • 22,2% lege button tekst
  • 20,6% ontbrekende alt tekst
  • 13,4% ontbrekende button type
  • 7,9% lege kop (heading)
  • 0,8% ontbrekende tabelkoppen

Deze studie citeren

Vrij om te citeren, in grafieken te verwerken of opnieuw te publiceren met een link terug. Voorgestelde bewoording:

ValidateHTML, “HTML & CSS Error Statistics: We Validated the Top 5,000 Websites” (2026). Validation of 2,655 home pages from the Tranco top 5,000. validatehtml.com/html-error-statistics