Семантически, что является более правильным: a в h2 или h2 в a?

Я застрял, решая, что использовать, поскольку оба, кажется, работают.

Должен ли я размещать ссылки <a> Внутри <h2> элементы?

Или наоборот?

Какой правильный стандарт?

6 ответов

Решение

Вы можете только разместить <h2> элементы внутри <a> элементы, если вы работаете с HTML5, который позволяет любые другие элементы в <a> элементы. Предыдущие спецификации (или текущие, какими бы вы ни хотели их посмотреть) никогда не допускали этого.

Обычный способ сделать это - разместить <a> в <h2>, Это работает, всегда работало и было единственным допустимым способом сделать это до HTML5 для заголовков ссылок, так как ссылка ссылается на текст в этом заголовке. Вам редко нужно размещать <h2> в <a> если что <h2> является частью более сложной структуры, которая функционирует как гиперссылка в целом.

Кроме того, он не функционирует так же, есть одна большая разница.

Если вы положите <h2> в <a> весь блок (например, строка) заголовка будет работать как ссылка.

Однако если вы положите <a> в <h2>, только видимый текст будет работать как ссылка. (вы можете проверить это с изменением курсора)

<h2> на уровне блока и <a> это не так <h2> может содержать <a> но не наоборот

http://htmlhelp.com/reference/html40/block.html

HTML позволяет вещи внутри <a> теги

У меня есть это...

<header>
  <a href="/home">
    <h1>Main heading</h1>
    <h2>Sub heading</h2>
  </a>
</header>

И это работает для меня.

Весь текст заголовка, включая подзаголовок, кликабелен, как я хочу. Я не знаю лучшего способа сделать это с помощью HTML 5.

Ответ в том, что это зависит...

Из веб-сайта W3C, более конкретно на странице семантики HTML5, становится ясно, что элементы h2 (как и все другие теги заголовков) имеют в качестве модели контента "Фразирование контента".

Теперь, перейдя по ссылке на контент Phrasing, вы получите следующее описание:

Содержание фразы - это текст документа, а также элементы, которые размечают этот текст на уровне внутри параграфа. Запускает формулировку содержания абзацев.

и в следующем списке у вас есть это содержание фразы:

а (если он содержит только фразы)

Итак, если a тег включает в себя только содержание фраз, HTML5 позволяет содержать его в h2 тег.

Viceversa, страница семантики текстового уровня описывает a Элемент содержимого модели выглядит следующим образом:

Прозрачный, но не должно быть никакого потомка интерактивного контента.

По прозрачной ссылке в конце описания находится следующее:

Если прозрачный элемент не имеет родителя, то часть его модели содержимого, которая является "прозрачной", должна рассматриваться как принимающая любое содержимое потока.

Так как в h2 описание тега сказано:

Контексты, в которых может использоваться этот элемент: Где ожидается содержимое потока.

h2 Тег может считаться потоком контента.

Итак, если a у тега нет родителя, в HTML5 он должен рассматриваться как принимающий любое содержимое потока, включая теги h2.

Спецификации W3C для h2 говорят, что его разрешенные родительские элементы - это все, что может содержать элементы потока или hgroups. Спецификации для разрешения родительских элементов, которые могут содержать фразы или элементы потока. h2 может содержать фразировочный контент, а a может содержать фразировочный или потоковый контент, поэтому на основании спецификации кажется, что любой из них разрешен.

Поскольку вы включили тег семантики, я предполагаю, что вас интересует, какой из них "кажется" тоже лучше. Со своей стороны, поскольку я не могу вспомнить, когда бы я хотел, чтобы якорь охватывал заголовок плюс другой контент, но я могу вспомнить множество раз, когда заголовок должен содержать якорь плюс другой контент, внутренняя h2 кажется лучший маршрут.

Другие вопросы по тегам