CSS-Tabs-Generator

Nächste

Tabs sind überall, in Einstellungsfenstern, Dokumentationsseiten, Produktgalerien. Native HTML hat kein spezielles Tab-Element, daher erstellen Entwickler ihre eigenen. Dieser Generator baut eine einfache Tab-Leiste in HTML + CSS: eine Akzentfarbe für den aktiven Tab, einen Eckenradius für die Buttons und einen Hover-Zustand. Fügen Sie das Markup in Ihr Projekt ein und verbinden Sie das Umschalten der Tabs mit Ihrem eigenen JavaScript.

So erstellen Sie Tabs

  1. 1

    Akzentfarbe wählen

    Hintergrund- und Textfarbe des aktiven Tabs. Wählen Sie eine Farbe, die zu Ihrer Marke passt.

  2. 2

    Eckenradius festlegen

    Rundet die oberen Ecken der Tab-Buttons ab. Höhere Werte wirken weicher.

  3. 3

    Beschriftungen anpassen

    Die Ausgabe enthält drei Buttons, "Overview", "Details" und "Settings": Benennen Sie sie passend zu Ihrem Inhalt um.

  4. 4

    Code kopieren

    Das Tab-Markup enthält einen eigenen <style>-Block. Fügen Sie beides in Ihre Seite ein.

  5. 5

    Tab-Wechsel hinzufügen

    Der Generator erzeugt nur den visuellen Teil. Verbinden Sie die Buttons mit Ihrem eigenen JavaScript oder Ihrer UI-Bibliothek, um die Panels ein- und auszublenden.

Korrektes barrierefreies Markup

<div class="tabs">
  <div role="tablist" aria-label="Produktinfo">
    <button role="tab" id="tab-1" aria-selected="true"  aria-controls="panel-1" tabindex="0">Überblick</button>
    <button role="tab" id="tab-2" aria-selected="false" aria-controls="panel-2" tabindex="-1">Spezifikationen</button>
    <button role="tab" id="tab-3" aria-selected="false" aria-controls="panel-3" tabindex="-1">Bewertungen</button>
  </div>
  <section role="tabpanel" id="panel-1" aria-labelledby="tab-1">...</section>
  <section role="tabpanel" id="panel-2" aria-labelledby="tab-2" hidden>...</section>
  <section role="tabpanel" id="panel-3" aria-labelledby="tab-3" hidden>...</section>
</div>

Kritische Attribute:

  • role="tablist" umschließt die Buttons.
  • role="tab" auf jedem Button, mit aria-selected und aria-controls.
  • tabindex verwendet das roving tabindex pattern: nur der aktive Tab ist 0, andere sind -1. Pfeiltasten bewegen den Fokus zwischen ihnen.
  • role="tabpanel" auf jedem Panel, mit aria-labelledby, das auf seinen Tab zeigt.
  • hidden auf inaktiven Panels (nicht nur display: none, das Attribut ist das, was AT verwendet).

Tastaturvertrag

Taste Aktion
Tab In die Tabliste hinein-/herausbewegen
ArrowLeft Vorheriger Tab (springt zum letzten)
ArrowRight Nächster Tab (springt zum ersten)
Home Erster Tab
End Letzter Tab
Enter / Space Fokussierten Tab aktivieren (bei manueller Aktivierung)

Automatische Aktivierung (Tab wechselt, wenn der Fokus sich bewegt) vs. manuelle (Fokus bewegt sich, Tab aktiviert sich bei Enter), WAI-ARIA erlaubt beides. Automatisch ist einfacher für sehende Benutzer; manuell ist besser, wenn der Tab-Inhalt schwer zu rendern ist.

Unterstrichener Stil

[role="tablist"] {
  display: flex;
  border-bottom: 1px solid #e5e7eb;
}
[role="tab"] {
  padding: 0.75rem 1rem;
  background: transparent;
  border: 0;
  color: #6b7280;
  position: relative;
  cursor: pointer;
}
[role="tab"][aria-selected="true"] {
  color: #111827;
}
[role="tab"][aria-selected="true"]::after {
  content: "";
  position: absolute;
  left: 1rem; right: 1rem; bottom: -1px;
  height: 2px;
  background: #2563eb;
}

Gepillter Stil

[role="tab"] {
  padding: 0.5rem 0.9rem;
  border-radius: 9999px;
  border: 0;
  background: transparent;
}
[role="tab"][aria-selected="true"] {
  background: #2563eb;
  color: #fff;
}

Fokus sichtbar

Zeichnen Sie immer einen Fokusring, wenn der Fokus über die Tastatur ankommt:

[role="tab"]:focus-visible {
  outline: 2px solid #60a5fa;
  outline-offset: 2px;
}

Das JavaScript

Ungefähr:

const tabs = document.querySelectorAll('[role="tab"]');
tabs.forEach(tab => {
  tab.addEventListener('click', () => activate(tab));
  tab.addEventListener('keydown', e => {
    const i = [...tabs].indexOf(tab);
    if (e.key === 'ArrowRight') tabs[(i + 1) % tabs.length].focus();
    if (e.key === 'ArrowLeft')  tabs[(i - 1 + tabs.length) % tabs.length].focus();
    if (e.key === 'Home') tabs[0].focus();
    if (e.key === 'End')  tabs[tabs.length - 1].focus();
  });
});

function activate(tab) {
  tabs.forEach(t => {
    const panel = document.getElementById(t.getAttribute('aria-controls'));
    const active = t === tab;
    t.setAttribute('aria-selected', active);
    t.setAttribute('tabindex', active ? '0' : '-1');
    panel.hidden = !active;
  });
  tab.focus();
}

Insgesamt dreißig Zeilen, null Abhängigkeiten.

Tabs vs. Akkordeons

Auf schmalen Bildschirmen werden Tab-Reihen eng. Häufiges Muster: Tabs auf Desktop, Akkordeon auf Mobilgeräten. Verwenden Sie eine Containerabfrage oder Medienabfrage, um die visuelle Behandlung zu wechseln, ohne die ARIA-Rollen zu ändern.

Häufig gestellte Fragen

Für barrierefreie Tabs, ja. Ohne role="tablist" und role="tab" behandeln Bildschirmleser die Buttons als reguläre Buttons und Benutzer verlieren die Navigationskonvention. Die Alternative ist ein einfaches <details> / <summary> Akkordeon, das eingebaute Semantik hat.

Automatisch (Tab aktiviert sich, wenn der Fokus sich bewegt) ist in Ordnung, wenn der Inhalt jedes Tabs günstig zu rendern ist. Manuell (Fokus bewegt sich, Enter aktiviert) ist besser, wenn das Wechseln der Tabs schwere Arbeiten wie das Abrufen oder Rendern eines großen Formulars auslöst.

Für inhaltstragende Tabs (Dokumentation, Produkt-Tabs), ja, verwenden Sie einen Hash (#specs) oder Abfrageparameter, damit Links zu einem bestimmten Tab verlinken können und der aktive Tab beim Neuladen bestehen bleibt. Für UI-Tabs (Einstellungsfenster) ist die URL optional.

Nur mit dem Checkbox-/Radio-Hack, der keine Pfeiltastennavigation und ARIA-Zustände hat. Für eine wirklich barrierefreie Implementierung ist der kleine JS-Schnipsel es wert. Wenn Sie serverseitige Fallbacks benötigen, verlinken Sie jeden Tab auf eine eindeutige URL und rendern Sie das entsprechende Panel serverseitig.

Verwandte Tools

Tool in anderen Sprachen verfügbar