Как семантически предоставить заголовок, заголовок или метку для списка в HTML

Как правильно указать семантическую подпись для списка HTML? Например, в следующем списке есть «заголовок» / «заголовок».

Фрукты

  • яблоко
  • Груша
  • апельсин

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


person Jon P    schedule 17.07.2009    source источник
comment
Спецификации HTML должны добавлять к элементам атрибуты или теги заголовка, легенды и примечания. Изображения, таблицы, списки и другие нетекстовые объекты имеют заголовок, легенду и / или примечание, прикрепленное к ним в публикациях, и полезный язык разметки должен отражать это соглашение.   -  person    schedule 24.01.2015
comment
Я удивлен, что этот вопрос был закрыт; это явно о семантике, а не об эстетике или любой другой субъективной теме. Возникает прямой вопрос: есть ли подходящая семантическая разметка для этой ситуации? и, что касается HTML5, ответ - да.   -  person daiscog    schedule 20.02.2017
comment
Я устал видеть столько вопросов, которые меня интересуют, как закрытые, основанные на мнении. Это контрпродуктивно. Выскажем свое мнение. Кроме того, этот вопрос касается передовой практики. У людей могут быть веские аргументы относительно передового опыта (с источниками). Нам нужны эти аргументы. Дело не только в мнениях   -  person Mladen Adamovic    schedule 27.05.2017
comment
Я проголосовал за повторное открытие этого вопроса и отредактировал его, чтобы он звучал менее критично. Теперь он явно требует правильного смыслового способа добавления заголовка.   -  person Lazar Ljubenović    schedule 14.11.2018


Ответы (8)


Несмотря на отсутствие заголовка или элемента заголовка, эффективная структурирование разметки может иметь тот же эффект. Вот несколько предложений:

Вложенный список

<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>
person ahsteele    schedule 17.07.2009
comment
Я выберу это как свой выбранный ответ, так как после дополнительных исследований список определений, вероятно, удовлетворит мои потребности, так как будет несколько списков. Теперь моей следующей задачей будет укладка. - person Jon P; 17.07.2009
comment
@alohci Если в списке будет больше определений, что не так со списком определений или неупорядоченным списком? - person ahsteele; 17.07.2009
comment
@Alohci: Уточните, пожалуйста. Заинтригован вашим комментарием, но в его нынешнем виде он совершенно бесполезен, поскольку вы не объясняете почему другие параметры не являются "семантически действительными" - person Stijn de Witt; 14.04.2014
comment
@StijndeWitt - Ну, это было почти 5 лет назад. Яблоко, груша и апельсин не являются определениями фруктов. Это исключает вариант 3. В варианте 1 содержимое внешнего списка не является списком. - person Alohci; 14.04.2014
comment
Лол, извини, я не посмотрел на дату! В любом случае, очень здорово с вашей стороны ответить :) Вариант 1: Мне кажется, что список с одним элементом в нем не является недействительным ... По крайней мере, на мой взгляд, если яблоко, груша и апельсин являются подпунктами более широкого элемента, Fruit действительно дает некоторые смысл. Я вижу, как можно расширить внешний список такими записями, как «Овощи», «Мясо» и т. Д. - person Stijn de Witt; 14.04.2014
comment
@StijndeWitt - Это все правда. Это неправильная семантика в this экземпляре только потому, что это не вопрос. Это проблема с правильной разметкой HTML, фактическим содержанием и контекстом, в котором это имеет значение. - person Alohci; 14.04.2014
comment
Я уважаю семантически допустимый html больше, чем большинство людей, но иногда теги, доступные в библиотеке html5, кажутся такими произвольными, а тем более их определения w3c. Заставляет меня задуматься, стоят ли усилия, которые я прилагаю, чтобы убедиться, что мой html5 имеет смысл. Тем не менее, я думаю, что разрешение заголовка внутри ‹ol› или ‹ul› было бы полезно. - person aaaaaa; 20.02.2015
comment
Мне нравится этот ответ, но я хотел добавить еще один (недостаточно уверен, чтобы добавить к ответу). Я часто использую: <p>There are several types of fruit that are useful in this case: <ul><li>Apple</li><li>Pear</li><li>Orange</li></ul></p> - person Jefferey Cave; 31.12.2015
comment
@JeffereyCave Наличие <ul> (или любого другого элемента уровня блока) в качестве дочернего для <p> недопустимо в соответствии с спецификация HTML, в которой говорится, что <p> может иметь фразовое содержимое только в качестве дочерних узлов. - person daiscog; 26.01.2016
comment
@daiscog Вы правы, HTML специально упоминает этот случай как недопустимый. Я не согласен с их различием между структурой и логикой, но пока я жду своего места в комитете, мне придется изменить свои обозначения. - person Jefferey Cave; 26.01.2016
comment
Это список описаний, а не список определений. Если мы говорим о семантике, это важное различие. И пока что Описание - это единственное, что позволяет добавить более выделенный элемент без вложенности. - person RoboticRenaissance; 05.09.2016
comment
@RoboticRenaissance согласно W3C, это список определений: w3.org /TR/html4/struct/lists.html#h-10.3. - person ahsteele; 08.09.2016
comment
@ahsteele Интересно ... MDN внес это в список описаний ... О! До HTML5 [это] было известно как список определений. developer.mozilla.org/en-US/docs/Web/ HTML / Element / dl. Ваша ссылка была для html4. И по этой ссылке они приводят пример dl, представляющего диалог, где каждый dt обозначает говорящего, а dd имеет то, что он говорит. Так что я почти уверен, что их, как бы они ни назывались, можно правильно использовать и таким образом. - person RoboticRenaissance; 08.09.2016
comment
@RoboticRenaissance, это хорошая информация. Согласен, подход кажется подходящим. - person ahsteele; 08.09.2016

Вариант 1

HTML5 имеет элементы figure и figcaption, которые Я неплохо нахожу работу.

Пример:

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

Затем их легко стилизовать с помощью CSS.


Вариант 2

Использование псевдоэлемента CSS3 :: 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]; например, вы можете добавить класс «заголовок как заголовок» и использовать вместо него ul.title-as-header::before или что угодно.

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

person daiscog    schedule 26.01.2016
comment
Ваш ответ - то, что говорят спецификации. Интересно, почему он не самый популярный. - person Ahmed Mahmoud; 07.03.2019
comment
@AhmedMahmoud Наверное, потому что главный ответ на 7 лет старше этого! - person daiscog; 07.03.2019
comment
О, время летит незаметно. Не заметил дату. - person Ahmed Mahmoud; 07.03.2019
comment
Означает ли это, что figure можно использовать с контентом, отличным от изображений? - person CodeGust; 04.09.2020
comment
@CodeGust абсолютно - person daiscog; 07.09.2020
comment
@daiscog - да, но обычно на него ссылаются как на отдельную единицу из основного потока документа. - не figure не сделает ли семантическое значение элемента менее важным / значимым, чем простой h3 / aria-labelledby, если это что-то вроде карты сайта в нижнем колонтитуле с заголовком страницы и списком подразделов? - person CodeGust; 19.09.2020
comment
@CodeGust, я не думаю, что это делает его менее important/meaningful. Решение о том, какой подход использовать, должно в конечном итоге определяться контекстом, в котором представлен список. hX элементы - заголовки разделов документа; все, что находится под h3, до следующего hX, является частью раздела, возглавляемого им. Подход h3 может быть подходящим, а может и нет. Это зависит от обстоятельств. - person daiscog; 12.10.2020

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

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

В будущем, когда HTML5 получит более широкое распространение, вы сможете использовать теги <legend> и <figure>, чтобы сделать это немного более семантически.

Дополнительную информацию см. В этом сообщении в списке рассылки W3C. .

person sixthgear    schedule 17.07.2009

Чтобы программы чтения с экрана подключили список к соответствующему заголовку, вы можете использовать aria-labelledby, подключенный к заголовку с id следующим образом:

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

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

Как отмечалось в предыдущем ответе, убедитесь, что уровень заголовка соответствует порядку заголовков в документе.

person Corey Bruyere    schedule 29.04.2020

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

person I.devries    schedule 17.07.2009

Я знаю, что это устарело, но хотел добавить ответ, который нашел для будущих людей: 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>
person rnewman    schedule 10.09.2020
comment
Примечание: это упоминалось в черновике HTML 3.0, но никогда не включалось в HTML 3.2, поэтому, хотя он может правильно отображаться в некоторых браузерах, он не поддерживается . - person Nathan Champion; 10.09.2020

Поскольку я пытался найти решение с поддержкой более старых версий браузеров, у меня есть то, что может быть слишком упрощенным решением. Использование стилей отображения таблиц и идентификаторов / классов:

    <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.

person harrekki    schedule 16.10.2020

Вы всегда можете использовать <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>
person HelpNeeder    schedule 09.03.2019
comment
Это неверно. В спецификации HTML указано, что атрибут for должен быть идентификатором маркированного элемента, который UL (на момент написания) не. - person daiscog; 04.05.2020