Semantisches HTML: Warum Struktur vor Design kommt
Viele Webseiten sehen gut aus – bis man in den Quellcode schaut. Verschachtelte <div>-Container, Framework-Klassen auf jedem Element, JavaScript, das die Darstellung steuert. Für den Browser kein Problem. Für Suchmaschinen, Screenreader und Maschinen ein Hindernis.
Das CMF geht einen anderen Weg: Jeder Blocktyp wird in das passende HTML-Element übersetzt, umgeben nur von einem schlichten Container. Kein CSS-Framework, keine Tricks.
Vom Block zum HTML-Element
Jeder der 9 Blocktypen hat ein festes HTML-Muster. Außen steht ein schlichter Container (<div> oder <section>), darin das eigentliche Element:
Text
heading
→ <h1> bis <h6>
Echte Überschriften, keine gestylten <div>s.
text
→ <p>, <strong>, <em>, <a> …
Gefiltertes HTML mit 17 erlaubten Tags.
list
→ <ul> / <ol> + <li>
Echte Listen, kein Pseudo-Markup.
Bild und Layout
image
→ <img>, mit Bildunterschrift in <figure> + <figcaption>
Das alt-Attribut steht immer im Markup, dazu loading und – wenn gesetzt – width/height.
columns
→ CSS-Grid (cols-2 bis cols-5)
Layout per CSS, nicht per JavaScript.
Interaktion
buttons
→ <a class="btn">
Links, die wie Buttons aussehen. Kein JavaScript für Navigation.
form
→ <form> mit <label> je Feld
Pflichtfelder gekennzeichnet, Fehlermeldungen per aria-describedby am Feld, Auswahlgruppen in <fieldset>.
Spezial
html
→ Direktausgabe
Für Tabellen, Embeds und Sonderfälle. Ungefiltert – hier bist du selbst für sauberes Markup verantwortlich.
blog_overview
→ <a>-Karten im Grid
Responsiv von fünf Spalten bis zu einer.
Was das CMF bewusst vermeidet
Kein …
- Kein CSS-Framework (kein Bootstrap, kein Tailwind)
- Kein JavaScript, das Inhalte erst sichtbar macht
- Keine data-Attribute für Styling
- Keine verschachtelte Klassen-Hierarchie
- Keine leeren Spacer-Elemente
- Keine Inline-Styles aus Text-Blöcken – im html-Block entscheidest du selbst
- Keine externen CDN-Einbindungen
Stattdessen …
- CSS-Variablen für Farben, Abstände, Schriften
- base.css für Grundlayout, Navigation und Umbrüche
- theme.css, automatisch aus den Theme-Werten erzeugt
- custom.css für eigene Klassen
- Schriften vom eigenen Server
- HTML, das auch ohne CSS lesbar bleibt
Wer davon profitiert
Suchmaschinen
Eine saubere Überschriften-Hierarchie, beschreibende Alt-Texte und klare Links helfen Suchmaschinen, Inhalte richtig einzuordnen.
Was das CMF liefert:
- Sitemap mit Änderungsdatum
- Title und Meta-Description
- Open Graph und Twitter-Card
- Canonical-URLs gegen doppelte Inhalte
- robots-Angabe pro Seite
- Strukturierte Daten (JSON-LD)
Details im Beitrag Gefunden werden ohne SEO-Plugin.
Maschinen
Sprachmodelle ziehen Informationen zuverlässiger aus strukturiertem Inhalt. Ein <h2> ist eindeutig eine Überschrift – ein <div class="heading-xl mt-4"> ist es nicht.
Was das CMF liefert:
- Jede Seite als Markdown:
.mdan die Adresse hängen, etwa dieser Beitrag - llms.txt als Wegweiser zu allen Seiten
- JSON-LD mit Seitentyp, Datum und Hierarchie
- Suchindex als öffentliches JSON
- API liefert die Blöcke als JSON – kein HTML-Scraping nötig
Barrierefreiheit
Screenreader springen von Überschrift zu Überschrift und erkennen Listen als Listen. Semantisches HTML ist die Grundlage, dazu kommen Skip-Link, aria-current in der Navigation und ein alt-Attribut an jedem Bild – als Pflichtfeld, das bei dekorativen Bildern leer bleiben darf.
Was sonst noch eingebaut ist und was an dir bleibt, steht im Beitrag Barrierefrei ohne Aufwand.
Das Seiten-Layout im Detail
HTML-Grundgerüst
<a class="skip-link" href="#main-content">Zum Inhalt springen</a>
<header>…</header>
<nav aria-label="Hauptnavigation">
<ul class="nav-menu">
<li class="nav-item"><a href="/" aria-current="page">Start</a></li>
<li class="nav-item"><a href="/kontakt">Kontakt</a></li>
</ul>
</nav>
<main id="main-content">
<section><h1>Seitentitel</h1></section>
<div><p>Absatz</p></div>
<div><figure>
<img src="…" alt="…" loading="lazy">
<figcaption>Bildtext</figcaption>
</figure></div>
</main>
<footer>…</footer>Was jedes Element bedeutet
skip-link– erster Link der Seite, springt direkt zum Inhalt<header>– Kopfbereich mit den Inhalten aus Header/Footer<nav>– Hauptnavigation mitaria-labelaria-current="page"– markiert die aktive Seite<main>– Hauptinhalt, Ziel des Skip-Links<h1>– Hauptüberschrift, genau eine pro Seite<figure>+<figcaption>– Bild mit Beschreibungloading="lazy"– Bild erst laden, wenn es in Sichtweite kommt<footer>– Fußbereich, auf allen Seiten gleich
Jedes Element hat eine Bedeutung, nicht nur eine Darstellung. Die schlichten Container um die Blöcke tragen keine – sie stören weder Screenreader noch Maschinen.
Meta-Daten und Head-Bereich
Automatisch erzeugt
- title-Tag: Seitentitel + Titel-Anhang
- meta description aus dem Meta-Objekt
- Canonical-URL gegen doppelte Inhalte
- og:title, og:description, og:image, og:url, og:locale
- twitter:card, twitter:title, twitter:image
- robots-Angabe (pro Seite steuerbar)
- JSON-LD passend zum Seitentyp
- Favicon-Links für vorhandene Icon-Dateien
- Viewport-Meta für responsive Darstellung
CSS-Architektur
Drei CSS-Dateien, geladen in dieser Reihenfolge:
- base.css – Grundlayout, Navigation, Umbrüche
- theme.css – automatisch aus den Theme-Werten erzeugt (Farben, Schriften, Abstände)
- custom.css – eigene Klassen, überschreibt alles
Kein CSS-Framework, kein Build-Schritt, kein PostCSS.
Das Internet versteht keine Zauberei, sondern Struktur, Bedeutung und Relevanz. Semantisches HTML ist die Sprache, in der man mit dem Web spricht.