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)
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.
<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 | ■ |
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
startangepasst werden.
<ol>
<li>Wasser kochen</li>
<li>Teebeutel hinzufügen</li>
<li>Ziehen lassen</li>
</ol>
- Wasser kochen
- Teebeutel hinzufügen
- 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>
- Erster Schritt
- 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:
<!-- 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>
- Projekt planen
- Design erstellen
- HTML schreiben
- CSS hinzufügen
- JavaScript einbauen
- Testen
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>
- Bronze
- Silber
- 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>
- Erster Punkt
- Sprung zu 10
- 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:
<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:
<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>
- Vorbereitung
- Zutaten besorgen
- Werkzeug bereitlegen
- Durchführung
- Anleitung lesen
- Schritt für Schritt vorgehen
- Abschluss
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.
<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:
<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)
- 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:
/* 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:
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:
/* 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; }
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:
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:
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: "✅ ";
}
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:
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:
<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>
.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:
- 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.
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
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:
<!-- ❌ 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 |
Für einfache Navigationen reicht <nav> + <ul> völlig aus.
Verwende ARIA-Rollen nur bei komplexen interaktiven Komponenten, die über einfache Links
hinausgehen.
Navigation als Liste
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.
<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>
.nav-list {
list-style: none;
padding: 0;
margin: 0;
display: flex;
gap: 1rem;
}
.nav-list a {
text-decoration: none;
padding: 0.5rem 1rem;
}
- 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:
/* 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;
}
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...