Devo creare ancore HTML con 'nome' o 'id'?


784

Quando si desidera fare riferimento a una parte di una pagina Web con il http://example.com/#foometodo " ", si dovrebbe usare

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

o

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

Entrambi funzionano, ma sono uguali o hanno differenze semantiche?


2
Il link dovrebbe effettivamente essere http://example.com#foo(quindi senza / prima del #)
Dana

71
In realtà, http://example.com#fooe http://example.com/#foosono equivalenti come definiti in uno degli RFC sugli URI.
Oliver,

Risposte:


617

Secondo la specifica HTML 5, 5.9.8 Navigazione verso un identificatore di frammento :

Per i documenti HTML (e il tipo MIME text / html), è necessario seguire il seguente modello di elaborazione per determinare qual è la parte indicata del documento.

  1. Analizza l'URL e lascia che fragid sia il componente <fragment> dell'URL.
  2. Se fragid è la stringa vuota, la parte indicata del documento è la parte superiore del documento.
  3. Se nel DOM è presente un elemento che ha un ID esattamente uguale a fragile, il primo di questi elementi in ordine di struttura è la parte indicata del documento; ferma l'algoritmo qui.
  4. Se nel DOM è presente un elemento con un attributo name il cui valore è esattamente uguale a fragido, il primo di questi elementi in ordine di struttura è la parte indicata del documento; ferma l'algoritmo qui.
  5. Altrimenti, non esiste una parte indicata del documento.

Quindi, cercherà id="foo"e quindi seguiràname="foo"

Modifica: come sottolineato da @hsivonen, in HTML5 l' aelemento non ha alcun attributo name. Tuttavia, le regole precedenti si applicano ancora ad altri elementi denominati.


77
Non esiste alcuna relazione implicita tra tale algoritmo e validità. <a name> non è valido in HTML5 come attualmente redatto.
hsivonen,

13
In realtà non si applica ad altri "elementi nominati". Per quanto riguarda gli attributi del nome, si applica solo a <a nome>. Tuttavia, tale attributo non può essere utilizzato dagli autori. Deve solo essere onorato dagli interpreti per le pagine HTML più vecchie.
Anne,

19
@RafaelSoares <h1 id="foo">Foo Title</h1>funziona anche in IE6 e fa parte della specifica HTML 4.01
Aprillion

4
Non cercherà name = "foo" ma <a name="foo">. Vedi link
Daniel Herzog

3
In un documento HTML5 con a name="foo"e a id="foo"(indipendentemente dal loro ordine all'interno della pagina), Chrome e Firefox passeranno al id, ma IE (testato in 11) e Edge passeranno alname
Alvaro Montoro il

183

Non dovresti usarlo <h1><a name="foo"/>Foo Title</h1>in nessun tipo di HTML servito come text/html, perché la sintassi dell'elemento vuoto XML non è supportata in text/html. Tuttavia, <h1><a name="foo">Foo Title</a></h1>va bene in HTML4. Non è valido in HTML5 come attualmente redatto.

<h1 id="foo">Foo Title</h1>è OK in HTML4 e HTML5. Questo non funzionerà in Netscape 4, ma probabilmente utilizzerai una dozzina di altre funzionalità che non funzionano in Netscape 4.


6
+1 per parlare del supporto del browser. NS4 è l'unico che non supporta url # id => element.id?
Hashbrown,

14
@Hashbrown Impossibile trovare una risposta, quindi ho fatto alcuni test. Ho scoperto che anche i browser molto vecchi trattano gli stessi idcome nameancore in termini di frammenti di URL e compatibilità del :targetselettore CSS . Testato: Chrome 6, Firefox 1.5, IE6, Opera 8.02, Safari 3.1.2, Netscape 7.2, Lynx 2.24 e browser mobili: Android 2.2, Chrome 26, Dolphin 9.3, Firefox 19, IE10, Safari 4 e Opera Mini 5.1.
Stephen M. Harris,

1
@smhmic, ne ho trovato uno. Il browser Web Off-By-One riconosce gli ancoraggi definiti tramite <a name="foo"/> ma non riconosce gli ancoraggi definiti tramite <sometag id = "foo"> OB1 è stato aggiornato l'ultima volta> 8 anni fa. Il suo autore si vanta che "potrebbe essere il browser più piccolo e veloce del mondo con supporto HTML 3.2 completo". Dichiara il supporto per Win95 a XP, ma funziona benissimo con Win7 a 64 bit. Quindi, perché un tale dinosauro? Per i test, ovviamente, per assicurarsi che i miei siti non si rompano troppo male con browser davvero antichi. Inoltre, porto anche OB1 su un'unità flash. È piccolo, autonomo e immune da infezioni.
Dave Burton,

26
Leggendo questo nel 2016 sia come .. Netscape 4?
ADTC

1
usare `<a name="something" id="something> </a> [ELEMENTO DA SCORRIRE] è probabilmente il migliore perché è compatibile, e non ha lo stile di ciò che è nell'elemento su cui scorrere.
JustinCB

53

Devo dire se stai per collegarti a quell'area nella pagina ... come page.html # foo e Foo Title non è un link che dovresti usare:

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

Se invece metti un <a>riferimento attorno ad esso, il titolo sarà influenzato da un <a>CSS specifico all'interno del tuo sito. È solo un markup extra e non dovresti averne bisogno. Consiglio vivamente di inserire un ID nel titolo, non solo è meglio formato, ma ti permetterà di indirizzare quell'oggetto in Javascript o CSS.


Non solo, ma ho combattuto uno strano errore in cui display: nessuna roba si stava mostrando in IE. Non avendo idea di un punto di attacco, l'ho lanciato su un validatore che ha contrassegnato le voci <a name="foo">, quindi le ho cambiate - e ora il display: nessuna funziona bene.
Loren Pechtel,

Questo è più che sufficiente, nessun tag di ancoraggio è necessario per il bene dell'effetto.
Wallace Sidhrée,

28

Wikipedia fa un uso intenso di questa funzione in questo modo:

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

E Wikipedia funziona per tutti, quindi mi sentirei al sicuro con questo modulo.

Inoltre, non dimenticare che puoi usarlo non solo con span ma con div o persino celle di tabella e quindi hai accesso alla pseudo-classe: target sull'elemento. Fai solo attenzione a non modificare la larghezza, come nel caso del testo in grassetto, perché ciò sposta i contenuti, il che è inquietante.

Ancoraggi nominati - il mio voto è di evitare:

  • "Nomi e ID sono nello stesso spazio dei nomi ..." - Due attributi con lo stesso spazio dei nomi sono semplicemente pazzi. Diciamo solo deprecato già.
  • "Ancora elementi senza href atribute" - Ancora una volta, la natura di un elemento (collegamento ipertestuale o no) è definita dall'avere un attributo ?! Doppio pazzo. Il buon senso dice di evitarlo del tutto.
  • Se hai mai disegnato un'ancora senza una pseudo-classe, lo stile si applica a ciascuno. In CSS3 puoi aggirare questo problema con i selettori di attributo (o lo stesso stile per ogni pseudoclasse), ma è comunque una soluzione alternativa. Questo di solito non si presenta perché si scelgono i colori per pseudo-classe e la sottolineatura presente di default ha senso rimuoverla, il che lo rende uguale ad altri testi. Ma hai mai deciso di rendere i tuoi collegamenti in grassetto, causerà problemi.
  • Netscape 4 potrebbe non supportare la funzione ID, ma comunque un attributo sconosciuto non causerà alcun problema. Questo è ciò che ha chiamato la compatibilità per me.

1
Suggerisci modifica punto 3 di 4: se mai lo stile a {color:red}, colora sia i tuoi collegamenti <a href> che i tuoi frammenti <a name>. Puoi aggirare questo con le pseudo-classia:link {color:red]} o selettori di attributoa:not([href]) {color:red;}
Bob Stein il

Hai ragione, ma per me il proiettile 3 dice esattamente questo. Potrebbe essere il mio inglese però ...
Zoltán Morvai,

Infine, ho il tuo punto: "Se hai mai disegnato un'ancora senza una pseudo-classe, lo stile si applica a ciascuno". Ambiguo: potresti pensare "ogni pseudoclasse". Giusto. Ma stavo pensando a "ogni caso" di usare un'ancora, il che significa nome e href-ed. Chiarito. :) Non è necessario modificarlo dopo il tuo commento, ma posso insistere. Inoltre, non è ancora possibile che accada con i colori, poiché di solito si intende mantenerli diversi, ma sempre lo stesso caso con il peso del carattere ...
Zoltán Morvai

mi è piaciuto leggere i tuoi commenti @ ZoltánMorvai. "double crazy" e "netscape 4" doubleplusgood.
Randy L,

1
Due attributi con lo stesso spazio dei nomi sono pazzi, non proprio. Quando si eseguono contenuti generati dall'utente, è molto utile poter specificare qualcosa come un collegamento frammento <a name="heading1"></a> ... document.html#heading1senza impostare l'ID, poiché l'ID potrebbe scontrarsi con un altro ID sulla pagina. È un peccato che non abbiano inserito l' nameattributo in HTML5.
Jez

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

è ciò che dovrebbe essere usato. Non utilizzare un'ancora a meno che non si desideri un collegamento.


Identico alla risposta di Tim Knight, pubblicata un anno e mezzo prima di questa. -1
Luc,

14

Per gli utenti JavaScript: tutti gli ID diventano variabili globali sotto la finestra .

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

Ho appena creato il JS globale:

window.foo

Il valore di window.foosarà il HTMLElementper h1.

A meno che non sia possibile garantire la sicurezza di tutti i valori utilizzati negli idattributi, è preferibile attenersi a name:

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

12
La buona notizia è che non è possibile sovrascrivere le funzioni definite in window. Ad esempio, <div id="open"></div>non sovrascriverà la funzione window.open.
Flimm,

9

Non c'è differenza semantica; la tendenza negli standard è verso l'uso idpiuttosto che name. Tuttavia, ci sono differenze che possono portare a preferire namein alcuni casi. La specifica HTML 4.01 offre i seguenti suggerimenti :

Usa idoname ? Gli autori dovrebbero considerare i seguenti problemi quando decidono se usare ido nameper un nome di ancoraggio:

  • L'attributo id può fungere da più di un semplice nome di ancoraggio (ad es. Selettore di fogli di stile, identificatore di elaborazione, ecc.).
  • Alcuni agenti utente meno recenti non supportano gli ancoraggi creati con l'attributo id.
  • L'attributo name consente nomi di ancoraggio più ricchi (con entità).

14
Per essere chiari, quando dicono "user agent più vecchi" intendono REALMENTE agenti user vecchi. Non me ne preoccuperei.
Eli,

1
HTML5 consente anche ID "ricchi". Qualcuno ha un numero di versione di browser con una quota di mercato superiore allo 0,1% che non è in grado di gestire frammenti ancorati all'ID? - O il dinosauro Netscape 4.7 è in realtà il più diffuso?
Robert Siemer,

7
FWIW, non sono riuscito a far funzionare le idancore in Safari per iOS 5, quindi non sono solo i browser che erano "molto vecchi" nel '09. Ho dovuto aggiungere names per far funzionare correttamente il mio sito sull'iPad. Questo potrebbe essere stato risolto ormai, non possiedo alcun dispositivo iOS 6 da controllare.
Daniel Saner,

@DanielSaner davvero? quindi en.wikipedia.org/wiki/IPad#Applications non funziona sul tuo iPad?
Aprillion

1
@DanielSaner Ho usato i simulatori per testare Mobile Safari 5.02 e 5.1 e Android Browser 2.2 e 2.3 e le idancore sembrano funzionare universalmente. Se questo semplice esempio non funziona sul tuo cellulare, verificherei le impostazioni di accessibilità del dispositivo. (@deathApril Il sito mobile Wikipedia ha Javascript che fa sì che il frammento URL venga effettivamente ignorato.)
Stephen M. Harris,

9

Il metodo ID non funzionerà su browser meno recenti, il metodo del nome di ancoraggio sarà deprecato nelle versioni HTML più recenti ... Andrei con id.


2
Hai una fonte per tali affermazioni? Non fraintendetemi; Sono generalmente interessato.
Henrik Paul,

11
Che non fa luce su "non funzionerà con i browser più vecchi". - Quali browser sono questi, a parte Netscape 4 ??
Robert Siemer,

3
Ho provato a usare l'id su un div, e funziona anche in IE 7. Tuttavia non ho potuto testare in IE 6 .. ma chi usa IE 6 al giorno d'oggi ...
Gilly

@deathApril in alcuni casi (dipende da HASLAYOUT) è difettoso.
Knu,

@RobertSiemer Funziona in modo quasi universale - vedi il mio commento sotto questa risposta .
Stephen M. Harris,

3

Ho una pagina web composta da un numero di contenitori div impilati verticalmente, identici nel formato e diversi solo per il numero di serie. Volevo nascondere il nome anchor nella parte superiore di ogni div, quindi la soluzione più economica è stata quella di includere l'ancoraggio come ID all'interno del tag div di apertura, ovvero,

<div id="[serial number]" class="topic_wrapper">

2

Il secondo esempio assegna un ID univoco all'elemento in questione. Questo elemento può quindi essere manipolato o accessibile tramite DHTML.

Il primo, d'altra parte, imposta una posizione con nome all'interno del documento, simile a un segnalibro. Attaccato a un "ancoraggio", ha perfettamente senso.


2

Solo un'osservazione sul markup Il modulo markup nelle versioni precedenti di HTML ha fornito un punto di ancoraggio. I moduli di markup in HTML5 che utilizzano l'attributo id, sebbene per lo più equivalenti, richiedono un elemento per l'identificazione, che quasi tutti dovrebbero contenere contenuto.

Un intervallo vuoto o div potrebbe essere utilizzato, ad esempio, ma questo utilizzo sembra e ha un odore degenerato.

Un pensiero è quello di utilizzare l'elemento wbr per questo scopo. Il wbr ha un modello di contenuto vuoto e dichiara semplicemente che è possibile un'interruzione di riga; questo è ancora un uso leggermente gratuito di un tag di markup, ma molto meno delle divisioni di documenti gratuiti o di intervalli di testo vuoti.


È un buon punto. Maggiori informazioni su wbr: w3.org/TR/html-markup/wbr.html Utilizza <wbr id="foo" />anziché<a name="foo"></a>
Luca

2

In HTML 5, l' id=""attributo definisce un identificatore univoco per un elemento, che è anche un'ancora per un collegamento di frammento. Nei precedenti standard html, l' name=""attributo <a>dell'elemento definisce un ancoraggio per un collegamento frammento. Raccomando qualcosa del tipo:
<a name="foo" id="foo"></a><h1>Foo Title</h1>
Perché il supporto perid="" attributo è un po 'discutibile (anche se le ultime versioni di tutti i principali browser lo supportano, le versioni che non hanno più di qualche anno [Ed è meglio non rompere qualcosa se non c'è una buona ragione per]). È compatibile e non si adatta a ciò che è nell'elemento link'd, poiché la chiusura </a> è ancora esterna all'elemento, ma è ancora valida in tutti gli standard attuali.

Assicurati che gli attributi name=""e dell'elemento siano gli stessi. id=""<a>


2
Non tutto ciò che utilizza HTML è un browser. Sto usando una libreria Java che visualizza informazioni in una finestra usando HTML. Questo è l'unico metodo che ha funzionato. È l' nameattributo su un tag anchor che era richiesto; posizionando gli attributi su hNo spannon ha funzionato.
Marte,

1

Che ne dici di usare l'attributo name per i vecchi browser e l'attributo id per i nuovi browser. Verranno utilizzate entrambe le opzioni e il metodo di fallback verrà implementato per impostazione predefinita !!!


-3

L'intero concetto di "ancoraggio denominato" utilizza l'attributo name, per definizione. Dovresti limitarti a usare il nome, ma l'attributo ID potrebbe essere utile per alcune situazioni javascript.

Come nei commenti, puoi sempre utilizzare entrambi per coprire le tue scommesse.


Quando si utilizzano entrambi, id: se nomi sono globalmente univoci? come in, posso usare la stessa stringa dell'id e del nome?
Henrik Paul,

Puoi, ma alcune persone pensano che sia una cattiva pratica.
Alex Fort,

9
Secondo la specifica HTML, se entrambi sono presenti, nome e ID dovrebbero essere identici. Dice anche che nomi e ID sono nello stesso spazio dei nomi. Il servizio di validazione HTML non li controlla, e dubito che i browser si preoccupino, ma sembrano comunque delle buone linee guida da seguire.
Erickson,

3
La realtà ridefinita! <un nome ... era ammalato fin dall'inizio, e lo stile dei collegamenti CSS lo rende ancora più malato.
Robert Siemer,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.