Devo criar âncoras HTML com 'nome' ou 'id'?


783

Quando alguém deseja se referir a alguma parte de uma página da web com o http://example.com/#foométodo " ", deve-se usar

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

ou

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

Ambos funcionam, mas são iguais ou possuem diferenças semânticas?


2
O link deve realmente ser http://example.com#foo(tão sem a / antes #)
Dana

71
Na verdade, http://example.com#fooe http://example.com/#foosão equivalentes conforme definido em um dos RFCs nos URIs.
Oliver

Respostas:


617

De acordo com a especificação do HTML 5, 5.9.8 Navegando para um identificador de fragmento :

Para documentos HTML (e o tipo MIME text / html), o seguinte modelo de processamento deve ser seguido para determinar qual é a parte indicada do documento.

  1. Analise a URL e deixe fragid o componente <fragment> da URL.
  2. Se fragid for a string vazia, a parte indicada do documento será a parte superior do documento.
  3. Se houver um elemento no DOM que tenha um ID exatamente igual a fragid, o primeiro desses elementos em ordem de árvore será a parte indicada do documento; pare o algoritmo aqui.
  4. Se houver um elemento no DOM que possua um atributo de nome cujo valor seja exatamente igual a fragid, o primeiro elemento desse tipo em ordem de árvore será a parte indicada do documento; pare o algoritmo aqui.
  5. Caso contrário, não há parte indicada do documento.

Então, ele procurará id="foo"e seguirá paraname="foo"

Editar: como apontado por @hsivonen, no HTML5 o aelemento não tem atributo de nome. No entanto, as regras acima ainda se aplicam a outros elementos nomeados.


76
Não há relação implícita entre esse algoritmo e validade. O <a name> é inválido no HTML5, conforme redigido atualmente.
hsivonen 27/01/09

13
Na verdade, não se aplica a outros "elementos nomeados". No que diz respeito aos atributos de nome, isso se aplica apenas a <a name>. No entanto, esse atributo não pode ser usado pelos autores. Ele só precisa ser respeitado pelos agentes do usuário para páginas HTML mais antigas.
1876 ​​Anne

19
@RafaelSoares <h1 id="foo">Foo Title</h1>funciona mesmo no IE6 e faz parte da especificação HTML 4.01
Aprillion

4
Ele não procurará por name = "foo", mas por <a name="foo">. Veja o link
Daniel Herzog

3
Em um documento HTML5 com um name="foo"e um id="foo"(independentemente de sua ordem dentro da página), Chrome e Firefox irá saltar para o id, mas IE (testado em 11) e Edge irá saltar para oname
Alvaro Montoro

183

Você não deve usar <h1><a name="foo"/>Foo Title</h1>nenhum tipo de código HTML text/html, porque a sintaxe do elemento vazio XML não é suportada text/html. No entanto, <h1><a name="foo">Foo Title</a></h1>está OK no HTML4. Não é válido no HTML5, conforme redigido atualmente.

<h1 id="foo">Foo Title</h1>está OK no HTML4 e no HTML5. Isso não funcionará no Netscape 4, mas você provavelmente usará uma dúzia de outros recursos que não funcionam no Netscape 4.


6
+1 por falar sobre o suporte ao navegador. O NS4 é o único que não suporta url # id => element.id?
Hashbrown

14
@Hashbrown Não foi possível encontrar uma resposta, então fiz alguns testes. Descobri que mesmo navegadores muito antigos tratam ids como nameâncoras em termos de fragmentos de URL e compatibilidade do :targetseletor CSS . Testado: Chrome 6, Firefox 1.5, IE6, Opera 8.02, Safari 3.1.2, Netscape 7.2, Lynx 2.24 e navegadores móveis: Android 2.2, Chrome 26, Dolphin 9.3, Firefox 19, IE10, Safari 4 e Opera Mini 5.1.
Stephen M. Harris

1
@smhmic, eu encontrei um. O navegador Off-By-One reconhece âncoras definidas por <a name="foo"/>, mas não reconhece âncoras definidas por <sometag id = "foo"> O OB1 foi atualizado pela última vez há 8 anos. Seu autor se vangloria de que "pode ​​ser o menor e mais rápido navegador da web com suporte completo a HTML 3.2". Ele alega suporte ao Win95 através do XP, mas funciona bem com o Win7 de 64 bits. Então, por que ter um dinossauro assim? Para testar, é claro, para garantir que meus sites não quebrem muito com navegadores antigos. Além disso, eu também carrego OB1 em uma unidade flash. É minúsculo, independente e imune a infecções.
Dave Burton

26
Lendo isso em 2016, é como .. Netscape 4?
ADTC 14/08/16

1
usar `<a name="algo" id="algo> </a> [ELEMENTO A Rolar PARA] é provavelmente o melhor porque é compatível e não estiliza o que quer que esteja no elemento para rolagem.
JustinCB

53

Eu tenho que dizer se você irá criar um link para essa área na página ... como page.html # foo e Foo Title não é um link que você deve usar:

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

Se você colocar uma <a>referência, seu título será influenciado por um <a>CSS específico em seu site. É apenas uma marcação extra e você não precisa dela. Eu recomendo colocar um ID no título, não só é melhor formado, como também permitirá que você endereça esse objeto em Javascript ou CSS.


Não apenas isso, mas tenho combatido um erro estranho no display: nada estava aparecendo no IE. Na falta de idéia de um ponto de ataque, joguei-o em um validador que sinalizou as entradas <a name="foo">, então as alterei - e agora a exibição: nenhuma está funcionando bem.
Loren Pechtel 02/07/2015

Isso é mais do que suficiente, nenhuma tag âncora é necessária para o efeito.
Wallace Sidhrée 28/08/2015

28

A Wikipedia faz uso pesado desse recurso assim:

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

E a Wikipedia está funcionando para todos, então eu me sentiria seguro em seguir este formulário.

Além disso, não se esqueça, você pode usar isso não apenas com extensões, mas também com divs ou mesmo células de tabela e, em seguida, terá acesso à pseudo-classe: target no elemento. Cuidado para não alterar a largura, como em texto em negrito, porque isso move o conteúdo, o que é perturbador.

Âncoras nomeadas - meu voto é para evitar:

  • "Nomes e IDs estão no mesmo espaço para nome ..." - Dois atributos com o mesmo espaço para nome são loucos. Vamos apenas dizer preterido.
  • "Ancora elementos sem o atributo href" - Mais uma vez, a natureza de um elemento (hiperlink ou não) é definida por ter um atributo ?! Louco duplo. O senso comum diz para evitá-lo completamente.
  • Se você estilizar uma âncora sem uma pseudo-classe, o estilo será aplicado a cada uma. No CSS3, você pode contornar isso com seletores de atributos (ou o mesmo estilo para cada pseudoclasse), mas ainda assim é uma solução alternativa. Isso geralmente não aparece porque você escolhe cores por pseudo-classe, e o sublinhado presente por padrão faz sentido remover, o que faz com que seja o mesmo que outro texto. Mas você decide tornar seus links em negrito, isso causará problemas.
  • O Netscape 4 pode não suportar o recurso de identificação, mas ainda assim um atributo desconhecido não causará nenhum problema. Isso é o que chamou de compatibilidade para mim.

1
Sugira um marcador de edição 3 de 4: se você a {color:red}usar um estilo, ele colorirá os links <a href> E fragmentos <a name>. Você pode contornar isso com pseudo classes a:link {color:red]}ou selectores de atributoa:not([href]) {color:red;}
Bob Stein

Você está certo, mas para mim a bala 3 diz exatamente isso. Talvez seja o meu inglês ...
Zoltán Morvai 11/11/2013

Finalmente, entendi seu argumento: "Se você estilizar uma âncora sem uma pseudo-classe, o estilo se aplica a cada uma". Ambíguo: Você pode pensar em "cada pseudoclasse". Direita. Mas eu estava pensando em "cada caso" de usar uma âncora, o que significa nomeado e refinado. Esclarecido. :) Não há necessidade de editar após o seu comentário, mas posso, se você insistir. Mas também ainda não propenso a acontecer com cores, como você normalmente pretendem mantê-los diferente, mas ainda mesmo caso com font-weight ...
Zoltán Morvai

gostei de ler seus comentários @ ZoltánMorvai. "double crazy" e "netscape 4" doubleplusgood.
Randy L

1
Dois atributos com o mesmo espaço para nome são loucos - na verdade não. Ao criar conteúdo gerado pelo usuário, é muito útil poder especificar algo como um link de fragmento <a name="heading1"></a> ... document.html#heading1sem definir o ID, porque o ID pode colidir com outro ID na página. É uma pena que eles não tenham colocado o nameatributo em HTML5.
Jez

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

é o que deve ser usado. Não use uma âncora, a menos que queira um link.


Idêntico à resposta de Tim Knight, publicado meio ano antes desta. -1
Luc

14

Atenção para usuários de JavaScript: todos os IDs se tornam variáveis ​​globais na janela .

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

Acabou de criar o JS global:

window.foo

O valor de window.fooserá o HTMLElementpara o h1.

A menos que você possa garantir que todos os valores usados ​​nos idatributos sejam seguros, você pode preferir seguir name:

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

12
A boa notícia é que você não pode substituir as funções definidas em window. Por exemplo, <div id="open"></div>não substituirá a função window.open.
Flimm

9

Não há diferença semântica; a tendência nos padrões é mais para o uso do idque para name. No entanto, existem diferenças que podem levar a pessoa a preferir nameem alguns casos. A especificação HTML 4.01 oferece as seguintes dicas :

Use idou name? Os autores devem considerar os seguintes problemas ao decidir usar idou namepara um nome de âncora:

  • O atributo id pode atuar como mais do que apenas um nome de âncora (por exemplo, seletor de folha de estilo, identificador de processamento etc.).
  • Alguns agentes de usuário mais antigos não suportam âncoras criadas com o atributo id.
  • O atributo name permite nomes de âncoras mais ricos (com entidades).

14
Para ser claro, quando eles dizem "agentes de usuários mais antigos", eles significam realmente agentes de usuários antigos. Eu não me preocuparia com isso.
Eli

1
O HTML5 também permite IDs "ricos". Alguém tem um número de versão de navegadores com uma participação de mercado maior que 0,1% que não pode lidar com fragmentos ancorados em ID? - Ou o dinossauro Netscape 4.7 é realmente o mais difundido?
Robert Siemer

7
FWIW, não consegui que as idâncoras funcionassem no Safari para iOS 5, por isso não são apenas os navegadores que já eram "realmente antigos" em 2009. Eu tive que adicionarname s para fazer meu site funcionar corretamente no iPad. Isso pode ter sido corrigido agora, não tenho dispositivos iOS 6 para verificar.
precisa

@DanielSaner realmente? então o pt.wikipedia.org/wiki/IPad#Applications não funciona no seu iPad?
Aprillion

1
@DanielSaner Usei simuladores para testar o Mobile Safari 5.02 e 5.1 e o Android Browser 2.2 e 2.3, e as idâncoras parecem funcionar universalmente. Se este exemplo simples não funcionar no seu celular, eu verificaria as configurações de acessibilidade do dispositivo. (@deathApril O site móvel da Wikipedia possui Javascript que efetivamente faz com que o fragmento de URL seja ignorado.)
Stephen M. Harris

9

O método de ID não funcionará em navegadores antigos, o método de nome da âncora será preterido nas versões HTML mais recentes ... Eu usaria o id.


2
Você tem uma fonte para essas reivindicações? Não me interpretem mal; Geralmente só estou interessado.
27909 Henrik Paul

11
Isso não esclarece que "não funcionará em navegadores mais antigos". - Quais navegadores são esses, além do Netscape 4 ??
Robert Siemer

3
Eu tentei usar o id em uma div, e ele funciona mesmo no IE 7. Não foi possível testar no IE 6 embora .. mas quem usa IE 6 nos dias de hoje ...
Gilly

@deathApril em certos casos (depende do HASLAYOUT), é buggy.
Knu

@RobertSiemer Funciona quase universalmente - veja meu comentário sob esta resposta .
Stephen M. Harris

3

Eu tenho uma página da Web que consiste em um número de contêineres div empilhados verticalmente, idênticos em formato e diferindo apenas no número de série. Eu queria ocultar o nome âncora na parte superior de cada div. Portanto, a solução mais econômica foi incluir a âncora como um ID na tag div de abertura, ou seja,

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

2

O segundo exemplo atribui um ID exclusivo ao elemento em questão. Este elemento pode ser manipulado ou acessado usando DHTML.

O primeiro, por outro lado, define um local nomeado dentro do documento, semelhante a um marcador. Anexado a uma "âncora", faz todo o sentido.


2

Apenas uma observação sobre a marcação O formulário de marcação nas versões anteriores do HTML forneceu um ponto de ancoragem. As formas de marcação em HTML5 usando o atributo id, embora sejam equivalentes, requerem um elemento para identificar, quase todo que normalmente se espera que contenha conteúdo.

Um span ou div vazio pode ser usado, por exemplo, mas esse uso parece e cheira degenerado.

Um pensamento é usar o elemento wbr para esse fim. O wbr possui um modelo de conteúdo vazio e simplesmente declara que é possível uma quebra de linha; ainda é um uso ligeiramente gratuito de uma tag de marcação, mas muito menos do que divisões de documentos gratuitas ou extensões de texto vazias.


Este é um bom ponto. Mais informações em wbr: w3.org/TR/html-markup/wbr.html Use em <wbr id="foo" />vez de<a name="foo"></a>
Luke

2

No html 5, o id=""atributo define um identificador exclusivo para um elemento, que também é uma âncora para um link de fragmento. Nos padrões html anteriores, o name=""atributo do <a>elemento define uma âncora para um link de fragmento. Eu recomendo algo como: como o
<a name="foo" id="foo"></a><h1>Foo Title</h1>
suporte ao id=""atributo é um pouco irregular (mesmo que os lançamentos mais recentes de todos os principais navegadores o suportem, os lançamentos que não têm mais do que alguns anos de idade [E é melhor não quebrar algo se não houver uma boa razão para]). É compatível e não estiliza o que está no elemento vinculado, pois o fechamento ainda está fora do elemento, mas ainda é válido em todos os padrões atuais.

Certifique-se de que os atributos name=""e id=""do <a>elemento sejam os mesmos.


2
Nem tudo o que usa HTML é um navegador. Estou usando uma biblioteca Java que exibe informações em uma janela usando HTML. Este é o único método que funcionou. É o nameatributo em uma tag de âncora que foi necessário; colocar atributos em um hNou spannão funcionou.
Mars

1

Que tal usar o atributo name para navegadores antigos e o atributo id para os novos navegadores. Ambas as opções serão usadas e o método de fallback será implementado por padrão !!!


-3

Todo o conceito de "âncora nomeada" usa o atributo name, por definição. Você deve continuar usando o nome, mas o atributo ID pode ser útil para algumas situações em javascript.

Como nos comentários, você sempre pode usar os dois para proteger suas apostas.


Ao usar os dois, os ID: se os nomes são globalmente exclusivos? como em, posso usar a mesma sequência de caracteres tanto o id quanto o nome?
27909 Henrik Paul

Você pode, mas algumas pessoas pensam que é uma má prática.
27411 Alex Fort

9
De acordo com a especificação HTML, se ambos estiverem presentes, o nome e o ID devem ser idênticos. Também diz que nomes e IDs estão no mesmo espaço para nome. O serviço de validador de HTML não verifica esses itens, e duvido que os navegadores se importem, mas eles parecem boas diretrizes a serem seguidas.
31511 erickson

3
Realidade redefinida! <um nome ... estava doente desde o início, e o estilo do link CSS o deixa ainda mais doente.
Robert Siemer 29/07
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.