845 Stimmen

Soll ich HTML-Anker mit "name" oder "id" erstellen?

Wenn man sich auf einen Teil einer Webseite mit dem " http://example.com/#foo " Methode, sollte man die

<h1><a name="foo"/>Foo Title</h1>

o

<h1 id="foo">Foo Title</h1>

Beide funktionieren, aber sind sie gleichwertig, oder gibt es semantische Unterschiede?

2 Stimmen

Der Link sollte eigentlich lauten http://example.com#foo (also ohne das / vor #)

87 Stimmen

Eigentlich, http://example.com#foo y http://example.com/#foo sind gleichwertig, wie in einem der RFCs über URIs definiert.

1 Stimmen

Bitte überprüfen Sie diese Antwort: stackoverflow.com/a/69869066/2457251

665voto

Greg Punkte 306033

Gemäß der HTML 5-Spezifikation, 5.9.8 Navigieren zu einem Fragment-Identifikator :

Für HTML-Dokumente (und den MIME-Typ text/html) muss das folgende Verarbeitungsmodell befolgt werden, um festzustellen, was der angegebene Teil des Dokuments ist.

  1. Parsen Sie die URL, und lassen Sie fragid die <fragment>-Komponente der URL sein.
  2. Ist fragid eine leere Zeichenkette, so ist der angegebene Teil des Dokuments der oberste Teil des Dokuments.
  3. Wenn es im DOM ein Element gibt, dessen ID genau mit fragid übereinstimmt, dann ist das erste solche Element in der Baumreihenfolge der angegebene Teil des Dokuments; der Algorithmus wird hier angehalten.
  4. Wenn es eine a Element im DOM, das ein name-Attribut hat, dessen Wert genau gleich fragid ist, dann ist das erste solche Element in der Baumreihenfolge der angegebene Teil des Dokuments; der Algorithmus wird hier gestoppt.
  5. Andernfalls gibt es keinen angegebenen Teil des Dokuments.

Es wird also gesucht nach id="foo" und dann weiter zu name="foo"

Edit: Wie von @hsivonen bemerkt, ist in HTML5 die a Element hat kein Attribut name. Die oben genannten Regeln gelten jedoch auch für andere benannte Elemente.

81 Stimmen

Es gibt keine implizite Beziehung zwischen diesem Algorithmus und der Gültigkeit. Der <a name> ist in HTML5 in der derzeitigen Fassung ungültig.

14 Stimmen

Sie gilt nicht für andere "benannte Elemente". Was die Namensattribute anbelangt, so gilt es nur für <a name>. Allerdings darf dieses Attribut von den Autoren nicht verwendet werden. Es muss nur von den Benutzeragenten für ältere HTML-Seiten beachtet werden.

0 Stimmen

Weiß jemand, wie die aktuelle Browserunterstützung für diese Spezifikation aussieht, da sie immer noch nur ein Entwurf ist?

196voto

hsivonen Punkte 7730

Sie sollten nicht verwenden <h1><a name="foo"/>Foo Title</h1> in jeder beliebigen HTML-Variante, die als text/html weil die XML-Syntax für leere Elemente nicht unterstützt wird in text/html . Allerdings, <h1><a name="foo">Foo Title</a></h1> ist in HTML4 in Ordnung. In der derzeitigen Fassung von HTML5 ist sie nicht gültig.

<h1 id="foo">Foo Title</h1> ist sowohl in HTML4 als auch in HTML5 OK. Dies wird in Netscape 4 nicht funktionieren, aber Sie werden wahrscheinlich ein Dutzend anderer Funktionen verwenden, die in Netscape 4 nicht funktionieren.

8 Stimmen

+1 für das Gespräch über die Browserunterstützung. Ist NS4 der einzige, der url#id => element.id nicht unterstützt?

17 Stimmen

@Hashbrown Ich konnte keine Antwort finden, also habe ich einige Tests durchgeführt. Ich habe festgestellt, dass sogar sehr alte Browser die id ist genau wie name Ankern in Form von URL-Fragmenten und Kompatibilität des CSS :target Selektor. Getestet: Chrome 6, Firefox 1.5, IE6, Opera 8.02, Safari 3.1.2, Netscape 7.2, Lynx 2.24, und mobile Browser: Android 2.2, Chrome 26, Dolphin 9.3, Firefox 19, IE10, Safari 4 und Opera Mini 5.1.

1 Stimmen

@smhmic, ich habe einen gefunden. Der Off-By-One-Webbrowser erkennt Anker, die über <a name="foo"/> definiert sind, erkennt aber keine Anker, die über <sometag id="foo"> OB1 definiert sind, wurde zuletzt vor >8 Jahren aktualisiert. Sein Autor rühmt sich, dass er "der kleinste und schnellste Webbrowser der Welt mit voller HTML 3.2-Unterstützung" ist. Er behauptet, Win95 bis XP zu unterstützen, aber er funktioniert auch mit dem 64-Bit-Win7. Warum also ein solcher Dinosaurier? Zum Testen natürlich, um sicherzustellen, dass meine Websites mit wirklich antiken Browsern nicht zu sehr kaputt gehen. Außerdem habe ich OB1 auch auf einem Flash-Laufwerk. Er ist winzig, in sich geschlossen und immun gegen Infektionen.

56voto

Tim Knight Punkte 8304

Ich muss sagen, wenn Sie zu diesem Bereich auf der Seite verlinken werden... wie page.html#foo und Foo Title ist kein Link, den Sie verwenden sollten:

<h1 id="foo">Foo Title</h1>

Wenn Sie stattdessen eine <a> Ihre Überschrift wird durch einen Verweis darauf beeinflusst <a> spezifische CSS innerhalb Ihrer Website. Es ist nur zusätzliches Markup, und Sie sollten es nicht brauchen. Ich würde dringend empfehlen, eine id auf die Überschrift, nicht nur ist es besser geformt, aber es wird Ihnen erlauben, entweder Adresse, dass Objekt in Javascript oder CSS.

0 Stimmen

Nicht nur das, aber ich habe mit einem seltsamen Fehler gekämpft, wo display: none Zeug wurde in IE angezeigt. In Ermangelung einer Idee für einen Angriffspunkt habe ich es auf einen Validator geworfen, der die <a name="foo">-Einträge markiert hat, also habe ich sie geändert - und jetzt funktioniert display: none gut.

0 Stimmen

Das ist mehr als genug, ein Anker-Tag wird nicht benötigt, um den Effekt zu verstärken.

30voto

Zoltán Morvai Punkte 521

Wikipedia macht von dieser Funktion regen Gebrauch:

<a href="#History">[...]</a>
<span class="mw-headline" id="History">History</span>

Und Wikipedia funktioniert für alle, also würde ich mich sicher fühlen, bei dieser Form zu bleiben.

Vergessen Sie auch nicht, dass Sie dies nicht nur mit Spans, sondern auch mit Divs oder sogar Tabellenzellen verwenden können, und dann haben Sie Zugriff auf die :target-Pseudoklasse des Elements. Passen Sie nur auf, dass Sie nicht die Breite ändern, wie bei fettgedrucktem Text, denn das verschiebt den Inhalt, was störend ist.

Benannte Anker - ich stimme dafür, sie zu vermeiden:

  • "Namen und ids liegen im gleichen Namensraum..." - Zwei Attribute mit demselben Namensraum sind einfach verrückt. Sagen wir einfach, dass es bereits veraltet ist.
  • "Verankert Elemente ohne href-Attribut" - Wieder einmal wird die Art eines Elements (Hyperlink oder nicht) durch ein Attribut definiert?! Doppelt verrückt. Der gesunde Menschenverstand sagt, dass man es ganz vermeiden sollte.
  • Wenn Sie einen Anker ohne Pseudoklasse formatieren, gilt die Formatierung für jeden Anker. In CSS3 können Sie dies mit Attributselektoren (oder gleiches Styling für jede Pseudoklasse) umgehen, aber es ist immer noch ein Workaround. Das Problem tritt normalerweise nicht auf, weil man die Farben für jede Pseudoklasse auswählt, und da die Unterstreichung standardmäßig vorhanden ist, macht es nur Sinn, sie zu entfernen, was sie dem anderen Text gleich macht. Aber wenn Sie sich jemals entscheiden, Ihre Links fett zu machen, wird das zu Problemen führen.
  • Netscape 4 unterstützt zwar die id-Funktion nicht, aber ein unbekanntes Attribut wird trotzdem keine Probleme verursachen. Das ist es, was für mich Kompatibilität bedeutet.

1 Stimmen

Änderungsvorschlag Aufzählungspunkt 3 von 4: Wenn Sie jemals einen Stil a {color:red} färbt es sowohl Ihre <a href>-Links als auch Ihre <a name>-Fragmente. Sie können dies mit Pseudoklassen umgehen a:link {color:red]} oder Attributselektoren a:not([href]) {color:red;}

0 Stimmen

Sie haben recht, aber für mich sagt Punkt 3 genau das aus. Könnte aber an meinem Englisch liegen...

0 Stimmen

Schließlich habe ich Ihren Punkt: "Wenn Sie jemals einen Anker ohne eine Pseudoklasse formatieren, gilt die Formatierung für jeden." Zweideutig: Man könnte meinen "jede Pseudoklasse". Richtig. Aber ich dachte an "jeden Fall" der Verwendung eines Ankers, d.h. benannt und href-ed. Geklärt :) Ich muss nicht nach deinem Kommentar editieren, aber ich kann, wenn du darauf bestehst. Aber auch es immer noch nicht anfällig für mit Farben passieren, wie Sie in der Regel beabsichtigen, halten sie anders, aber immer noch den gleichen Fall mit font-weight...

15voto

Andrew Marsh Punkte 1914
<h1 id="foo">Foo Title</h1>

sollte verwendet werden. Verwenden Sie keinen Anker, es sei denn, Sie wollen einen Link.

0 Stimmen

Identisch mit der Antwort von Tim Knight, die ein halbes Jahr vor dieser Antwort veröffentlicht wurde. -1

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X