HTML Listen

Ungeordnete, geordnete und Beschreibungslisten - alle HTML-Listentypen mit Attributen, Verschachtelung und CSS-Styling.

Was sind Listen in HTML?

Listen sind ein zentrales Element in HTML. Sie strukturieren Inhalte übersichtlich - egal ob du eine Einkaufsliste, eine Navigation oder eine Schritt-für-Schritt-Anleitung erstellen möchtest.

Listen helfen, zusammengehörige Inhalte zu gliedern. Sie bestehen immer aus einem umschließenden Listentag und einzelnen Listenelementen, den sogenannten <li>-Tags, den list items.

  • <ul> - Ungeordnete Liste (Aufzählung ohne Reihenfolge)
  • <ol> - Geordnete Liste (nummerierte Reihenfolge)
  • <dl> - Beschreibungsliste (Begriffe mit Definitionen)
Merke

Jedes <li>-Element steht für einen einzelnen Eintrag in deiner Liste. Listen können verschachtelt werden und sogar andere HTML-Elemente enthalten - wie Links, Bilder oder Absätze.

HTML
<ul>
    <li>Erster Punkt</li>
    <li>Zweiter Punkt</li>
</ul>

Ungeordnete Listen - <ul>

Eine ungeordnete Liste wird mit <ul> erstellt. Jedes Listenelement wird mit <li> markiert. Sie eignet sich für Aufzählungen, bei denen die Reihenfolge keine Rolle spielt. - wie z. B. Zutaten oder Kategorien.

  • Einträge werden standardmäßig mit Punkten dargestellt.
  • Die Darstellung kann später per CSS angepasst werden (z. B. Kreise, Quadrate, Symbole - ich habe mich für Pfeile entschieden).
  • Jedes Listenelement steht in einem eigenen <li>-Tag.
<ul>
    <li>Apfel</li>
    <li>Banane</li>
    <li>Kirsche</li>
</ul>
  • Apfel
  • Banane
  • Kirsche

Das type-Attribut (veraltet)

Früher konnte man mit dem type-Attribut das Aufzählungszeichen ändern. Das ist heute veraltet - nutze stattdessen CSS list-style-type. Zur Vollständigkeit hier die alten Werte:

Wert Zeichen Beispiel
disc Ausgefüllter Kreis (Standard)
circle Leerer Kreis
square Quadrat
Hinweis

Das type-Attribut bei <ul> ist in HTML5 veraltet. Verwende stattdessen die CSS-Eigenschaft list-style-type für die Gestaltung.

Geordnete Listen - <ol>

Geordnete Listen werden automatisch nummeriert. Sie sind ideal für Schritt-für-Schritt-Anleitungen, Ranglisten oder andere Inhalte, bei denen die Reihenfolge wichtig ist.

  • Die Punkte werden automatisch nummeriert.
  • Mit dem type-Attribut kannst du den Stil ändern (z. B. Zahlen, Buchstaben, römische Ziffern).
  • Nummerierung kann über start angepasst werden.
<ol>
    <li>Wasser kochen</li>
    <li>Teebeutel hinzufügen</li>
    <li>Ziehen lassen</li>
</ol>
  1. Wasser kochen
  2. Teebeutel hinzufügen
  3. Ziehen lassen

Das type-Attribut

Mit dem type-Attribut änderst du das Nummerierungsformat:

Wert Beschreibung Beispiel
1 Dezimalzahlen (Standard) 1, 2, 3...
a Kleinbuchstaben a, b, c...
A Großbuchstaben A, B, C...
i Kleine römische Zahlen i, ii, iii...
I Große römische Zahlen I, II, III...
<ol type="a">
    <li>Erster Schritt</li>
    <li>Zweiter Schritt</li>
</ol>
  1. Erster Schritt
  2. Zweiter Schritt

Das start-Attribut

Mit start legst du fest, bei welcher Nummer die Liste beginnt. Das ist besonders nützlich, wenn du eine lange Liste in mehrere Spalten aufteilen möchtest:

HTML
<!-- Liste in zwei Spalten aufteilen -->
<ol>
        <li>Projekt planen</li>
        <li>Design erstellen</li>
        <li>HTML schreiben</li>
    </ol>
    <ol start="4">
        <li>CSS hinzufügen</li>
        <li>JavaScript einbauen</li>
        <li>Testen</li>
    </ol>
</div>
  1. Projekt planen
  2. Design erstellen
  1. HTML schreiben
  2. CSS hinzufügen
  1. JavaScript einbauen
  2. Testen
Tipp

Der start-Wert ist immer eine Zahl, auch wenn du type="a" verwendest. Bei start="4" und type="a" beginnt die Liste bei "d".

Das reversed-Attribut

Mit reversed zählt die Liste rückwärts - perfekt für Countdowns oder Top-10-Listen:

<ol reversed>
    <li>Bronze</li>
    <li>Silber</li>
    <li>Gold</li>
</ol>
  1. Bronze
  2. Silber
  3. Gold

Das value-Attribut auf <li>

Mit value auf einzelnen <li>-Elementen überschreibst du die Nummerierung an bestimmten Stellen:

<ol>
    <li>Erster Punkt</li>
    <li value="10">Sprung zu 10</li>
    <li>Weiter bei 11</li>
</ol>
  1. Erster Punkt
  2. Sprung zu 10
  3. Weiter bei 11

Verschachtelte Listen

Listen können ineinander verschachtelt werden, um hierarchische Strukturen darzustellen. Die innere Liste wird dabei innerhalb eines <li>-Elements platziert:

HTML
<ul>
    <li>Obst
        <ul>
            <li>Äpfel</li>
            <li>Bananen</li>
            <li>Orangen</li>
        </ul>
    </li>
    <li>Gemüse
        <ul>
            <li>Karotten</li>
            <li>Brokkoli</li>
        </ul>
    </li>
    <li>Getränke</li>
</ul>
  • Obst
    • Äpfel
    • Bananen
    • Orangen
  • Gemüse
    • Karotten
    • Brokkoli
  • Getränke

Gemischte Verschachtelung

Du kannst auch verschiedene Listentypen kombinieren, z.B. eine geordnete Liste mit ungeordneten Unterpunkten:

HTML
<ol>
    <li>Vorbereitung
        <ul>
            <li>Zutaten besorgen</li>
            <li>Werkzeug bereitlegen</li>
        </ul>
    </li>
    <li>Durchführung
        <ul>
            <li>Anleitung lesen</li>
            <li>Schritt für Schritt vorgehen</li>
        </ul>
    </li>
    <li>Abschluss</li>
</ol>
  1. Vorbereitung
    • Zutaten besorgen
    • Werkzeug bereitlegen
  2. Durchführung
    • Anleitung lesen
    • Schritt für Schritt vorgehen
  3. Abschluss
Wichtig

Die innere Liste muss innerhalb des <li>-Elements stehen, nicht daneben. Falsch wäre: </li><ul>...</ul>

Beschreibungslisten - <dl>

Beschreibungslisten sind eine besondere Form, mit der du Begriffe und deren Erklärungen strukturieren kannst. Sie bestehen aus <dt> = Begriff / definition term und <dd> = Beschreibung / definition description.

HTML
<dl>
    <dt>HTML</dt>
    <dd>HyperText Markup Language - die Struktur einer Webseite.</dd>
    <dt>CSS</dt>
    <dd>Cascading Style Sheets - das Aussehen einer Webseite.</dd>
</dl>
HTML
HyperText Markup Language - die Struktur einer Webseite.
CSS
Cascading Style Sheets - das Aussehen einer Webseite.

Mehrere Beschreibungen pro Begriff

Ein Begriff kann auch mehrere Beschreibungen haben:

HTML
<dl>
    <dt>JavaScript</dt>
    <dd>Programmiersprache für das Web</dd>
    <dd>Ermöglicht interaktive Webseiten</dd>
    <dd>Läuft im Browser und auf dem Server (Node.js)</dd>
</dl>
JavaScript
Programmiersprache für das Web
Ermöglicht interaktive Webseiten
Läuft im Browser und auf dem Server (Node.js)
Einsatzbereiche
  • Glossare oder Begriffserklärungen
  • FAQ-Bereiche mit Frage und Antwort
  • Produktinformationen (z. B. technische Daten)
  • Metadaten (Autor, Datum, Kategorie)

Listen mit CSS stylen

CSS bietet viele Möglichkeiten, Listen zu gestalten. Hier die wichtigsten Eigenschaften:

list-style-type

Ändert das Aufzählungszeichen oder die Nummerierung:

CSS
/* Ungeordnete Listen */
ul.square-list {
    list-style-type: square;
}

ul.no-bullets {
    list-style-type: none;
}

/* Geordnete Listen */
ol.roman {
    list-style-type: upper-roman;
}

ol.alpha {
    list-style-type: lower-alpha;
}
Wert Beschreibung
disc Ausgefüllter Kreis (Standard für ul)
circle Leerer Kreis
square Quadrat
decimal Dezimalzahlen (Standard für ol)
decimal-leading-zero 01, 02, 03...
lower-roman i, ii, iii...
upper-roman I, II, III...
lower-alpha a, b, c...
upper-alpha A, B, C...
none Keine Marker

list-style-position

Bestimmt, ob das Aufzählungszeichen innerhalb oder außerhalb des Textflusses steht:

CSS
ul.inside {
    list-style-position: inside;
}

ul.outside {
    list-style-position: outside; /* Standard */
}

list-style Shorthand

Mit der Kurzschreibweise list-style kannst du alle Listen-Eigenschaften in einer Zeile kombinieren:

CSS
/* Syntax: list-style: type position image; */

/* Nur Typ ändern */
ul { list-style: square; }

/* Typ und Position */
ul { list-style: circle inside; }

/* Mit eigenem Bild */
ul { list-style: none inside url('/icons/check.svg'); }

/* Komplett entfernen */
ul { list-style: none; }
Reihenfolge

Die Reihenfolge der Werte ist flexibel - der Browser erkennt automatisch, was was ist. Wenn du ein url() verwendest und es nicht lädt, wird der type als Fallback angezeigt.

Eigene Marker mit ::marker

Mit dem ::marker Pseudo-Element kannst du das Aufzählungszeichen direkt stylen:

CSS
li::marker {
    color: #e74c3c;
    font-weight: bold;
    font-size: 1.2em;
}

Eigene Symbole mit list-style-image

Du kannst auch eigene Bilder als Aufzählungszeichen verwenden:

CSS
ul.custom-marker {
    list-style-image: url('/assets/icons/checkmark.svg');
}

/* Oder mit content für mehr Kontrolle */
ul.emoji-list {
    list-style-type: none;
}

ul.emoji-list li::before {
    content: "✅ ";
}
Tipp

Bei Navigationen wird oft list-style-type: none verwendet, um die Bullets zu entfernen. Vergiss dann nicht, auch padding-left: 0 zu setzen, um den Standard-Einzug zu entfernen.

CSS Counter für komplexe Nummerierungen

Mit CSS Countern kannst du mehrstufige Nummerierungen wie "1.1", "1.2", "2.1" erstellen - ohne JavaScript und ohne manuelle Pflege. Perfekt für Dokumentationen, Inhaltsverzeichnisse oder Rechtsdokumente.

Einfacher Counter

So ersetzt du die Standard-Nummerierung durch einen eigenen Counter:

CSS
ol.custom-counter {
    counter-reset: section;      /* Counter initialisieren */
    list-style: none;
}

ol.custom-counter li {
    counter-increment: section;  /* Bei jedem li hochzählen */
}

ol.custom-counter li::before {
    content: counter(section) ". ";  /* Counter anzeigen */
    font-weight: bold;
    color: #e74c3c;
}

Mehrstufige Nummerierung (1.1, 1.2, ...)

Für verschachtelte Listen mit durchgehender Nummerierung:

HTML + CSS
<ol class="multi-level">
    <li>Einleitung
        <ol>
            <li>Hintergrund</li>
            <li>Zielsetzung</li>
        </ol>
    </li>
    <li>Hauptteil
        <ol>
            <li>Methodik</li>
            <li>Ergebnisse</li>
            <li>Diskussion</li>
        </ol>
    </li>
    <li>Fazit</li>
</ol>
CSS
.multi-level {
    counter-reset: chapter;
    list-style: none;
}

.multi-level > li {
    counter-increment: chapter;
    counter-reset: section;      /* Sub-Counter zurücksetzen */
}

.multi-level > li::before {
    content: counter(chapter) ". ";
    font-weight: bold;
}

.multi-level ol {
    counter-reset: section;
    list-style: none;
    margin-left: 1.5rem;
}

.multi-level ol li {
    counter-increment: section;
}

.multi-level ol li::before {
    content: counter(chapter) "." counter(section) " ";
    color: #666;
}

Ergebnis:

1. Einleitung
1.1 Hintergrund
1.2 Zielsetzung
2. Hauptteil
2.1 Methodik
2.2 Ergebnisse
2.3 Diskussion
3. Fazit
Wann CSS Counter verwenden?
  • Mehrstufige Nummerierungen (1.1, 1.2, ...)
  • Kapitel- und Abschnittsnummern in Dokumentationen
  • Rechtsdokumente mit Paragraphen (§1, §2, ...)
  • Figuren- oder Tabellennummerierung (Abb. 1, Abb. 2, ...)

Best Practices für Listen

  • Verwende Listen nur für inhaltlich zusammengehörige Punkte.
  • Verschachtel Listen nur, wenn es wirklich nötig ist - zu viele Ebenen erschweren die Lesbarkeit.
  • Nutze semantisch passende Listentypen - <ul> für Aufzählungen, <ol> für Schritte.
  • Verwende CSS, um die Darstellung anzupassen, statt zusätzliche HTML-Tags zu verwenden.
Tipp

Listen sind nicht nur für Text - du kannst sie auch für Navigationen, Inhaltsverzeichnisse oder Filterlisten nutzen. Sie sorgen für klare Struktur und verbessern die Barrierefreiheit deiner Website.

Barrierefreiheit bei Listen

Listen sind von Natur aus barrierefrei - Screenreader erkennen sie automatisch und geben hilfreiche Informationen wie "Liste mit 5 Elementen" aus. Aber es gibt einige Fallstricke, die du kennen solltest.

Screenreader-Verhalten

Screenreader behandeln Listen besonders:

  • Sie kündigen den Listentyp an ("Liste" oder "nummerierte Liste")
  • Sie nennen die Anzahl der Elemente
  • Bei jedem Element wird die Position genannt ("1 von 5")
  • Verschachtelte Listen werden als Unterebenen erkannt
Safari-Bug: role="list" bei list-style: none

Wichtig: Safari (und VoiceOver) entfernt die Listensemantik, wenn du list-style: none verwendest! Screenreader erkennen die Liste dann nicht mehr als solche.

Lösung: Füge role="list" hinzu:

HTML
<!-- ❌ Safari ignoriert die Listensemantik -->
<ul class="nav-list">
    <li>Home</li>
    <li>Über uns</li>
</ul>

<style>
.nav-list { list-style: none; }
</style>

<!-- ✅ Mit role="list" bleibt die Semantik erhalten -->
<ul class="nav-list" role="list">
    <li>Home</li>
    <li>Über uns</li>
</ul>

ARIA bei speziellen Listen

Für bestimmte Anwendungsfälle gibt es spezielle ARIA-Rollen:

Rolle Verwendung Beispiel
role="menu" Interaktive Menüs (mit Tastaturnavigation) Dropdown-Menüs, Kontextmenüs
role="menubar" Horizontale Menüleiste Hauptnavigation mit Untermenüs
role="tablist" Tab-Navigation Tabs zum Umschalten von Inhalten
role="listbox" Auswahllisten Custom Select-Dropdowns
Tipp

Für einfache Navigationen reicht <nav> + <ul> völlig aus. Verwende ARIA-Rollen nur bei komplexen interaktiven Komponenten, die über einfache Links hinausgehen.

Navigationen werden fast immer als Listen umgesetzt - das ist semantisch korrekt und barrierefrei. Das <nav>-Element kennzeichnet den Bereich als Navigation, die <ul> strukturiert die Links.

HTML
<nav aria-label="Hauptnavigation">
    <ul class="nav-list" role="list">
        <li><a href="/">Home</a></li>
        <li><a href="/tutorials/">Tutorials</a></li>
        <li><a href="/about/">Über uns</a></li>
        <li><a href="/contact/">Kontakt</a></li>
    </ul>
</nav>
CSS
.nav-list {
    list-style: none;
    padding: 0;
    margin: 0;
    display: flex;
    gap: 1rem;
}

.nav-list a {
    text-decoration: none;
    padding: 0.5rem 1rem;
}
Warum Listen für Navigationen?
  • Semantik: Eine Navigation ist eine Liste von Links
  • Barrierefreiheit: Screenreader erkennen die Struktur und Anzahl der Menüpunkte
  • Flexibilität: Einfach zu stylen mit CSS (horizontal, vertikal, Dropdowns)
  • Verschachtelung: Untermenüs lassen sich natürlich als verschachtelte Listen abbilden

Horizontale Listen mit CSS

Listen werden standardmäßig vertikal dargestellt. Mit CSS kannst du sie aber einfach horizontal anordnen - perfekt für Navigationen, Social-Media-Icons oder Breadcrumbs.

Mit Flexbox (empfohlen)

Die modernste und flexibelste Methode:

ul.horizontal {
    display: flex;
    list-style: none;
    padding: 0;
    gap: 1rem;
}
  • Home
  • Tutorials
  • Kontakt

Mit inline-block

Eine ältere, aber immer noch funktionierende Methode:

ul.inline-list {
    list-style: none;
    padding: 0;
}

ul.inline-list li {
    display: inline-block;
    margin-right: 1rem;
}
  • Eins
  • Zwei
  • Drei

Verteilung mit Flexbox

Flexbox bietet verschiedene Möglichkeiten, die Elemente zu verteilen:

CSS
/* Gleichmäßig verteilt */
ul.spread {
    display: flex;
    justify-content: space-between;
}

/* Zentriert */
ul.centered {
    display: flex;
    justify-content: center;
    gap: 2rem;
}

/* Am Ende ausgerichtet */
ul.end {
    display: flex;
    justify-content: flex-end;
    gap: 1rem;
}
Tipp

Verwende gap statt margin für Abstände zwischen Flex-Items. Das ist sauberer und du musst den letzten Abstand nicht extra entfernen.

Mehr aus HTML

Tutorials werden geladen...