Semantische Elemente
Zuletzt geprüft am von Daniel Weihmann

Semantisches HTML heißt: Das Element sagt, was der Inhalt ist, nicht wie er
aussieht. Ein <nav> ist eine Navigation, auch wenn es
aussieht wie eine Zeile Text. Für den Browser macht das oft keinen sichtbaren
Unterschied, für alles andere schon – Screenreader bauen daraus eine
Sprungliste, Suchmaschinen erkennen den Hauptinhalt, Leseansichten wissen, was
sie behalten müssen.
Hier stehen die Elemente, die im Alltag tragen; die
vollständige Liste aller 139 HTML-Elemente
steht bei redirect301.de.
Die Elemente auf dieser Seite gibt es seit HTML5, sie sind also seit über
fünfzehn Jahren in jedem Browser. Trotzdem besteht ein großer Teil des Webs
weiterhin aus <div>-Verschachtelungen. Der Umstieg kostet
nichts: Wo <div class="header"> steht, kann
<header> stehen.
Das Grundraster
Vier Elemente bilden das Gerüst fast jeder Seite. Sie heißen Landmarken, weil Screenreader sie als Orientierungspunkte anbieten – man springt direkt zum Hauptinhalt, ohne die Navigation zu durchlaufen.
<body>
<header>
<a href="/">Logo</a>
<nav aria-label="Hauptnavigation">…</nav>
</header>
<main id="inhalt">
<h1>Worum es auf dieser Seite geht</h1>
<article>…</article>
</main>
<aside>
<h2>Verwandtes</h2>
</aside>
<footer>
<nav aria-label="Rechtliches">…</nav>
</footer>
</body>
Die Elemente im Einzelnen
- <header>
-
Der einleitende Bereich – meist Logo, Seitentitel und Hauptnavigation.
<header>darf mehrfach vorkommen: Auch ein einzelner Artikel kann einen eigenen Kopf mit Überschrift und Datum haben. Als Landmarke zählt aber nur der, der direkt im<body>steht. - <nav>
-
Ein Block wichtiger Navigationslinks. Nicht jede Ansammlung von Links ist
eine Navigation – die drei Links im Fließtext eines Absatzes gehören nicht
hinein. Gibt es mehrere, braucht jede ein
aria-label, sonst heißen sie im Screenreader alle „Navigation". - <main>
-
Der Inhalt, der diese Seite von jeder anderen unterscheidet. Alles, was auf
allen Seiten gleich ist – Kopfzeile, Navigation, Fußzeile – gehört nicht
hinein. Pro Seite darf nur ein sichtbares
<main>existieren, und es darf nicht in<article>,<aside>,<header>oder<footer>stecken. - <article>
- Ein in sich abgeschlossener Inhalt, der auch für sich allein Sinn ergibt. Die Probe: Ließe er sich als eigener Beitrag in einen Feed übernehmen? Ein Blogbeitrag, eine Produktkarte, ein einzelner Kommentar – ja. Der dritte Absatz eines Textes – nein.
- <section>
-
Ein thematischer Abschnitt innerhalb eines größeren Zusammenhangs.
Eine
<section>gehört immer mit einer Überschrift zusammen; ohne sie ist meistens ein<div>gemeint. Als reine Layout-Klammer ist sie falsch gewählt. - <aside>
- Inhalt, der nur mittelbar zum Haupttext gehört: Randnotizen, Hinweiskästen, eine Liste verwandter Beiträge, Werbung. Entscheidend ist nicht, dass etwas rechts steht, sondern dass es sich entfernen ließe, ohne dass der Haupttext unvollständig wird.
- <footer>
-
Abschließende Angaben zum umgebenden Bereich: Urheber, Rechtliches,
weiterführende Links. Wie
<header>auch mehrfach möglich, etwa als Fuß eines einzelnen Artikels mit Autor und Datum. - <figure> und <figcaption>
-
Für Inhalte, auf die im Text verwiesen wird und die sich verschieben ließen,
ohne dass der Text bricht: Abbildungen, Diagramme, Codebeispiele, Zitate. Die
<figcaption>ist die Bildunterschrift und ersetzt keinenalt-Text – sie steht für alle da, der Alternativtext nur für die, die das Bild nicht sehen. - <time>
-
Macht ein Datum maschinenlesbar:
<time datetime="2026-09-07">7. September 2026</time>. Das Attribut nimmt das ISO-Format, der sichtbare Text darf frei formuliert sein. Nützlich für Veröffentlichungsdaten, Öffnungszeiten und Dauern. - <address>
-
Kontaktangaben zum Autor des umgebenden Artikels oder der Seite – nicht für
beliebige Postanschriften im Text. Eine Lieferadresse in einem Absatz ist
kein
<address>. - <details> und <summary>
-
Ein Aufklappbereich ohne eine Zeile JavaScript.
<summary>ist die immer sichtbare Zeile, der Rest erscheint auf Klick. Tastatur- und Screenreader-Bedienung bringt der Browser mit. Für häufig gestellte Fragen oder lange Beispiele die einfachste brauchbare Lösung.
article oder section?
Das ist die Frage, an der die meisten hängen bleiben. Die kurze Antwort:
Ein <article> steht für sich, eine
<section> ist Teil von etwas. Ein Rezept auf einer
Rezeptseite ist ein Artikel. „Zutaten" und „Zubereitung" darin sind Abschnitte,
weil sie ohne das Rezept sinnlos wären.
So
<article>
<h2>Ofengemüse</h2>
<section>
<h3>Zutaten</h3>
</section>
<section>
<h3>Zubereitung</h3>
</section>
</article>
Nicht so
<section class="wrapper">
<section class="row">
<section class="col">
<h2>Ofengemüse</h2>
</section>
</section>
</section>
Rechts ist <section> als Layout-Baustein missbraucht. Für
reine Anordnung ist <div> das richtige Element: Es hat
bewusst keine Bedeutung und stört deshalb auch keine.
div ist nicht verboten
Das gerät gern in Vergessenheit. Semantisches HTML heißt nicht, jedes
<div> zu ersetzen, sondern das passende Element zu nehmen –
und wenn es keins gibt, ist <div> genau richtig. Ein
Grid-Container, ein Wrapper für einen Rahmen, eine Gruppe für ein Flex-Layout:
alles <div>. Falsch wird es erst, wenn ein
<div> die Arbeit eines Buttons, einer Überschrift oder einer
Liste übernimmt.
Dasselbe gilt für <span> im Fließtext. Es ist der neutrale
Behälter für Textteile, während <em> Betonung ausdrückt und
<strong> Wichtigkeit. Wer nur fett darstellen will, ohne dass
der Screenreader es hervorhebt, nimmt <span> mit CSS oder
<b>.
Überschriften gehören zur Semantik
Die Landmarken teilen die Seite grob ein, die Überschriften gliedern den
Inhalt. Beides zusammen ergibt die Struktur, über die sich eine Seite bedienen
lässt. Deshalb braucht jeder <section>-Block und jedes
<article> eine Überschrift, und die Ebenen dürfen nicht
springen. Mehr dazu steht auf der Seite zur
Barrierefreiheit in HTML, wo auch erklärt ist,
warum das für viele Nutzer der wichtigste Navigationsweg überhaupt ist.
Verbreiteter Irrtum: HTML5 hatte einmal einen
„Gliederungsalgorithmus" vorgesehen, nach dem jede
<section> die Überschriftenebene automatisch
verschachtelt – man hätte überall <h1> schreiben können.
Der Algorithmus wurde nie in einem Browser umgesetzt und ist inzwischen aus
der Spezifikation entfernt. Die Ebenen müssen von Hand stimmen.
Häufige Verwechslungen
-
<main>um die ganze Seite gelegt. Dann gehören Kopf- und Fußzeile zum Hauptinhalt, und der Sprunglink führt wieder an den Anfang. -
Jede Seitenspalte ein
<aside>. Die Entscheidung fällt am Inhalt, nicht an der Position. Eine Spalte mit dem Inhaltsverzeichnis der Seite ist eher eine Navigation. -
Mehrere
<nav>ohne Namen. Ohnearia-labelsind Haupt- und Fußnavigation im Screenreader nicht unterscheidbar. -
<article>für Layoutkarten. Eine Kachel, die nur Bild und Link enthält, ist kein eigenständiger Beitrag. -
Listen als Absätze. Aufzählungen gehören in
<ul>oder<ol>– der Screenreader kündigt dann „Liste mit sieben Einträgen" an, was beim Zuhören enorm hilft.
Ob die Struktur am Ende aufgeht, lässt sich ohne Zusatzwerkzeug prüfen: In den Entwicklerwerkzeugen von Firefox und Chrome zeigt die Barrierefreiheits-Ansicht den Baum aus Landmarken und Überschriften genau so, wie ein Screenreader ihn sieht. Was dort unbenannt oder verschachtelt aussieht, ist es auch.
