HTML Links & Anker
Externe Links, interne Verlinkungen, Anker-Sprungmarken und spezielle Link-Typen - alles über das a-Tag mit href, target und rel.
Grundaufbau eines Links
Ein Link wird mit dem <a>-Tag erstellt. Das wichtigste
Attribut
ist
href "Hypertext Reference", das die Zieladresse angibt.
<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 und interne Links
- Externe Links verweisen auf andere Websites.
- Interne Links führen zu einer anderen Seite innerhalb deines Projekts.
<!-- 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.
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 überwindow.openerauf 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 |
|
Legt fest, wo der Link geöffnet werden soll. |
rel |
|
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.
<!-- 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.
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.
Spezielle Link-Typen
Neben normalen URLs kannst du auch spezielle Protokolle verwenden, um E-Mails zu öffnen, Telefonate zu starten oder andere Aktionen auszulösen.
E-Mail-Links mit mailto:
Mit mailto: öffnest du das Standard-E-Mail-Programm des Nutzers:
<!-- 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>
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.
Telefon-Links mit tel:
Auf mobilen Geräten startet tel: direkt einen Anruf - sehr
praktisch für Kontaktseiten:
<!-- 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>
Verwende immer das internationale Format mit Ländervorwahl (+49 für Deutschland).
So funktioniert der Link auch für Besucher aus dem Ausland.
SMS-Links mit sms:
Ähnlich wie Telefon-Links, aber für Textnachrichten:
<!-- 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) |
Download-Links
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
<!-- 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:
<a href="/files/handbuch.pdf" download class="download-link">
📄 Handbuch herunterladen
<span class="file-info">(PDF, 2.4 MB)</span>
</a>
- 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:
<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>
Accessibility bei Links
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.
<!-- Nichtssagend -->
<a href="...">hier klicken</a>
<a href="...">mehr</a>
<a href="...">Link</a>
<a href="...">weiterlesen</a>
<!-- 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>
aria-label für Icon-Links
Links, die nur ein Icon enthalten, brauchen einen beschreibenden Text für Screenreader:
<!-- ❌ 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>
Externe Links kennzeichnen
Informiere Nutzer, wenn ein Link eine externe Seite öffnet oder in einem neuen Tab:
<!-- 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:
/* ❌ 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;
}
- Linktext ist aussagekräftig und kontextunabhängig verständlich
- Icon-Links haben
aria-labeloder 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)
Links mit CSS stylen
CSS bietet spezielle Pseudo-Klassen für die verschiedenen Zustände eines Links. Die Reihenfolge ist wichtig!
Link-Pseudo-Klassen (LVHFA)
Merke dir die Reihenfolge mit "LoVe HAte Focus" oder LVHFA:
/* 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;
}
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!
Praktische Link-Styles
/* 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:
colorbackground-colorborder-color
outline-colorcolumn-rule-colorfillundstroke(SVG)
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:
/* 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;
}
Manche Nutzer bevorzugen reduzierte Bewegungen (z.B. wegen Schwindel). Respektiere das
mit prefers-reduced-motion:
/* 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:
/* 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:
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'
});
}
});
});
Button vs. Link - Wann was?
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.
Wann einen Link verwenden?
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)
<!-- 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>
<!-- 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>
- 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
Einen Link als Button stylen
Wenn du einen Link optisch wie einen Button darstellen willst, ist das völlig OK - solange er semantisch ein Link bleibt:
<!-- Link, der wie ein Button aussieht -->
<a href="/registrieren" class="btn btn-primary">
Jetzt registrieren
</a>
.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...