Я слышал, что помещение элемента блока во встроенный элемент - это грех HTML:
<a href="http://www.mydomain.com"><div>
What we have here is a problem.
You see, an anchor element is an inline element,
and the div element is a block level element.
</div></a>
Но что делать, если вы стилизуете внешний якорь, как display:block
в таблице стилей? Это все еще не так? Спецификация HTML 4.01 для блочных и встроенных элементов выглядит так:
Таблицы стилей предоставляют средства для задания рендеринга произвольных элементов, включая отображение элемента как блочного или встроенного. В некоторых случаях, таких как встроенный стиль для элементов списка, это может быть уместным, но, вообще говоря, авторам не рекомендуется переопределять традиционную интерпретацию элементов HTML таким способом.
У кого-нибудь есть еще советы по этому вопросу?
Ответы:
В зависимости от версии HTML, к которой вы обращаетесь:
HTML 5 гласит, что
<a>
элемент «может быть обернут вокруг целых абзацев, списков, таблиц и т. Д., Даже целых разделов, если в них нет интерактивного содержимого (например, кнопок или других ссылок)».HTML 4.01 указывает, что
<a>
элементы могут содержать только встроенные элементы . A<div>
является блочным элементом , поэтому он не может появляться внутри<a>
.Конечно, вы можете стилизовать встроенный элемент таким образом, чтобы он казался блоком, или даже стилизовать блок так, чтобы он отображался как встроенный. Использование терминов
inline
иblock
в HTML относится к связи элементов с семантической структурой документа, тогда как те же термины в CSS больше связаны с визуальным оформлением элементов. Если вы заставляете встроенные элементы отображаться блочно, это нормально.Однако вы должны убедиться, что структура документа по-прежнему имеет смысл, когда отсутствует CSS, например, когда к нему обращаются с помощью вспомогательной технологии, такой как программа чтения с экрана, или даже когда его проверяет могущественный робот Google.
источник
Нет, он не будет проверен, но да, как правило, он будет работать в современных браузерах. Тем не менее, используйте промежуток внутри вашего якоря, и установите
display: block
на него, это, безусловно, будет работать везде, и это будет проверять!источник
display: block
, разве это, технически, не станет блочным элементом?a
элементы могут содержать только встроенные элементы. Если вы сделаетеspan
элемент блок-элементом, он не должен быть технически внутри якоря.<div>
является блочным уровнем, а a<span>
является встроенным, даже если сопровождающий CSS документ диктует иное.В документе W3C не используются такие понятия, как ложь и грех , но он использует такие понятия, как средства , которые могут быть уместными и обескураженными .
На самом деле, во втором абзаце раздела 4 спецификация 4.01 содержит следующие слова:
Имея это в виду, я считаю, что окончательное утверждение содержится в 7.5.3 Блочных и встроенных элементах , где говорится
Условие «в целом», по-видимому, вводит достаточно двусмысленности, чтобы сказать, что HTML 4.01 позволяет встроенным элементам содержать блочные элементы.
Конечно, CSS2 имеет значение свойства display, inline-block , которое кажется подходящим для цели, которую вы описываете. Я не уверен, что это когда-либо получило широкую поддержку, но кажется, что кто-то предвидел необходимость такого поведения.
DTD, кажется, здесь менее прощающий, но текст DTD подчиняется спецификации:
В другом комментарии вы предлагаете сделать блок активным, поместив его в якорь. Я не верю, что HTML запрещает это, а CSS явно позволяет это. Поэтому, чтобы ответить на заглавный вопрос о том, является ли он правильным, я отвечаю да По меркам это иногда правильно.
источник
Со спецификацией HTML5 ... Теперь можно поместить элемент уровня блока внутри встроенного элемента. Так что теперь вполне уместно поместить «div» или «h1» внутри элемента «a».
источник
Вы не можете положить
<div>
внутрь<a>
- это недопустимый (X) HTML.Даже если вы стилизуете диапазон с помощью display: block, вы все равно не можете поместить в него элементы уровня блока: (X) HTML по-прежнему должен подчиняться (X) HTML DTD (независимо от того, какой вы используете), независимо от того, как работает CSS меняет вещи.
Браузер, вероятно, отобразит его так, как вы хотите, но это не поможет.
источник
DTD для HTML 4 можно найти по адресу http://www.w3.org/TR/REC-html40/sgml/dtd.html . Этот DTD является машинно-обрабатываемой формой спецификации, с ограничением, что DTD управляет XML и HTML 4, особенно «временный» вариант, допускает множество вещей, которые не являются «легальными» XML. Тем не менее, я считаю, что это близко к кодификации намерений спецификаторов.
Я бы интерпретировал теги, перечисленные в этой иерархии, как сумму разрешенных тегов.
Хотя в спецификации может быть указано «встроенные элементы», я почти уверен, что это не означает, что вы можете обойти намерение, объявив тип отображения элемента блока как встроенный. Встроенные теги имеют различную семантику, независимо от того, как вы можете злоупотреблять ими.
С другой стороны, я нахожу интригующим, что включение,
special
кажется, позволяет вкладыватьA
элементы. Вероятно, в спецификации есть сильная формулировка, которая запрещает это, даже если он синтаксически корректен в XML, но я не буду вдаваться в подробности, так как это не тема вопроса.источник
- -
значит. Я пытался найти объяснение, но я не смог его найти.Элементы уровня блока, такие как
<div>
могут быть обернуты<a>
тегами в HTML5. Хотя a<div>
считается контейнером / оберткой для содержимого потока, а<a>
s рассматривается как содержимое потока в соответствии с MDN . Семантически может быть лучше создать встроенные элементы, которые действуют как элементы уровня блока.источник
Если вы хотите избежать семантической проблемы размещения элементов div внутри тегов привязки, просто поместите тег привязки на тот же уровень, что и элементы div, оберните их все контейнером position: относительный, сделайте позицию тега привязки абсолютной и разверните ее до заполнить контейнер. Также, если это не конец потока контента, убедитесь, что вы добавили z-index, чтобы разместить его над контентом.
Как и предполагалось, я добавил код разметки:
И CSS
источник
Если вы собираетесь заняться созданием
<a>
блока, почему бы не поместить его<a>
в div, будучи элементом блока, это даст вам тот же эффект.источник
Если вы измените его на элемент блочного стиля, то нет, это больше не «неправильно», но, вероятно, не будет проверено. Но не имеет смысла делать то, что ты делаешь. Вы должны либо просто оставить тег привязки как элемент уровня блока без внутреннего элемента div, либо поместить элемент div снаружи.
источник
Это не правильно. Используйте промежуток .
источник
Я думаю, что в большинстве случаев, когда люди задают этот вопрос, они создают сайт, содержащий только div, и теперь один из div должен быть ссылкой.
Я видел, как кто-то использовал прозрачное пустое изображение, PNG, внутри тега привязки просто для создания ссылки внутри div, и изображение было того же размера, что и div.
Довольно печально на самом деле ... но это работает ...
источник
Вы можете добиться этого, добавив псевдоэлемент ":: before"
Чистый трюк CSS;)
источник
Просто как к сведению.
Если ваша цель - сделать ваш div кликабельным, вы можете использовать jQuery / Java Script.
Определите ваш div следующим образом:
Ваш jQuery будет тогда реализован так:
Это также будет работать для нескольких div-ов - согласно комментарию Тома в этой теме
источник