Лучшая практика определения большой, сложной HTML-структуры как ссылки?

#html #css #hyperlink

#HTML #css #гиперссылка

Вопрос:

Рассмотрим следующий HTML:

 <ul>
    <li>
        <h2>Item 1</h2>
        <p class="subline">Meta information bla bla</p>
        <div class="description">
            <p>Paragraph one</p>
            <p>Paragraph two</p>
        </div>
    </li>
    <!-- More ... -->
</ul>
  

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

 <ul>
    <li>
        <a href="http://www.google.com/search?q=test 1">
            <h2>Item 1</h2>
            <p class="subline">Meta information bla bla</p>
            <div class="description">
                <p>Paragraph one</p>
                <p>Paragraph two</p>
            </div>
        </a>
    </li>
    <!-- More ... -->
</ul>
  

Очевидно, это не будет проверяться, потому что я не могу иметь элементы уровня блока внутри встроенных элементов.

РЕДАКТИРОВАТЬ: Как выясняется, приведенный выше код действителен в HTML5. Проблема решена.

Мне нужно найти другое решение:

Вставьте a тег в каждый элемент уровня блока

Я рассматривал возможность добавления идентичных тегов h2 > a , p.subline > a и div > p > a , но я хотел бы использовать состояние наведения, :hover которое влияет на всю область ссылки, так что это не сработает.

Использование события onclick

Я использовал Javascript для решения этой проблемы раньше ( li.onclick = function() { window.location.href = ... ), но тогда я не могу использовать среднюю клавишу мыши для открытия в новом окне. Это влияет на удобство использования, зависит от Javascript и, честно говоря, очень раздражает.

Создание встроенных элементов на уровне блоков:

 <ul>
    <li>
        <a href="http://www.google.com/search?q=test 1">
            <span class="title">Item 1</span>
            <span class="subline">Meta information bla bla</span>
            <span class="description">
                <span>Paragraph one</span>
                <span>Paragraph two</span>
            </span>
        </a>
    </li>
    <!-- More ... -->
</ul>
  

Скорее всего, display: block потребуется применить к некоторым или всем этим разделам, чтобы заставить их работать.

Это допустимый HTML, но он действительно ужасен.

Кто-нибудь знает лучший способ решения этой проблемы?

Комментарии:

1. Почему все это должно быть кликабельной ссылкой? Почему не просто заголовок или что-то еще?

2. Оба решения хороши для разных сценариев. Если вы хотите создать приложение Web 2.0 (например, StackOverflow), второе, основанное на AJAX, вероятно, лучше. Если вы не хотите зависеть от JS, возможно, имеет смысл сохранить заголовок в качестве ссылки для обеспечения обратной совместимости. С другой стороны, <span> решение лучше для общего прилож ения. Опять же, как и в случае с BoltClock, зачем вам нужно, чтобы все это было интерактивным?

3. Я хочу, чтобы все это li было интерактивной ссылкой, потому что я хочу, чтобы пользователю не приходилось выяснять, какая часть является интерактивной. Кроме того, мне нравится ощущение большой ссылки с некоторой обратной связью при наведении курсора. Вот пример того, что я имею в виду. Кроме того, ознакомьтесь с боковой панелью на этой странице для другого примера.

4. HTML5 допускает связывание на уровне блоков

Ответ №1:

Используйте HTML5:

http://davidwalsh.name/html5-elements-links

HTML5 представляет более простой подход к HTML, чем XHTML. И, честно говоря, это очень необходимое упрощение. Одним из таких упрощений является возможность оборачивать элементы уровня блока, такие как DIVs, H-теги и P, базовыми элементами A. Вы правильно прочитали: оберните элементы уровня блока тегами.

Лично я никогда не беспокоился об этом. Да, это технически недопустимо, но я поклонник прагматичной проверки.

Комментарии:

1. Это технически недопустимо в HTML5? Как?

2. Вау, я не могу в это поверить, но это подтверждает! <!DOCTYPE html><title></title><a href="#"><div></div></a> . Это то, что я искал.

3. извините, технически недопустимый x / html. Обычно я не беспокоюсь о том, что такого рода разметка недопустима, поскольку браузеры «спокойно» относятся к этому. Приятно, что HTML5 исправляет это.

4. Я люблю, чтобы мои страницы проверялись, чтобы избежать проблем. Кроме того, мне нравится идея иметь стандарты, которым все следуют, которые обеспечивают более предсказуемый веб для разработчиков. Тем не менее, я понимаю вашу точку зрения. Я также нарушаю правила для таких мелочей, как target атрибут в XHTML.

Ответ №2:

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

Во-первых, другой, еще более проблематичный (!) вариант. Я не одобряю следующее как лучшую практику! …Но вы могли бы добавить ее в список, который может подойти в ограниченных обстоятельствах.

http://jsfiddle.net/peteorpeter/J4sT9/

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

Хорошо, как только вы избавитесь от вкуса рвоты во рту после просмотра этого беспорядка, я думаю, вам следует:

  • Воспользуйтесь хорошей семантической разметкой, с которой вы начали
  • Добавьте в нее ссылку где-нибудь, что выглядит красиво и доступно для кликов
  • В JS скройте ссылку выше и перенаправьте клики с <li> на скрытую ссылку
  • В JS (или CSS 2 ) улучшите эффект наведения на <li>

Слегка измененная разметка:

 <ul>
    <li>
        <h2>Item 1</h2>
        <p class="subline">Meta information bla bla</p>
        <div class="description">
            <p>Paragraph one</p>
            <p>Paragraph two</p>
        </div>
        <a class="link-for-no-JS" href="buystuff">Item 1</a>
    </li>
    <!-- More ... -->
</ul>
  

Ничего слишком новаторского там нет, просто базовое прогрессивное улучшение. Пользователям с менее способными браузерами приходится искать ссылку и они могут не получить никаких эффектов наведения (но это все равно может быть красивый, удобный интерфейс); пользователи с более продвинутыми браузерами получают еще более интуитивный и отзывчивый интерфейс.

Комментарии:

1. Это был бы мой подход ( 1), и я отмечу, что не ставить фон на ссылку не такой уж и облом — вы можете поместить BG в li; и если вам нужно состояние наведения, тогда используйте JavaScript (jQuery!), чтобы добавить эффект родительскому элементу ссылки-наведите курсор — «распространяя его на li с помощью Javascript», как пишет Spliff (он тоже получает 1)

Ответ №3:

В прошлом я решал именно эту проблему, помещая ссылку в заголовок, а затем распространяя ее на li с помощью Javascript. Таким образом, большинство людей получают желаемый эффект, и если JS отключен, он работает в любом случае. При распространении ссылки также задается класс. Это немного дополнительная сложность, но это действительный HTML. Зависит от ваших приоритетов.

 // psuedocode
on document ready {
   els = getElementsByClassName("mylinks")
   for el in els {
      li = el.parentNode.parentNode;
      li.onclick = function() {window.location = el.href}
      li.className = "liHover";
   }
}
  

Комментарии:

1. Я уже рассматривал это решение. Смотрите раздел «Использование события onclick» в моем оригинальном сообщении.

2. Обратите внимание, что ссылки никогда не предназначались для того, чтобы содержать абзацы информации. С точки зрения доступности вы, вероятно, не хотите, чтобы весь этот текст содержался в одном <a> теге. Таким образом, я бы повторил разделение здесь и рассмотрел вариант JS.

Ответ №4:

Есть еще один способ взлома, который в зависимости от ситуации может сработать. Извлеките a элемент из естественного потока рендеринга с помощью position: absolute и сделайте его высоту и ширину достаточно большими, чтобы покрыть рассматриваемую область. Высокое z-index значение также может пригодиться. Хотя это взлом.