Jak semantycznie podać podpis, tytuł lub etykietę listy w formacie HTML

83

Jaki jest właściwy sposób umieszczenia podpisu semantycznego na liście HTML? Na przykład poniższa lista ma „tytuł” ​​/ „podpis”.

Owoc

  • jabłko
  • Gruszka
  • Pomarańczowy

Jak należy traktować słowo „owoc”, aby było ono semantycznie powiązane z samą listą?

Jon P
źródło
Specyfikacje HTML muszą dodawać podpis, legendę i atrybuty uwag lub znaczniki do elementów. Obrazy, tabele, listy i inne obiekty nietekstowe mają tytuł, legendę i / lub notatkę dołączoną do nich w publikacjach, a przydatny język znaczników musi odzwierciedlać tę konwencję.
9
Dziwię się, że to pytanie zostało zamknięte; wyraźnie dotyczy semantyki, a nie estetyki czy innego subiektywnego tematu. Pytanie brzmi bezpośrednio: „Czy istnieje odpowiedni znacznik semantyczny dla tej sytuacji?” a jeśli chodzi o HTML5, odpowiedź brzmi „tak” .
daiscog
9
Mam dość patrzenia na tak wiele interesujących mnie pytań jako zamkniętych jako „oparte na opiniach”. To jest kontraproduktywne. Pozwól nam wyrazić swoje opinie. To pytanie dotyczy również „najlepszych praktyk”. Ludzie mogą mieć ważne argumenty dotyczące najlepszych praktyk (ze źródłami). Chcemy tych argumentów. Nie chodzi tylko o „opinie”
Mladen Adamovic
2
Głosowałem za ponownym otwarciem tego pytania i zredagowałem je tak, aby brzmiało mniej opiniotwórczo. Teraz wyraźnie prosi o poprawny semantyczny sposób dodania tytułu.
Lazar Ljubenović

Odpowiedzi:

73

Chociaż nie ma elementu podpisu ani nagłówka, który skutecznie strukturyzuje kod, może mieć ten sam efekt. Oto pewne sugestie:

Lista zagnieżdżona

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

Nagłówek przed listą

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

Lista definicji

<dl>
  <dt>Fruit</dt>
  <dd>Apple</dd>
  <dd>Pear</dd>
  <dd>Orange</dd>
</dl>
ahsteele
źródło
2
@alohci Jeśli na liście będzie więcej definicji, co jest nie tak z listą definicji lub nieuporządkowaną listą?
ahsteele
2
@Alohci: Proszę rozwinąć. Zaintrygowany twoim komentarzem, ale w obecnym kształcie nie jest to wcale pomocne, ponieważ nie wyjaśniasz, dlaczego inne opcje nie są `` poprawne semantycznie ''
Stijn de Witt
4
@StijndeWitt - To wszystko prawda. W tym przypadku jest to niepoprawna semantyka tylko dlatego, że nie ma o tym mowy. Na tym polega problem z poprawnym poprawieniem znaczników HTML, rzeczywistą treścią i kontekstem, w którym się ona znajduje.
Alohci,
2
@JeffereyCave Posiadanie <ul>(lub dowolnego innego elementu na poziomie bloku) jako elementu podrzędnego a <p>jest nieprawidłowe zgodnie ze specyfikacją HTML , która stwierdza, że <p>węzły potomne mogą mieć tylko „zawartość frazującą”.
daiscog
4
@ahsteele Ciekawe ... MDN umieściło to na liście opisów ... Och! „Przed HTML5 [to] było znane jako lista definicji”. developer.mozilla.org/en-US/docs/Web/HTML/Element/dl . Twój link dotyczył html4. W tym łączu podają przykład dl reprezentującego dialog, gdzie każdy dt oznacza mówiącego, a dd ma to, co mówi. Jestem więc prawie pewien, że jakkolwiek się nazywają, mogą być również właściwie używane w ten sposób.
RoboticRenaissance
54

opcja 1

HTML5 ma elementy figureifigcaption , które moim zdaniem działają całkiem nieźle.

Przykład:

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

Są one następnie łatwo stylizowane za pomocą CSS.


Opcja 2

Przyjemnym rozwiązaniem może być użycie pseudoelementu :: before w CSS3:

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;
}

Możesz oczywiście użyć innego selektora niż ul[title]; na przykład możesz dodać klasę „tytuł-jako-nagłówek” i użyć ul.title-as-header::beforezamiast niej lub czego potrzebujesz.

Ma to efekt uboczny polegający na wyświetleniu podpowiedzi dla całej listy. Jeśli nie chcesz takiej podpowiedzi, możesz zamiast tego użyć atrybutu danych (np. <ul data-title="fruit">I ul[data-title]::before { content: attr(data-title); }).

daiscog
źródło
Twoja odpowiedź brzmi, co mówią specyfikacje. Zastanawiam się, dlaczego nie jest to najlepszy głos.
Ahmed Mahmoud
@AhmedMahmoud Prawdopodobnie dlatego, że najlepsza odpowiedź jest o 7 lat starsza od tej!
daiscog
Och, czas leci. Nie zauważyłem daty.
Ahmed Mahmoud
czy to oznacza, że figuremożna ich używać z treściami innymi niż obrazy?
CodeGust
1
@CodeGust absolutnie
daiscog
13

O ile mi wiadomo, w aktualnych specyfikacjach HTML nie ma przepisów dotyczących umieszczania podpisu dla listy, tak jak ma to miejsce w przypadku tabel. Zostałbym na razie przy użyciu sklasyfikowanego akapitu lub tagu nagłówka.

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

W przyszłości, gdy HTML5 zyska szersze zastosowanie, będziesz mógł użyć tagów <legend>i <figure>, aby osiągnąć to nieco bardziej semantycznie.

Zobacz ten post na liście mailingowej W3C, aby uzyskać więcej informacji.

szósty bieg
źródło
4

Aby upewnić się, że czytniki ekranu łączą listę z powiązanym nagłówkiem, możesz użyć aria-labelledbypołączenia z nagłówkiem o idpodobnej treści:

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

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

Jak wspomniano w poprzedniej odpowiedzi, upewnij się, że poziom nagłówków jest zgodny z kolejnością nagłówków w dokumencie.

Corey Bruyere
źródło
1

Nie ma tagu podobnego do podpisu dla listy takiej jak tabela. Więc dałbym mu po prostu <Hx>(x w zależności od poprzednio używanych nagłówków).

I. Evries
źródło
1

Wiem, że to stare, ale chciałem dodać odpowiedź, którą znalazłem dla przyszłych ludzi: https://www.w3.org/MarkUp/html3/listheader.html

użyj <lh>elementu:

<ul>
  <lh>Types of fruit:</lh>
  <li>Apple</li>
  <li>Orange</li>
  <li>Grape</li>
</ul>
rnewman
źródło
Uwaga: zostało to wspomniane w wersji roboczej HTML 3.0, ale nigdy nie zostało uwzględnione w HTML 3.2, więc chociaż może renderować się poprawnie w niektórych przeglądarkach, nie jest obsługiwane.
Nathan Champion
0

Ponieważ próbowałem znaleźć rozwiązanie obsługujące starszą przeglądarkę, mam rozwiązanie, które może być zbyt uproszczone. Korzystanie ze stylów wyświetlania tabel i identyfikatorów / klas:

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

Następnie zastosuj display: table-row;styl do elementu w CSS:

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

Działa to znacznie lepiej, jeśli używasz listy opisów, co robiłem, gdy miałem to samo pytanie. W takim przypadku możesz użyć <div>w HTML i display: table-caption;CSS, ponieważ elementy div są obsługiwane na liście dl:

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

W CSS możesz zastosować różne style do podpisu:

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

Powinienem zauważyć, że table-captionnie działa tak dobrze wul/ol ponieważ jest traktowany jako element blokowy, a tekst zostanie wyrównany w pionie, czego prawdopodobnie nie chcesz.

Przetestowałem to w przeglądarce Firefox i Chrome.

harrekki
źródło
-2

Zawsze możesz użyć, <label/>aby powiązać etykietę z elementem listy:

<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>
HelpNeeder
źródło
4
To jest nieważne. Specyfikacja HTML stwierdza, że foratrybut musi być identyfikatorem elementu , który można etykietować , którym UL(w momencie pisania) nie jest .
daiscog