Wrap link <a>вокруг <div>

Можно ли обернуть тег <a> вокруг <div> следующим образом:

<a href=etc etc>
    <div class="layout">
        <div class="title">
        Video Type
            <div class="description">Video description</div>
        </div>
    </div>
</a>

Eclipse говорит мне, что div находится в неправильном месте? Если это не разрешено. Как я могу заставить весь класс "layout" стать ссылкой?

Ответ 1

Эта структура будет действительна в HTML5, поскольку в HTML5 якоря могут обернуть почти любой элемент, за исключением других привязок и элементов управления формой. Большинство браузеров в настоящее время имеют поддержку для этого и будут анализировать код в вопросе как допустимый HTML. Ответ ниже был написан в 2011 году и может быть полезен, если вы поддерживаете устаревшие браузеры (* cough * Internet Explorer * cough *).


Старые браузеры без синтаксических анализаторов HTML5 (например, Firefox 3.6) будут по-прежнему запутываться в этом и, возможно, испортить структуру DOM.

Три варианта HTML4 - используйте все встроенные элементы:

<a href=etc etc>
    <span class="layout">
        <span class="title">
        Video Type
            <span class="description">Video description</span>
        </span>
    </span>
</a>

Затем стиль с display: block


Используйте JavaScript и :hover:

<div class="layout">
    <div class="title">
    Video Type
        <div class="description">Video description</div>
    </div>
</div>

И (предполагая jQuery)

$('.layout').click(function(){
    // Do something
}):

и

.layout:hover {
    // Hover effect
}

Или, наконец, используйте абсолютное позиционирование для размещения якоря a с CSS для охвата всего .layout

<div class="layout">
    <div class="title">
    Video Type
        <div class="description">Video description</div>
    </div>
    <a class="more_link" href="somewhere">More information</a>
</div>

И CSS:

.layout {
    position: relative;
}

.layout .more_link {
    position: absolute;
    display: block;
    top: 0;
    bottom: 0;
    left: 0;
    right: 0;
    text-indent: -9999px;
    z-index: 1000;
}

Это, конечно, не будет работать со старыми версиями IE.

Ответ 2

В то время как тегу <a> не разрешено содержать элемент <div>, он может содержать другие встроенные элементы, такие как <span>.

Когда я столкнулся с проблемой, я поменял тег div на <span>. Поскольку тег span является встроенным элементом, вам необходимо применить display:block к css вашего элемента <span>, чтобы заставить его вести себя как элемент блока <div>. Это должно быть допустимым xhtml и не требует javascript.

Вот пример:

<a href="#">
    <span style="display:block">
        Some content. Maybe some other span elements, or images.
    </span>
</a>

Ответ 3

Решение Timothy правильное... вместо того, чтобы обернуть привязку вокруг div... вы просто даете макет анкерному элементу с отображением: блок и добавьте размер и ширину привязки...

.div_class   { width: 100px; height: 100px; }
.div_class a { width: 100px; height: 100px; display: block; }

<div class='div_class'><a href="#"></a></div> 

Ответ 4

Еще одно простое решение - просто добавьте обработчик события onclick в div следующим образом:

<div class="layout" onclick="location.href='somewhere'">
    <div class="title">
    Video Type
        <div class="description">Video description</div>
    </div>
</div>

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

<div class="layout" onclick="location.href='destination_url'">
    <div class="title">
    Video Type
        <div class="description">Video description</div>
    </div>
    <a href="destination_url">This is a link</a>
</div>

Ответ 5

Вы просто хотите стилизовать тег "a" как display: block;

Eclipse правильно сообщает вам, что ваш HTML не специфицирован (поскольку тег div не разрешен в теге привязки).

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