Das HTML-Grundgerüst
Zuletzt geprüft am von Daniel Weihmann

Jede HTML-Seite beginnt mit denselben paar Zeilen. Sie sind schnell abgetippt
und werden trotzdem gern falsch übernommen: ein fehlendes lang,
ein charset zu weit unten, ein Viewport-Tag mit
user-scalable=no. Diese Seite zeigt das Minimum, erklärt jede
Zeile und nennt danach die Angaben, die in echten Projekten fast immer
dazukommen.
Das Minimum
Kürzer geht ein valides HTML5-Dokument nicht. <html>,
<head> und <body> dürfen laut Spezifikation
sogar weggelassen werden, weil der Parser sie ergänzt – schreiben sollte man sie
trotzdem, sonst raten Editor, Linter und der nächste Mensch am Projekt.
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Titel der Seite</title>
</head>
<body>
<h1>Überschrift</h1>
<p>Text.</p>
</body>
</html>
Zeile für Zeile
- <!DOCTYPE html>
- Schaltet den Browser in den Standards-Modus. Ohne diese Zeile landet die Seite im Quirks-Modus und rechnet Boxmodell und Zeilenhöhen nach den Regeln der späten Neunziger. Der Doctype ist kein Tag, hat keinen schließenden Teil und muss die allererste Zeile sein – vor ihm darf nur ein Byte-Order-Mark stehen, kein Kommentar, keine Leerzeile mit Inhalt.
- <html lang="de">
-
Die Sprachangabe ist die billigste Barrierefreiheits-Maßnahme überhaupt.
Screenreader wählen danach die Aussprache; ohne
langliest eine englische Stimme deutschen Text vor. Auch Browser-Übersetzung und Silbentrennung perhyphens: autohängen daran. Für eine deutsche Seite reichtde, Regionalvarianten wiede-ATnur, wenn sie wirklich zutreffen. - <meta charset="utf-8">
-
Muss in den ersten 1024 Bytes des Dokuments stehen, deshalb gehört sie ganz
nach oben in den
<head>. Findet der Browser sie nicht rechtzeitig, rät er die Kodierung und liefert die bekannten „ä"-Buchstabensalate. Wichtig: Die Angabe beschreibt die Datei, sie ändert sie nicht. Der Editor muss die Datei tatsächlich als UTF-8 speichern. - <meta name="viewport" …>
-
Ohne diese Zeile tut ein Smartphone so, als sei es rund 980 Pixel breit, und
zoomt die fertige Seite herunter – Media Queries greifen dann ins Leere.
width=device-width, initial-scale=1ist der Standardwert und genügt. Was dort nicht hingehört:user-scalable=nooder einmaximum-scaleunter 5, weil beides das Zoomen verhindert und gegen WCAG 1.4.4 verstößt. - <title>
-
Die einzige Pflichtangabe im
<head>mit sichtbarem Text. Sie steht im Browser-Tab, im Lesezeichen, in der Suchergebnisliste und ist das Erste, was ein Screenreader beim Laden vorliest. Ein Dokument ohne<title>ist ungültig, ein leerer zählt genauso.
Was in der Praxis dazukommt
Pflicht ist nichts davon, aber in einem echten Projekt fehlt selten eine dieser
Zeilen. Die Reihenfolge im <head> ist dabei nicht beliebig:
charset zuerst, danach viewport und
title, dann alles, was Dateien nachlädt.
<link rel="canonical" href="https://example.de/seite/">
<meta name="description" content="Ein Satz, der die Seite beschreibt.">
<meta name="robots" content="index,follow">
<link rel="icon" href="/favicon.ico" sizes="any">
<link rel="stylesheet" href="/assets/css/style.css">
<meta property="og:title" content="Titel für geteilte Links">
<meta property="og:description" content="Beschreibung für geteilte Links">
<meta property="og:image" content="https://example.de/bild.jpg">
<meta property="og:url" content="https://example.de/seite/">
-
canonical nennt die eine gültige Adresse der Seite. Sinnvoll,
sobald derselbe Inhalt unter mehreren URLs erreichbar ist – mit und ohne
www, mit und ohne abschließenden Schrägstrich, mit angehängten Parametern. - description ist kein Rankingfaktor, wird von Suchmaschinen aber oft als Textauszug übernommen. Ohne sie schneidet die Suchmaschine selbst etwas aus dem Fließtext.
- og:image braucht eine absolute URL und sollte kein WebP sein – einige Dienste zeigen das Bild sonst nicht an. JPEG oder PNG, etwa 1200 × 630 Pixel.
-
stylesheet gehört in den
<head>, Skripte dagegen ans Ende des<body>oder in den Kopf mitdefer. Sonst wartet der Parser auf die Datei, bevor er weiterzeichnet.
Der Rumpf
Im <body> beginnt die eigentliche Auszeichnung. Die
Landmarken-Elemente kosten nichts und geben Screenreadern eine Gliederung, über
die sich springen lässt. Zum Ausprobieren fehlt dann nur noch Text, den liefert
ein Blindtext-Generator.
<body>
<a class="skip-link" href="#inhalt">Zum Inhalt springen</a>
<header>
<nav aria-label="Hauptnavigation">…</nav>
</header>
<main id="inhalt">
<h1>Genau eine H1 pro Seite</h1>
<article>…</article>
</main>
<aside>…</aside>
<footer>…</footer>
</body>
<main> darf pro Seite nur einmal sichtbar vorkommen und
enthält das, was diese Seite von jeder anderen unterscheidet – also weder
Kopfzeile noch Navigation noch Fußzeile. Gibt es mehrere
<nav>-Bereiche, bekommt jeder ein eigenes
aria-label, sonst heißen sie im Screenreader alle gleich
„Navigation".
Fehler, die immer wieder auftauchen
-
Doctype nicht in Zeile 1. Ein PHP-Block, ein
BOM-freies Leerzeichen oder eine Ausgabe vor dem Include reichen, und der
Browser fällt in den Quirks-Modus zurück. Prüfen lässt sich das in den
Entwicklerwerkzeugen:
document.compatModemussCSS1Compatliefern, nichtBackCompat. -
Kein
langam<html>-Element. Fällt beim Ansehen nie auf und ist trotzdem einer der häufigsten Befunde in Barrierefreiheits-Prüfungen. -
Zwei H1 oder gar keine. Die Überschriftenebenen sind das
Inhaltsverzeichnis der Seite. Sie dürfen nicht springen: nach
h2kommth3, nichth4. -
Selbstschließende Schrägstriche aus XHTML-Zeiten.
<br />ist in HTML5 erlaubt, aber überflüssig; bei Elementen mit Inhalt wie<div />wird der Schrägstrich ignoriert und die Struktur bricht. - Attributwerte ohne Anführungszeichen. Funktioniert bei einzelnen Wörtern, geht aber sofort schief, sobald ein Leerzeichen im Wert steht – etwa bei zwei CSS-Klassen.
Gegenprobe: Der Nu Html Checker des W3C prüft eine URL oder eingefügten Quelltext in wenigen Sekunden und meldet genau die Punkte von oben. Er ersetzt keine Prüfung auf Barrierefreiheit, findet aber jeden Strukturfehler.
Passend dazu: die Tabelle der HTML-Sonderzeichen
für alles, was sich nicht direkt tippen lässt, die Übersicht der
semantischen Elemente für den Aufbau des Rumpfes und
die Seite zur Barrierefreiheit in HTML, die
bei lang, alt und Formular-Labels weiter ins Detail
geht.
