Должен ли я создавать HTML-якоря с именем или идентификатором?

StackOverflow https://stackoverflow.com/questions/484719

Вопрос

Когда кто-то хочет сослаться на какую-то часть веб-страницы с помощью «http://example.com/#foo"метод, следует ли использовать

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

или

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

Они оба работают, но равны ли они или у них есть смысловые различия?

Это было полезно?

Решение

Согласно спецификации HTML 5, 5.9.8 Переход к идентификатору фрагмента:

Для документов HTML (и типа MIME text/html) необходимо использовать следующую модель обработки, чтобы определить, что представляет собой указанная часть документа.

  1. Проанализируйте URL-адрес и пусть fragid будет компонентом <fragment> URL-адреса.
  2. Если fragid — пустая строка, то указанная часть документа — это верхняя часть документа.
  3. Если в DOM есть элемент, идентификатор которого точно равен fragid, то первым таким элементом в древовидном порядке является указанная часть документа;остановите алгоритм здесь.
  4. Если есть а элемент в DOM, имеющий атрибут name, значение которого в точности равно fragid, то первый такой элемент в древовидном порядке является указанной частью документа;остановите алгоритм здесь.
  5. В противном случае указанная часть документа отсутствует.

Итак, он будет искать id="foo", а затем последует name="foo"

Редактировать:Как отметил @hsivonen, в HTML5 a элемент не имеет атрибута имени.Однако приведенные выше правила по-прежнему применяются к другим именованным элементам.

Другие советы

Вы не должны использовать <h1><a name="foo"/>Foo Title</h1> в любом варианте HTML служил text/html, поскольку синтаксис пустых элементов XML не поддерживается в text/html.Однако, <h1><a name="foo">Foo Title</a></h1> в HTML4 все в порядке.Он недействителен в HTML5 в его текущей редакции.

<h1 id="foo">Foo Title</h1> это нормально как в HTML4, так и в HTML5.Это не будет работать в Netscape 4, но вы, вероятно, будете использовать дюжину других функций, которые не работают в Netscape 4.

Я должен сказать, что если вы собираетесь ссылаться на эту область страницы...например, page.html#foo и Foo Title не являются ссылкой, которую вам следует использовать:

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

Если вместо этого вы поставите <a> ссылка вокруг него, на ваш заголовок будет влиять <a> определенный CSS на вашем сайте.Это просто дополнительная разметка, и она вам не понадобится.Я настоятельно рекомендую разместить идентификатор в заголовке: он не только лучше сформирован, но и позволит вам обращаться к этому объекту либо с помощью Javascript, либо CSS.

Википедия активно использует эту функцию следующим образом:

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

А Википедия работает для всех, поэтому я буду чувствовать себя в безопасности, придерживаясь этой формы.

Также не забывайте, что вы можете использовать это не только с интервалами, но и с элементами div или даже ячейками таблицы, и тогда у вас будет доступ к псевдоклассу :target элемента.Просто будьте осторожны, чтобы не изменить ширину, как в случае с жирным текстом, потому что это перемещает контент, что раздражает.

Именованные якоря – я голосую за то, чтобы избегать:

  • «Имена и идентификаторы находятся в одном пространстве имен...» — Два атрибута с одним и тем же пространством имен — это просто безумие.Скажем так, уже устарел.
  • «Привязывает элементы без атрибута href». Опять же, природа элемента (гиперссылка или нет) определяется наличием атрибута?!Вдвойне сумасшедший.Здравый смысл подсказывает, что этого вообще следует избегать.
  • Если вы когда-либо создавали якорь без псевдокласса, стиль применяется к каждому из них.В CSS3 это можно обойти с помощью селекторов атрибутов (или одного и того же стиля для каждого псевдокласса), но все же это обходной путь.Обычно этого не происходит, потому что вы выбираете цвета для каждого псевдокласса, а подчеркивание, присутствующее по умолчанию, имеет смысл только удалить, что делает его таким же, как и другой текст.Но если вы решите выделить ссылки жирным шрифтом, это вызовет проблемы.
  • Netscape 4 может не поддерживать функцию id, но неизвестный атрибут не вызовет никаких проблем.Для меня это называется совместимостью.
<h1 id="foo">Foo Title</h1>

это то, что следует использовать.Не используйте якорь, если вам не нужна ссылка.

Внимание для пользователей JavaScript: все идентификаторы становятся глобальными переменными в окне.

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

Только что создал глобальный JS:

window.foo

Значение window.foo будет HTMLElement для h1.

Если вы не можете гарантировать все значения, используемые в id атрибуты безопасны, вы можете предпочесть придерживаться name:

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

Метод ID не будет работать в старых браузерах, метод имени привязки будет устаревшим в новых версиях HTML...Я бы выбрал id.

Нет никакой смысловой разницы;тенденция в стандартах направлена ​​на использование id скорее, чем name.Однако существуют различия, которые могут привести к предпочтению name в некоторых случаях.Спецификация HTML 4.01 предлагает следующие подсказки:

Использовать id или name?Авторам следует учитывать следующие вопросы при принятии решения об использовании id или name для имени якоря:

  • Атрибут id может действовать не только как имя привязки (например, селектор таблицы стилей, идентификатор обработки и т. д.).
  • Некоторые старые пользовательские агенты не поддерживают привязки, созданные с помощью атрибута id.
  • Атрибут name позволяет использовать более богатые имена привязок (с сущностями).

У меня есть веб-страница, состоящая из нескольких вертикально расположенных контейнеров div, идентичных по формату и отличающихся только серийным номером.Я хотел скрыть привязку имени вверху каждого элемента div, поэтому наиболее экономичным решением оказалось включение привязки в качестве идентификатора в открывающий тег div, т. е.

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

Просто наблюдение по поводу разметки. Форма разметки в предыдущих версиях HTML обеспечивала точку привязки.Формы разметки в HTML5 с использованием атрибута id, хотя в основном эквивалентны, требуют идентификации элемента, почти все из которых обычно содержат контент.

Например, можно использовать пустой интервал или div, но такое использование выглядит и пахнет уродливо.

Одна из идей — использовать для этой цели элемент wbr.WBR имеет пустую модель контента и просто объявляет, что возможен разрыв строки;это по-прежнему несколько необоснованное использование тега разметки, но в гораздо меньшей степени, чем неоправданное разделение документа или пустые текстовые фрагменты.

Во втором примере рассматриваемому элементу присваивается уникальный идентификатор.Затем этим элементом можно манипулировать или получать к нему доступ с помощью DHTML.

С другой стороны, первый из них устанавливает именованное место в документе, аналогично закладке.Прикрепленный к «якорю», это имеет смысл.

В HTML 5 id="" Атрибут определяет уникальный идентификатор элемента, который также является привязкой для ссылки на фрагмент.В предыдущих стандартах HTML name="" атрибут <a> элемент определяет привязку для ссылки на фрагмент.Я рекомендую что-то вроде:
<a name="foo" id="foo"></a><h1>Foo Title</h1>
Поскольку поддержка id="" Атрибут немного нестабильный (хотя последние версии всех основных браузеров его поддерживают, выпускам, которые его не поддерживают, не более нескольких лет). [И лучше ничего не ломать, если нет веской причины ]).Он совместим и не стилизирует все, что находится в связанном элементе, поскольку закрывающий </a> все еще находится за пределами элемента, но он по-прежнему действителен во всех текущих стандартах.

Будьте уверены, что name="" и id="" атрибуты <a> элемент одинаковый.

Как насчет использования атрибута name для старых браузеров и атрибута id для новых браузеров.Оба варианта будут использоваться, а резервный метод будет реализован по умолчанию!!!

Вся концепция «именованной привязки» по определению использует атрибут name.Вам следует просто использовать имя, но атрибут ID может быть полезен в некоторых ситуациях, связанных с JavaScript.

Как и в комментариях, вы всегда можете использовать оба варианта, чтобы подстраховаться.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top