HTML Links & Anker

Externe Links, interne Verlinkungen, Anker-Sprungmarken und spezielle Link-Typen - alles über das a-Tag mit href, target und rel.

Ein Link wird mit dem <a>-Tag erstellt. Das wichtigste Attribut ist href "Hypertext Reference", das die Zieladresse angibt.

HTML
<a href="https://www.beispielseite.de">Zur Beispielseite</a>

Der sichtbare Text zwischen den Tags ist das, worauf geklickt wird. Du kannst statt Text auch ein Bild oder ein anderes HTML-Element verlinken.

  • Externe Links verweisen auf andere Websites.
  • Interne Links führen zu einer anderen Seite innerhalb deines Projekts.
HTML
<!-- Externer Link -->
<a href="https://www.wikipedia.org" target="_blank">Wikipedia öffnen</a>

<!-- Interner Link -->
<a href="kontakt.html">Kontaktseite</a>

Mit target="_blank" öffnest du einen Link in einem neuen Tab oder Fenster. Für interne Seiten lässt du das normalerweise weg.

Hinweis zu target und rel

Wenn du target="_blank" nutzt, solltest du immer auch ein rel-Attribut ergänzen, um Sicherheits- und Datenschutzprobleme zu vermeiden.

  • rel="noopener" verhindert, dass die neue Seite über window.opener auf deine Seite zugreifen kann.
  • rel="noreferrer" unterbindet zusätzlich das Senden der Referrer-Information (also der Ursprungsadresse).
  • rel="nofollow" sagt Suchmaschinen, dass sie dem Link nicht folgen oder ihn nicht für das Ranking werten sollen (nützlich bei z. B. Affiliate-Links).
Attribut Beispielwert Beschreibung
href "https://example.com" Zieladresse des Links (kann absolut oder relativ sein).
target
  • _self - öffnet im selben Tab (Standard)
  • _blank - öffnet in neuem Tab/Fenster
  • _parent - öffnet im übergeordneten Frame
  • _top - öffnet im gesamten Fenster, auch bei Framesets
Legt fest, wo der Link geöffnet werden soll.
rel
  • noopener
  • noreferrer
  • nofollow
  • external
Zusätzliche Angaben über die Beziehung zur Zielseite (Sicherheit, SEO, Datenschutz).
title "Mehr Infos anzeigen" Kurzer Hinweistext, der beim Überfahren des Links erscheint.
download "datei.pdf" Erzwingt den Download einer Datei statt Anzeige im Browser.
type "application/pdf" Gibt den MIME-Typ der verlinkten Ressource an (optional).
hreflang "de" Definiert die Sprache der Zielseite - nützlich für SEO und Screenreader.

Anker innerhalb einer Seite

Mit sogenannten Ankern kannst du Besucher direkt zu einer bestimmten Stelle auf der Seite springen lassen.

HTML
<!-- Zielbereich mit ID -->
<h2 id="kapitel2">Kapitel 2</h2>

<!-- Link zum Anker -->
<a href="#kapitel2">Zu Kapitel 2 springen</a>

Die id am Ziel-Element definiert, wohin der Link springen soll. Das Rautezeichen # im Link verweist darauf.

Tipp

Wenn du auf derselben Seite viele interne Sprungmarken nutzt, lohnt sich ein kleines Inhaltsverzeichnis mit Ankerlinks - das ist besonders praktisch bei langen Tutorials oder Dokumentationen.

Neben normalen URLs kannst du auch spezielle Protokolle verwenden, um E-Mails zu öffnen, Telefonate zu starten oder andere Aktionen auszulösen.

Mit mailto: öffnest du das Standard-E-Mail-Programm des Nutzers:

HTML
<!-- Einfacher E-Mail-Link -->
<a href="mailto:info@beispiel.de">E-Mail schreiben</a>

<!-- Mit vorausgefülltem Betreff -->
<a href="mailto:info@beispiel.de?subject=Anfrage">Anfrage senden</a>

<!-- Mit Betreff und Text -->
<a href="mailto:info@beispiel.de?subject=Anfrage&body=Hallo,%20ich%20habe%20eine%20Frage...">
    Kontakt aufnehmen
</a>

<!-- Mit CC und BCC -->
<a href="mailto:info@beispiel.de?cc=kopie@beispiel.de&bcc=geheim@beispiel.de">
    E-Mail mit Kopie
</a>
Spam-Schutz beachten

E-Mail-Adressen im HTML können von Spam-Bots gesammelt werden. Überlege, ob du stattdessen ein Kontaktformular verwendest oder die Adresse mit JavaScript verschleierst.

Auf mobilen Geräten startet tel: direkt einen Anruf - sehr praktisch für Kontaktseiten:

HTML
<!-- Telefon-Link (internationales Format empfohlen) -->
<a href="tel:+4922112345678">+49 221 12345678</a>

<!-- Mit aria-label für Screenreader -->
<a href="tel:+4922112345678" aria-label="Anrufen: 0221 12345678">
    Jetzt anrufen
</a>
Tipp

Verwende immer das internationale Format mit Ländervorwahl (+49 für Deutschland). So funktioniert der Link auch für Besucher aus dem Ausland.

Ähnlich wie Telefon-Links, aber für Textnachrichten:

HTML
<!-- SMS-Link -->
<a href="sms:+4915012345678">SMS senden</a>

<!-- Mit vorausgefülltem Text (iOS) -->
<a href="sms:+4915012345678&body=Hallo!">SMS mit Text</a>

<!-- Mit vorausgefülltem Text (Android) -->
<a href="sms:+4915012345678?body=Hallo!">SMS mit Text</a>

Weitere Protokolle

Protokoll Beispiel Funktion
mailto: mailto:info@example.com Öffnet E-Mail-Programm
tel: tel:+491234567890 Startet Telefonanruf
sms: sms:+491234567890 Öffnet SMS-App
whatsapp: whatsapp://send?phone=491234567890 Öffnet WhatsApp Chat
skype: skype:username?call Startet Skype-Anruf
geo: geo:50.9375,6.9603 Öffnet Karten-App (Koordinaten)

Mit dem download-Attribut erzwingst du den Download einer Datei, anstatt sie im Browser anzuzeigen. Das ist besonders nützlich für PDFs, Bilder oder andere Dokumente.

Einfacher Download

HTML
<!-- Download mit Original-Dateinamen -->
<a href="/dokumente/bericht.pdf" download>
    Bericht herunterladen (PDF)
</a>

<!-- Download mit benutzerdefiniertem Dateinamen -->
<a href="/dokumente/report-2024-q4.pdf" download="Jahresbericht-2024.pdf">
    Jahresbericht herunterladen
</a>

Download mit Icon und Dateigröße

Für eine bessere User Experience zeigst du Dateityp und -größe an:

HTML
<a href="/files/handbuch.pdf" download class="download-link">
    📄 Handbuch herunterladen
    <span class="file-info">(PDF, 2.4 MB)</span>
</a>
Einschränkungen beachten
  • Das download-Attribut funktioniert nur bei Same-Origin-URLs (gleiche Domain) oder bei Blob/Data-URLs.
  • Bei Cross-Origin-Links (andere Domain) ignorieren Browser das Attribut aus Sicherheitsgründen.
  • Der Server kann den Download über Content-Disposition-Header überschreiben.

Dateityp mit type angeben

Optional kannst du den MIME-Typ der Datei angeben - das hilft dem Browser bei der Verarbeitung:

HTML
<a href="/files/daten.csv" 
   download="export.csv" 
   type="text/csv">
    CSV-Export herunterladen
</a>

<a href="/files/archiv.zip" 
   download 
   type="application/zip">
    ZIP-Archiv herunterladen
</a>

Links sind ein zentrales Navigationselement im Web. Für Screenreader-Nutzer und Tastaturnavigation müssen sie besonders sorgfältig gestaltet werden.

Aussagekräftige Linktexte

Der Linktext sollte auch ohne Kontext verständlich sein. Screenreader listen oft alle Links einer Seite auf - "hier klicken" sagt dann nichts aus.

Schlecht
<!-- Nichtssagend -->
<a href="...">hier klicken</a>
<a href="...">mehr</a>
<a href="...">Link</a>
<a href="...">weiterlesen</a>
Gut
<!-- Beschreibend -->
<a href="...">Preisliste herunterladen</a>
<a href="...">Alle Tutorials anzeigen</a>
<a href="...">Mehr über CSS Flexbox</a>
<a href="...">Artikel weiterlesen: HTML Basics</a>

Links, die nur ein Icon enthalten, brauchen einen beschreibenden Text für Screenreader:

HTML
<!-- ❌ Ohne Beschreibung - Screenreader liest nur "Link" -->
<a href="https://twitter.com/beispiel">
    <svg>...</svg>
</a>

<!-- ✅ Mit aria-label -->
<a href="https://twitter.com/beispiel" aria-label="Folge uns auf Twitter">
    <svg aria-hidden="true">...</svg>
</a>

<!-- ✅ Alternative: Visuell versteckter Text -->
<a href="https://twitter.com/beispiel">
    <svg aria-hidden="true">...</svg>
    <span class="visually-hidden">Folge uns auf Twitter</span>
</a>

Informiere Nutzer, wenn ein Link eine externe Seite öffnet oder in einem neuen Tab:

HTML
<!-- Mit visuellem Hinweis und Screenreader-Text -->
<a href="https://example.com" 
   target="_blank" 
   rel="noopener noreferrer">
    Externe Ressource
    <span aria-hidden="true">↗</span>
    <span class="visually-hidden">(öffnet in neuem Tab)</span>
</a>

Fokus-Styles beibehalten

Entferne niemals den Fokus-Indikator! Er ist essentiell für Tastaturnavigation:

CSS
/* ❌ NIEMALS so! */
a:focus {
    outline: none;
}

/* ✅ Stattdessen: Eigenen Fokus-Style definieren */
a:focus {
    outline: 2px solid #4ecdc4;
    outline-offset: 2px;
}

/* ✅ Oder mit focus-visible (nur bei Tastatur) */
a:focus-visible {
    outline: 2px solid #4ecdc4;
    outline-offset: 2px;
}
Checkliste für barrierefreie Links
  • Linktext ist aussagekräftig und kontextunabhängig verständlich
  • Icon-Links haben aria-label oder versteckten Text
  • Externe Links sind als solche erkennbar
  • Fokus-Styles sind sichtbar und deutlich
  • Links sind von umgebendem Text unterscheidbar (nicht nur durch Farbe!)
  • Klickfläche ist groß genug (mindestens 44×44px für Touch)

CSS bietet spezielle Pseudo-Klassen für die verschiedenen Zustände eines Links. Die Reihenfolge ist wichtig!

Merke dir die Reihenfolge mit "LoVe HAte Focus" oder LVHFA:

CSS
/* 1. :link - Unbesuchte Links */
a:link {
    color: #3498db;
    text-decoration: underline;
}

/* 2. :visited - Bereits besuchte Links */
a:visited {
    color: #9b59b6;
}

/* 3. :hover - Maus schwebt über dem Link */
a:hover {
    color: #2980b9;
    text-decoration: none;
}

/* 4. :focus - Link hat Tastaturfokus */
a:focus {
    outline: 2px solid #3498db;
    outline-offset: 2px;
}

/* 5. :active - Link wird gerade geklickt */
a:active {
    color: #e74c3c;
}
Reihenfolge ist wichtig!

Wegen der CSS-Spezifität überschreiben spätere Regeln die früheren. Wenn du :hover vor :visited schreibst, funktioniert der Hover-Effekt bei besuchten Links nicht!

CSS
/* Unterstrich nur bei Hover */
a {
    color: #3498db;
    text-decoration: none;
}

a:hover {
    text-decoration: underline;
}

/* Animierter Unterstrich */
a {
    text-decoration: none;
    background-image: linear-gradient(currentColor, currentColor);
    background-size: 0% 2px;
    background-position: 0 100%;
    background-repeat: no-repeat;
    transition: background-size 0.3s ease;
}

a:hover {
    background-size: 100% 2px;
}

/* Button-Style für Links */
a.btn {
    display: inline-block;
    padding: 0.75rem 1.5rem;
    background: #3498db;
    color: white;
    text-decoration: none;
    border-radius: 4px;
    transition: background 0.2s ease;
}

a.btn:hover {
    background: #2980b9;
}

:visited Einschränkungen

Aus Datenschutzgründen sind die Styling-Möglichkeiten für :visited eingeschränkt. Du kannst nur diese Eigenschaften ändern:

  • color
  • background-color
  • border-color
  • outline-color
  • column-rule-color
  • fill und stroke (SVG)
Warum diese Einschränkung?

Früher konnten Websites per JavaScript auslesen, welche Links besucht wurden (über getComputedStyle). Das war ein Datenschutzproblem, da man so die Browserhistorie ausspähen konnte. Deshalb wurden die Möglichkeiten stark eingeschränkt.

Smooth Scroll für Anker-Links

Standardmäßig springt der Browser abrupt zum Anker. Mit CSS oder JavaScript kannst du einen sanften Scroll-Effekt hinzufügen.

CSS: scroll-behavior

Die einfachste Lösung - eine Zeile CSS:

CSS
/* Auf das gesamte Dokument anwenden */
html {
    scroll-behavior: smooth;
}

/* Oder nur für bestimmte Container */
.scroll-container {
    scroll-behavior: smooth;
    overflow-y: auto;
    max-height: 400px;
}
Tipp: Nutzer-Präferenzen respektieren

Manche Nutzer bevorzugen reduzierte Bewegungen (z.B. wegen Schwindel). Respektiere das mit prefers-reduced-motion:

CSS
/* Smooth Scroll nur wenn Nutzer es nicht deaktiviert hat */
@media (prefers-reduced-motion: no-preference) {
    html {
        scroll-behavior: smooth;
    }
}

Offset bei Fixed Header

Bei einem fixierten Header verschwindet der Anker oft hinter der Navigation. Mit scroll-margin-top oder scroll-padding-top löst du das:

CSS
/* Methode 1: scroll-padding auf html/body */
html {
    scroll-behavior: smooth;
    scroll-padding-top: 80px; /* Höhe deines Headers */
}

/* Methode 2: scroll-margin auf den Ziel-Elementen */
[id] {
    scroll-margin-top: 80px;
}

/* Oder spezifischer */
h2[id], h3[id], h4[id] {
    scroll-margin-top: 100px;
}

JavaScript-Alternative (mehr Kontrolle)

Für mehr Kontrolle über die Animation kannst du JavaScript verwenden:

JavaScript
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
    anchor.addEventListener('click', function(e) {
        const href = this.getAttribute('href');
        
        // Ignoriere leere Links
        if (href === '#') return;
        
        const target = document.querySelector(href);
        
        if (target) {
            e.preventDefault();
            
            // Header-Höhe berücksichtigen
            const headerOffset = 80;
            const elementPosition = target.getBoundingClientRect().top;
            const offsetPosition = elementPosition + window.pageYOffset - headerOffset;
            
            window.scrollTo({
                top: offsetPosition,
                behavior: 'smooth'
            });
        }
    });
});

Ein häufiger Fehler: Links, die aussehen wie Buttons, oder Buttons, die wie Links funktionieren sollen. Die Unterscheidung ist wichtig für Semantik, Accessibility und SEO.

Verwende <a> wenn:

  • Der Klick zu einer anderen Seite oder URL führt
  • Der Klick zu einem Anker auf der gleichen Seite führt
  • Der Nutzer die URL teilen, bookmarken oder in neuem Tab öffnen können soll
  • Es einen Download auslöst

Wann einen Button verwenden?

Verwende <button> wenn:

  • Der Klick eine Aktion auf der aktuellen Seite auslöst (z.B. Formular absenden)
  • Der Klick ein Modal, Dropdown oder Menü öffnet
  • Der Klick JavaScript ausführt, ohne die URL zu ändern
  • Es einen Toggle-Status ändert (z.B. Dark Mode)
Richtig
<!-- Navigation = Link -->
<a href="/kontakt">Kontakt</a>

<!-- Formular absenden = Button -->
<button type="submit">Absenden</button>

<!-- Modal öffnen = Button -->
<button onclick="openModal()">
    Details anzeigen
</button>

<!-- Download = Link -->
<a href="/file.pdf" download>
    PDF herunterladen
</a>
Falsch
<!-- Link ohne echtes Ziel -->
<a href="#" onclick="doSomething()">
    Klick mich
</a>

<!-- Button für Navigation -->
<button onclick="location.href='/kontakt'">
    Kontakt
</button>

<!-- Div als Button (niemals!) -->
<div onclick="submit()">
    Absenden
</div>

<!-- javascript:void(0) vermeiden -->
<a href="javascript:void(0)">
    Aktion
</a>
Warum ist das wichtig?
  • Tastaturnavigation: Links werden mit Enter aktiviert, Buttons mit Enter UND Space
  • Screenreader: Lesen "Link" oder "Button" vor - Nutzer erwarten unterschiedliches Verhalten
  • Rechtsklick: Bei Links kann man "In neuem Tab öffnen" wählen - bei Buttons nicht
  • SEO: Suchmaschinen folgen Links, aber nicht Button-Aktionen

Wenn du einen Link optisch wie einen Button darstellen willst, ist das völlig OK - solange er semantisch ein Link bleibt:

HTML + CSS
<!-- Link, der wie ein Button aussieht -->
<a href="/registrieren" class="btn btn-primary">
    Jetzt registrieren
</a>
CSS
.btn {
    display: inline-block;
    padding: 0.75rem 1.5rem;
    border-radius: 4px;
    text-decoration: none;
    font-weight: 600;
    text-align: center;
    cursor: pointer;
    transition: all 0.2s ease;
}

.btn-primary {
    background: #3498db;
    color: white;
}

.btn-primary:hover {
    background: #2980b9;
}

Mehr aus HTML

Tutorials werden geladen...