Як семантично надати підпис, заголовок або мітку для списку в HTML


83

Який правильний спосіб надати семантичний підпис для списку HTML? Наприклад, наступний список має "заголовок" / "підпис".

Фрукти

  • Яблуко
  • Груша
  • Помаранчевий

Як слід поводитися зі словом «фрукт» таким чином, щоб воно було семантично пов’язане із самим списком?


Специфікація HTML повинна додавати до елементів атрибути або теги субтитрів, легенд та приміток. Зображення, таблиці, списки та інші нетекстові об'єкти мають у публікаціях заголовок, легенду та / або примітку, і корисна мова розмітки повинна відображати цю умову.

9
Я здивований, що це питання було закрито; явно йдеться про семантику, а не естетику чи будь-яку іншу суб’єктивну тему. Питання прямо задається: "Чи є відповідна семантична розмітка для цієї ситуації?" і, що стосується HTML5, відповідь "так" .
daiscog

9
Я втомився бачити стільки питань, які цікавлять мене, як закритих, як "на основі думок". Це контрапродуктивно. Висловімо свою думку. Крім того, це питання стосується "найкращої практики". Люди можуть мати вагомі аргументи щодо найкращих практик (із джерелами). Ми хочемо ці аргументи. Це не все про "думки"
Младен Адамович,

2
Я проголосував за те, щоб знову відкрити це питання та відредагував його, щоб звучати менше думок. Тепер він чітко вимагає правильного семантичного способу додавання заголовка.
Лазар Любенович

Відповіді:


73

Хоча немає заголовка або елемента заголовка, що ефективно структурує вашу розмітку, може мати той самий ефект. Ось декілька пропозицій:

Вкладений список

<ul>
    <li>
        Fruit
        <ul>
            <li>Apple</li>
            <li>Pear</li>
            <li>Organge</li>
        </ul>
    </li>
</ul>

Заголовок до списку

<hX>Fruit</hX>
<ul>
    <li>Apple</li>
    <li>Pear</li>
    <li>Orange</li>
</ul>

Список визначень

<dl>
  <dt>Fruit</dt>
  <dd>Apple</dd>
  <dd>Pear</dd>
  <dd>Orange</dd>
</dl>

2
@alohci Якщо у списку буде більше визначень, що не так із списком визначень чи невпорядкованим списком?
ahsteele

2
@Alohci: Будь ласка, детальніше. Заінтригований вашим коментарем, але, як він виглядає, це зовсім не корисно, оскільки ви не пояснюєте, чому інші варіанти не є "семантично дійсними"
Stijn de Witt

4
@StijndeWitt - Це все правда. У цьому випадку це неправильна семантика лише тому, що про це не йдеться. Це проблема з правильним розміткою HTML, фактичним вмістом та контекстом, в якому справа.
Alohci

2
@JeffereyCave Наявність <ul>(або будь-якого іншого елемента на рівні блоку) як дочірнього елемента a <p>є недійсним відповідно до специфікації HTML , де зазначено, що <p>"вміст фрази" може бути лише дочірнім вузлом.
daiscog

4
@ahsteele Цікаво ... MDN вказав його як Список опису ... О! "До HTML5 [він] був відомий як список визначень." developer.mozilla.org/en-US/docs/Web/HTML/Element/dl . Ваше посилання було для html4. І за цим посиланням вони дають приклад dl, що представляє діалогове вікно, причому кожен dt позначає динаміка, а dd має те, що вони говорять. Тож я майже впевнений, що їх, як би їх не називали, можна належним чином використовувати, як і таким чином.
RoboticRenaissance

54

Варіант 1

HTML5 має елементи figureіfigcaption , які, як мені здається, працюють досить добре.

Приклад:

<figure>
    <figcaption>Fruit</figcaption>
    <ul>
        <li>Apple</li>
        <li>Pear</li>
        <li>Orange</li>
    </ul>
</figure>

Потім вони легко стилюються за допомогою CSS.


Варіант 2

Використання CSS3's :: before псевдоелемент може бути хорошим рішенням:

HTML:

<ul title="Fruit">
    <li>Apple</li>
    <li>Pear</li>
    <li>Orange</li>
</ul>

CSS:

ul[title]::before {
    content: attr(title);
    /* then add some nice styling as needed, eg: */
    display: block;
    font-weight: bold;
    padding: 4px;
}

Звичайно, ви можете використовувати інший селектор, ніж ul[title]; наприклад, ви можете додати клас "title-as-header" і використовувати ul.title-as-header::beforeзамість цього, або все, що вам потрібно.

Це має побічний ефект, коли ви дасте підказку для всього списку. Якщо вам не потрібна така підказка, замість цього ви можете використовувати атрибут даних (наприклад, <ul data-title="fruit">і ul[data-title]::before { content: attr(data-title); }).


Ваша відповідь - це те, про що говорять специфікації. Цікаво, чому це не той, що проголосував у голові.
Ахмед Махмуд,

@AhmedMahmoud Можливо, тому, що головна відповідь на 7 років старша за цю!
daiscog

О, час летить. Не помітив дати.
Ахмед Махмуд,

чи означає це, що figureможна використовувати із вмістом, відмінним від зображень?
CodeGust


13

Наскільки мені відомо, у поточних специфікаціях HTML немає положень щодо надання підпису для списку, як і в таблицях. Наразі я б залишився використовувати або класифікований абзац, або тег заголовка.

<h3>Fruit</h3>
<ul>
    <li>Apple</li>
    <li>Pear</li>
    <li>Orange</li>
</ul>

У майбутньому, коли HTML5 набуде більш широкого поширення, ви зможете використовувати теги <legend>та та <figure>зробити це трохи більш семантично.

Для отримання додаткової інформації дивіться цей пост у списку розсилки W3C.


4

Щоб забезпечити підключення читачів з екрана списку до пов’язаного заголовка, ви можете використовувати aria-labelledbyпідключений до заголовка приблизно idтакий:

<h3 id="fruit-id">Fruit</h3>

<ul aria-labelledby="fruit-id">
  <li>Apple</li>
  <li>Pear</li>
  <li>Orange</li>
</ul>

Як зазначалось у попередній відповіді, переконайтесь, що рівень заголовка відповідає порядку заголовка у вашому документі.


1

Для списку, подібного до таблиці, немає тегу, подібного до підписів. Тому я просто дав би йому <Hx>(x залежно від ваших раніше використовуваних заголовків).


1

Я знаю, що це старе, але хотів додати відповідь, яку знайшов для майбутніх людей: https://www.w3.org/MarkUp/html3/listheader.html

використовуйте <lh>елемент:

<ul>
  <lh>Types of fruit:</lh>
  <li>Apple</li>
  <li>Orange</li>
  <li>Grape</li>
</ul>

Примітка: це було згадано в проекті HTML 3.0, але ніколи не було включено в HTML 3.2, тому, хоча воно може відображатися належним чином у деяких браузерах, воно не підтримується.
Натан Чемпіон

0

Оскільки я намагався знайти рішення зі старішою підтримкою браузера, я маю надто спрощене рішення. Використання стилів відображення таблиць та ідентифікаторів / класів:

    <ul>
        <li id="listCaption">My List</li>
        <li>first item</li>
        <li>second item</li>
        <li>third item</li>
      </ul>

Потім застосуйте display: table-row;стиль до елемента в CSS:

    li#listCaption {
      display: table-row;
      font-size: larger;
      text-decoration: underline; }

Це працює набагато краще, якщо ви використовуєте список описів, що я робив, коли у мене було таке саме запитання. У цьому випадку ви можете використовувати <div>в HTML і display: table-caption;в CSS, оскільки елементи div підтримуються у списку dl:

    <dl>
        <div id="caption">Table Caption</div>
        <dt>term</dt>
        <dd>definition</dd>
    </dl>

У CSS ви можете застосувати до підпису різні стилі:

    #caption {
        display: table-caption;
        font-family: Arial, Helvetica, sans-serif;
        font-size: 20px;
        background: transparent;
        caption-side: top;
        text-align: center; }

Слід зазначити, що table-captionце працює не так добре, ul/olоскільки воно трактується як елемент блоку, і текст буде вирівняний вертикально, чого ви, мабуть, не хочете.

Я тестував це як у Firefox, так і в Chrome.


-2

Ви завжди можете використовувати <label/>для прив’язки мітки до елемента списку:

<div>
    <label for="list-2">TEST</label>
    <ul id="list-1">
        <li>one</li>
        <li>two</li>
        <li>three</li>
    </ul>
    <label for="list-2">TEST</label>
    <ol id="list-2">
        <li>one</li>
        <li>two</li>
        <li>three</li>
    </ul>
</div>

4
Це недійсно. В специфікації HTML зазначено, що forатрибут повинен бути ідентифікатором позначеного елемента , що UL(на момент написання) не є .
daiscog
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.