Anker und CSS

Hier erfahren Sie

Inhalt dieser Seite: Einführung - Darstellung (Layout) von Ankern - Verschiedene Anker-Varianten - "Spezialfälle" ("Leere" Anker, Impliziter "top"-Anker, Kombination von Anker und Link) - Test-Links - Empfehlung - Ressourcen

Einführung

Wenn man einem <A>-Element mit den Attributen name (und/oder id) einen eindeutigen Namen gibt, wird es zum sogenannten Anker:
<a name="xx" id="xx">Anker-Inhalt</a>
Dann kann man einen Hyperlink machen, der genau auf dieses Element zeigt:
<a href="#xx">Linktext</a>

Somit kann man einzelne Abschnitte innerhalb der gleichen Datei als URL angeben und einen Hyperlink darauf machen.

Seit HTML 4.01 kann man auch anderen Elementen (zum Beispiel Überschriften) ein id-Attribut geben, und moderne Browser springen bei einem entsprechenden Link auch zu solchen "Ankern":
Anker: <h3 id="kap3">Kapitelüberschrift 3</h3>
Hyperlink: <a href="#kap3">Zum Kapitel 3</a>

<a name="xx"> ist gemäss folgenden Standards valide: HTML 2.0, HTML 3.2, HTML 4.01.
In XHTML 1.0 ist es "geduldet" (deprecated), in XHTML 1.1 hingegen ist es nicht mehr valide.
Wahrscheinlich wird es auch von den meisten Browsern unterstützt.

<a id="xx"> ist gemäss folgenden Standards valide: HTML 4.01, XHTML 1.0, XHTML 1.1
Wenn ein Anker nur mit dem id-Attribut ausgestattet ist, springen gewisse ältere Browser das Sprungziel nicht an.

In den beiden heute (Ende 2003) gängigen Markup-Sprachen, HTML 4.01 und XHTML 1.0, ist es aus Gründen der Abwärtskompatibilität sinnvoll, beide Attribute zu verwenden:

<a name="xx" id="xx">Anker-Inhalt</a>

Diese Schreibweise empfiehlt das World Wide Web Konsortium (W3C) auch in den HTML Compatibility Guidelines zu XHTML 1.0

^ Zum Seitenanfang ^

Darstellung (Layout) von Ankern

Normalerweise soll ein Anker nicht speziell hervorgehoben sein. Sofern nicht im Stylesheet ein besonderes Layout für sämtliche <A>-Elemente definiert ist, sollte ein standardkonformer Browser den Inhalt eines Ankers grundsätzlich so darstellen, als ob das <A>-Element gar nicht vorhanden wäre, sondern nur der Inhalt zwischen <a name=".."> und </a>

Beispiel: Im Stylesheet stehen folgende Angaben:

a:link { color:#0000FF; background-color:#efefff; text-decoration:underline; }
a:visited { color:#980098; background-color:#efefff; text-decoration:underline; }
a:hover { color:#D00000; background-color:#ffffa0; text-decoration:none; }
a:active { color:#6633CC; background-color:#efefff; text-decoration:none; }

In HTML wird eine Überschrift zum Anker gemacht:

<h2><a name="kap4" id="kap4">Kapitel 4</a></h2>

Für das <A>-Element an sich (ohne Pseudoformat) hat es also keine CSS-Angaben.

Trotzdem übernimmt der Browser Netscape Navigator 4.x gewisse Style-Angaben (insbesondere Unterstreichung, Hintergrundfarbe) auch für <A>-Elemente, die gar keine Hyperlinks, sondern nur Anker sind. Weil Hyperlinks gemäss den obigen expliziten CSS-Angaben unterstrichen dargestellt werden sollen, unterstreicht Netscape 4.x hier auch alle Anker.

Mozilla 1.0 und Netscape 7 unterstreichen hier zwar die Anker nicht, aber beim Überfahren mit der Maus und beim Klicken erhalten auch reine Anker die Farben und Eigenschaften, die eigentlich für die entsprechenden Zustände von Hyperlinks gedacht sind (a:hover, a:active). Dieses Verhalten von Mozilla 1.0 und Netscape 7 ist offenbar gemäss der CSS2-Spezifikation korrekt. (Als erster Browser wendet Mozilla :hover und :active übrigens auch auf beliebige Elemente an (und nicht nur auf <A>).
Trotzdem ist es für Webautoren und Benutzer ziemlich verwirrlich, wenn Anker beim Überfahren mit der Maus und beim Anklicken plötzlich wie Links dargestellt werden, obwohl sie keine Links sind und auch nichts passiert, wenn man sie anklickt.

Um z.B. eine Kapitelüberschrift als brauchbaren Anker auszuzeichen, d.h. dass der Anker auch mit den "speziellen" Browsern Netscape 4.x und Mozilla 1.0 wie gewünscht dargestellt wird, ist es sinnvoll, für solche <A>-Elemente eine eigene Klasse zu machen:

a.nuranker { text-decoration:none; color:#000000; background-color:#ffffff;}
(Diese Deklaration muss später im CSS vorkommen als die obigen Deklarationen für die Hyperlinks. Die Farbwerte müssen auf die normalen Text- und Hintergrundfarbe gesetzt werden.)

Theoretisch könnte man statt a.nuranker auch den Selektor a[name] nehmen, allerdings wären dann keine Kombinationen von Links und Ankern in einem Element möglich, und zudem erkennen erst wenige Browser diese CSS-Schreibweise.

Eine weitere Möglichkeit, um den Hover-Effekt nur bei Links, aber nicht bei Ankern zu haben (mit anderen Worten: um in Mozilla bei reinen Ankern zu unterdrücken), wäre folgende Schreibweise:

a:link { color:#0000FF; background-color:#efefff; text-decoration:underline; }
a:visited { color:#980098; background-color:#efefff; text-decoration:underline; }
a:link:hover, a:visited:hover { color:#D00000; background-color:#ffffa0; text-decoration:none; }
a:active { color:#6633CC; background-color:#efefff; text-decoration:none; }

Die Probleme von Netscape 4.x werden damit allerdings nicht gelöst.

^ Zum Seitenanfang ^

Verschiedene Anker-Varianten:

Quellcode Resultat W3C-Standards Layout NN4
<h3><a name="..">Ziel</a></h3>

Ziel 1

HTML 3.2, HTML 4.01 Unterstrichen
<h3><a name=".." id="..">Ziel</a></h3>

Ziel 2

HTML 4.01, XHTML 1.0 Unterstrichen
<h3><a name=".." id=".." class="nuranker">Ziel</a></h3>

Ziel 2a

HTML 4.01, XHTML 1.0 normal
<h3><a id=".." class="nuranker">Ziel</a></h3>

Ziel 3

HTML 4.01, XHTML 1.0 normal
<h3 id="..">Ziel</h3>

Ziel 4

HTML 4.01, XHTML 1.0/1.1 normal

Weiter unten können Sie Links ausprobieren, die auf diese Ziele hier zeigen.

Die Varianten 3 und 4 sind nicht geeignet für ältere Browser: Netscape 2.0, 3.0 und 4.x springen nicht zum Ziel, sondern zum Seitenanfang.

^ Zum Seitenanfang ^

"Spezialfälle"

"Leere" Anker

"Leere Anker", z.B. <a name="seitenanfang"></a>, sind grundsätzlich erlaubt. Offenbar hatten einige Steinzeit-Browser Bugs und sprangen solche Anker nicht an. (Netscape 2.0 hat damit jedenfalls keine Probleme.)

In der HTML 4.01-Specification des W3C steht:

"Note. User agents should be able to find anchors created by empty A elements, but some fail to do so. "

^ Zum Seitenanfang ^

Impliziter "top"-Anker

Durch Klick auf einen Hyperlink in der Form <a href="#top">...</a> kommt man in einigen Browsern auch zum Seitenanfang, ohne dass man explizit einen Anker mit dem Namen "top" gesetzt hätte. Der Anker "top" ist also für diese Browser implizit am Dokumentenanfang, sofern er nicht extra gesetzt wurde.

In SelfHTML steht dazu:

"Einige Browser, z.B. der Internet Explorer, kennen auch "intern reservierte" Ankernamen wie top. Wenn Sie also einen Verweis <a href="#top">...</a> notieren und kein Anker dieses Namens in der Datei existiert, springt der Browser beim Ausführen des Verweises an den Anfang der Seite."

Folgende Windows-Browser springen zum Seitenanfang, auch wenn kein "top"-Anker definiert ist: Opera 5.12, Opera 6.0, MS Internet Explorer 5.5, Mozilla 1.0.
Der Browser Netscape 6.0 dagegen springt so nicht zum Seitenanfang.
Testlink: top

^ Zum Seitenanfang ^

Kombination: Anker und Link in einem <A>-Element

In einem einzigen <A>-Element können gleichzeitig die Attribute HREF, NAME und ID vorkommen:

<a href="#seitenanfang" name="kombi" id="kombi">Kombi-Link</a>

Beispiel: Kombi-Link

Hier ist es natürlich sinnvoll, dass der Anker wie ein Link aussieht, weil er ja einer ist. Deshalb hat er kein spezielles class-Attribut

^ Zum Seitenanfang ^

Test-Links

Ziel (Anker) Beschreibung Browsertests
#top nicht definiert (implizit) OK
#seitenanfang definiert OK
#ziel1 NAME OK
#ziel2 NAME + ID OK
#ziel2a NAME + ID (+CLASS) OK
#ziel3 <A ID=".."> NN 2.0, 3.0, 4.x: Fehler
#ziel4 <H3 ID="..."> NN 2.0, 3.0, 4.x: Fehler
#leer leer, nur NAME OK
#kombi HREF + NAME + ID OK

Getestet unter Windows mit MS Internet Explorer 5.5, Netscape 2.0, 3.0, 4.75 und 6.1, Opera 5.12 und 6.0.

Empfehlung

Damit ein Anker auch in Netscape 4.x ohne Unterstreichung angezeigt wird, damit er in Mozilla 1.0 und Netscape 7 bei Mausberührung nicht plötzlich "aufleuchtet" und damit er gleichzeitig abwärtskompatibel ist zu den älteren Browsern (insbesondere Netscape 2 bis 4), empfehle ich für HTML 4.01 und XHTML 1.0 folgende Notation:

<a name=".." id=".." class="nuranker">Ankertext</a>

wobei im StyleSheet (nach den Deklarationen für Hyperlinks) festgelegt ist:

a.nuranker { text-decoration:none; color:#000000; background-color:#ffffff; }
(Farbwerte dem übrigen Text anpassen.)

Als Alternative kann man leere Anker nehmen; dann ist es nicht notwendig, bei jedem Anker noch extra die Klasse anzugeben:

<a name=".." id=".."></a>Ankertext

^ Zum Seitenanfang ^

Ressourcen

Thomas Lüthi, luthi@my-mail.ch, 21.12.2003