semantic-html

Überprüft, schreibt neu und erklärt HTML5-Semantik (Tags, Landmarks, Überschriften, Formulare, ARIA). Verwende es, wenn der Benutzer HTML einfügt oder um eine Markup-Überprüfung, die richtigen Tags, Barrierefreiheit oder die Behebung von 'Divitis' bittet.

Was ist semantic-html?

Diese Fähigkeit hilft Entwicklern, HTML-Markup auf semantische Korrektheit und Barrierefreiheit zu überprüfen. Sie analysiert eingereichtes HTML, JSX oder andere Templates und gibt eine korrigierte Version mit detaillierten Erklärungen zurück. Der Schwerpunkt liegt auf framework-unabhängigem HTML5. Die Fähigkeit deckt alle wichtigen Bereiche ab: Dokumentstruktur, Landmarks, Überschriftenhierarchie, interaktive Elemente, Formulare, Listen, Tabellen, Medien, Textauszeichnung und ARIA-Nutzung. Sie bewertet Probleme nach ihrer Auswirkung: Barrierefreiheitsblocker, ungenaue Semantik und Detailverbesserungen. Die Antworten kommen im gemischten Stil: direkte Korrektur plus kurze Begründung, die am Browser-Verhalten und Accessibility Tree festgemacht wird. So lernen Entwickler nicht nur, was zu ändern ist, sondern auch warum es wichtig ist.

Funktioniert mit~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/lucasaugustsof/skills/tree/HEAD/semantic-html

Installed? Explore more Produktivität & Zusammenarbeit skills: steipete/gemini, steipete/gh-issues, steipete/skill-creator · View all 6 →

In Ihrer bevorzugten KI fragen

Öffnet einen neuen Chat, in dem dieser Agent-Skill bereits geladen ist.

Dokumentation

Semantisches HTML

Hilft, HTML zu überprüfen, eine korrigierte Version zurückzugeben und die Gründe hinter jeder Entscheidung zu erläutern. Der Fokus liegt immer auf einfachem HTML5, framework-unabhängig: Wenn der Code als JSX oder eine andere Vorlage kommt, analysiere nur das resultierende Markup und antworte in HTML.

Antworte in der Sprache, in der der Benutzer schreibt.

Warum Semantik wichtig ist (nutze dies zur Erklärung)

Der Browser wandelt HTML in das DOM um und baut daraus den Accessibility Tree (Barrierefreiheitsbaum). Jeder Tag hat eine implizite Rolle (<button> → Schaltfläche, <nav> → Navigation, <h2> → Überschrift Ebene 2). Screenreader, Suchmaschinen, Lesemodus und Erweiterungen lesen diesen Baum, nicht das CSS. Ein <div>, das wie eine Schaltfläche gestaltet ist, sieht wie eine Schaltfläche aus, aber für den Baum ist es nur ein generischer Block: Es erhält keinen Fokus, reagiert nicht auf Eingabe-/Leertaste und wird nicht als Schaltfläche angesagt.

Verankere Erklärungen daran – was der Browser versteht und was sich für die Menschen ändert, die die Seite nutzen – und nicht an auswendig gelernten Regeln. Bevorzuge konkrete Beispiele ("Der Screenreader wird ... ansagen", "Tab wird dieses Element überspringen ...") gegenüber Abstraktionen.

Nützlicher Gedankentest: Würde die Struktur noch Sinn ergeben, wenn das CSS verschwände?

Arbeitsablauf

  1. Verstehe den Inhalt vor den Tags. Was ist jeder Block? Navigation, Hauptinhalt, ein eigenständiges Element, ein interaktives Steuerelement? Wenn die Absicht mehrdeutig ist (z. B. ein Link, der wie eine Schaltfläche aussieht), nimm die wahrscheinlichste Lesart an und gib an, welche du angenommen hast.
  2. Überprüfe anhand der folgenden Checkliste.
  3. Antworte im definierten Format.

Überprüfungscheckliste

Dokument

  • <!DOCTYPE html>, <html lang="...">, <meta charset="utf-8">, <meta name="viewport">, ein beschreibender <title> (nur wenn der Ausschnitt ein vollständiges Dokument ist).

Landmarks (Bereiche)

  • <header>, <nav>, <main> (nur eines sichtbar pro Seite), <aside>, <footer>.
  • <section> gruppiert thematische Inhalte und hat normalerweise eine Überschrift; ohne Überschrift ist es wahrscheinlich ein <div>.
  • <article> ist Inhalt, der für sich allein sinnvoll wäre (Beitrag, Produktkarte, Kommentar).
  • Mehrere <nav> auf der Seite → mit aria-label unterscheiden.

Überschriften

  • Hierarchie ohne übersprungene Ebenen (h2 → h4 ist ein Problem).
  • Eine Überschrift beschreibt ihren Abschnitt; verwende Überschriften nicht, um Text groß zu machen, noch gestalteten Text anstelle einer Überschrift.

Interaktion

  • Eine Aktion auf der Seite → <button> (mit explizitem type innerhalb von Formularen). Navigation zu einer anderen URL → <a href>.
  • <div onclick>, <span onclick> und <a> ohne href sind rote Flaggen.
  • Ziehe native Elemente in Betracht, bevor du sie neu baust: <details>/<summary>, <dialog>.

Formulare

  • Jedes Feld hat ein zugeordnetes <label> (for/id oder den Input umschließend). Ein Platzhalter ersetzt kein Label.
  • Radio-/Checkbox-Gruppen in <fieldset> + <legend>.
  • Angemessener type (email, tel, number, date...) und autocomplete, wo es sinnvoll ist.

Listen und Tabellen

  • Eine Gruppe von Elementen → <ul>/<ol>; Begriff–Definitionspaare → <dl>.
  • <table> nur für tabellarische Daten, mit <caption>, <thead> und <th scope>. Niemals für das Layout.

Medien

  • <img> mit alt, das seinen Zweck beschreibt; dekorativ → alt="".
  • Bild mit einer Bildunterschrift → <figure> + <figcaption>.

Text

  • Sinnvolle Betonung: <strong>/<em>; <b>/<i> nur für stilistische Abweichung ohne Wichtigkeit.
  • <time datetime>, <blockquote>/<q>, <cite>, <abbr>, <code>/<pre>, <address>, wo sie passen.
  • <br> nur für Zeilenumbrüche, die Teil des Inhalts sind (Adresse, Gedicht), nicht für Abstände.

ARIA

  • Erste Regel: Wenn ein natives Element existiert, verwende es anstelle von ARIA.
  • Markiere redundantes ARIA (<button role="button">, <nav role="navigation">) und ARIA, das dem Tag widerspricht.

Nicht überkorrigieren. <div> und <span> sind korrekt, wenn ein Block nur für Layout oder Styling existiert. Jedes <div> durch ein <section> zu ersetzen, verschlechtert den Accessibility Tree.

Antwortformat (gemischter Ton: direkte Korrektur + kurze Begründung)

Diagnose

Liste von Problemen, gruppiert nach Auswirkung:

  • Beeinträchtigt Barrierefreiheit/Benutzbarkeit – etwas, das jemanden daran hindert, die Seite zu nutzen (Schaltfläche ohne Fokus, Feld ohne Label, Bild ohne alt).
  • Ungenaue Semantik – es funktioniert, vermittelt aber die falsche Struktur (übersprungene Überschrift, section ohne Titel).
  • Detail – feinkörnige Verbesserung.

Jeder Punkt: Was ist falsch → was verwenden. Eine Zeile.

Korrigierter Code

Das vollständig neu geschriebene HTML, mit kurzen Kommentaren nur zu den geänderten Teilen.

Warum

2 bis 5 kurze Erklärungen, eine pro wichtiger Entscheidung, verknüpft mit dem, was der Browser/Accessibility Tree tut. Wenn ein Konzept zentral ist (z. B. implizite Rolle, Landmark), erkläre es einmal mit einem konkreten Beispiel.

Wenn der Code bereits gut ist, sage dies klar und weise nur auf das wirklich Anpassenswerte hin.

Beispiel

Eingabe:

<div class="header">
  <div class="logo">Store</div>
  <div class="menu"><a>Home</a><a>Products</a></div>
</div>
<div class="title">Deals</div>
<div onclick="buy()">Buy</div>

Ausgabe (gekürzt):

Diagnose

  • Beeinträchtigt Benutzbarkeit: <div onclick> → <button type="button">; <a> ohne href → Links mit href.
  • Ungenaue Semantik: .header → <header>; .menu → <nav> mit <ul>; .title → <h1>; fehlendes <main>.

Korrigierter Code

<header>
  <p class="logo">Store</p>
  <nav aria-label="Hauptnavigation">
    <ul>
      <li><a href="/">Home</a></li>
      <li><a href="/products">Produkte</a></li>
    </ul>
  </nav>
</header>
<main>
  <h1>Angebote</h1>
  <button type="button" onclick="buy()">Kaufen</button>
</main>

Warum

  • Das <div> ist nicht in der Tab-Reihenfolge und reagiert nicht auf Eingabe; <button> bringt Fokus und Tastaturunterstützung mit und wird als "Schaltfläche" angesagt.
  • Ein <a> ohne href ist für den Browser kein Link: Es erhält keinen Fokus und taucht nicht in der Linkliste des Screenreaders auf.
  • <nav> und <main> werden zu Landmarks: Screenreader-Nutzer können direkt zu ihnen springen.

Quellen

Wenn du dir bei einer Regel unsicher bist, überprüfe sie auf MDN oder im HTML Living Standard (falls ein Dokumentationswerkzeug verfügbar ist, nutze es) und zitiere den Link.

Verwandte Skills