Cách cung cấp chú thích, tiêu đề hoặc nhãn theo ngữ nghĩa cho danh sách trong HTML


82

Cách thích hợp để cung cấp chú thích ngữ nghĩa cho danh sách HTML là gì? Ví dụ: danh sách sau có "tiêu đề" / "chú thích".

Trái cây

  • táo
  • trái cam

Từ "fruit" nên được xử lý như thế nào, theo cách mà nó được liên kết về mặt ngữ nghĩa với chính danh sách?


Các đặc tả HTML cần thêm thuộc tính hoặc thẻ chú thích, chú thích và ghi chú vào các phần tử. Hình ảnh, bảng, danh sách và các đối tượng phi văn bản khác có tiêu đề, chú giải và / hoặc ghi chú được đính kèm trong các ấn phẩm và ngôn ngữ đánh dấu hữu ích cần phản ánh quy ước đó.

9
Tôi ngạc nhiên là câu hỏi này đã được đóng lại; nó rõ ràng là về ngữ nghĩa, không phải thẩm mỹ hay bất kỳ chủ đề chủ quan nào khác. Câu hỏi được đặt ra trực tiếp "Có đánh dấu ngữ nghĩa thích hợp cho tình huống này không?" và, trong chừng mực HTML5 có liên quan, câu trả lời là "có" .
daiscog 20/02/17

9
Tôi mệt mỏi khi thấy quá nhiều câu hỏi mà tôi quan tâm bị đóng là "dựa trên ý kiến". Đó là một sự tái tạo. Hãy để chúng tôi bày tỏ ý kiến ​​của mình. Ngoài ra, câu hỏi này là về "phương pháp hay nhất". Mọi người có thể có những lập luận xác đáng về các phương pháp hay nhất (có nguồn). Chúng tôi muốn những lập luận đó. Nó không phải là tất cả về "ý kiến"
Mladen Adamovic

2
Tôi đã bỏ phiếu để mở lại câu hỏi này và chỉnh sửa nó để nghe bớt quan điểm hơn. Bây giờ rõ ràng nó yêu cầu một cách đúng ngữ nghĩa để thêm tiêu đề.
Lazar Ljubenović

Câu trả lời:


72

Mặc dù không có chú thích hoặc phần tử tiêu đề cấu trúc đánh dấu của bạn một cách hiệu quả có thể có tác dụng tương tự. Đây là một vài gợi ý:

Danh sách lồng nhau

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

Tiêu đề trước danh sách

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

Danh sách định nghĩa

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

2
@alohci Nếu sắp có thêm các định nghĩa trong danh sách thì có gì sai w / danh sách định nghĩa hay danh sách không có thứ tự?
ahsteele

2
@Alohci: Vui lòng giải thích. Bị hấp dẫn bởi nhận xét của bạn nhưng vì nó đứng nó không phải là hữu ích ở tất cả khi bạn không giải thích lý do tại sao các tùy chọn khác không 'ngữ nghĩa có giá trị'
Stijn de Witt

4
@StijndeWitt - Tất cả đều đúng. Nó không chính xác về ngữ nghĩa trong trường hợp này chỉ vì nó không có trong câu hỏi. Đó là vấn đề với việc đánh dấu HTML chính xác, nội dung thực tế và bối cảnh nó là vấn đề.
Alohci

2
@JeffereyCave Có một <ul>(hoặc bất kỳ phần tử cấp khối nào khác) là phần tử con của a <p>là không hợp lệ theo đặc tả HTML , quy định <p>này chỉ có thể có "nội dung phrasing" làm nút con.
daiscog

4
@ahsteele Thật thú vị ... MDN có nó được liệt kê là Danh sách mô tả ... Ồ! "Trước HTML5, [nó] được biết đến như một danh sách định nghĩa." developer.mozilla.org/en-US/docs/Web/HTML/Element/dl . Liên kết của bạn dành cho html4. Và trên liên kết đó, họ đưa ra một ví dụ về dl đại diện cho một hộp thoại, với mỗi dt đánh dấu người nói và dd có những gì họ nói. Vì vậy, tôi khá chắc chắn rằng chúng, bất kể chúng được gọi là gì, cũng có thể được sử dụng theo cách này.
RoboticRenaissance

54

lựa chọn 1

HTML5 có các phần tử figurefigcaption mà tôi thấy hoạt động khá độc đáo.

Thí dụ:

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

Sau đó, chúng được tạo kiểu dễ dàng với CSS.


Lựa chọn 2

Sử dụng CSS3's :: trước phần tử giả có thể là một giải pháp tốt:

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

Tất nhiên, bạn có thể sử dụng một bộ chọn khác với ul[title]; ví dụ: bạn có thể thêm một lớp 'title-as-header' và sử dụng ul.title-as-header::beforethay thế hoặc bất cứ thứ gì bạn cần.

Điều này có tác dụng phụ là cung cấp cho bạn một chú giải công cụ cho toàn bộ danh sách. Nếu bạn không muốn một chú giải công cụ như vậy, bạn có thể sử dụng một thuộc tính dữ liệu thay thế (ví dụ: <ul data-title="fruit">ul[data-title]::before { content: attr(data-title); }).


Câu trả lời của bạn là những gì các thông số kỹ thuật đang nói. Tôi tự hỏi tại sao nó không được bình chọn hàng đầu.
Ahmed Mahmoud

@AhmedMahmoud Có lẽ vì câu trả lời hàng đầu cũ hơn câu trả lời này 7 tuổi!
daiscog

Ôi, thời gian trôi nhanh. Không để ý ngày.
Ahmed Mahmoud

nghĩa là figurecó thể được sử dụng với nội dung khác với hình ảnh?
CodeGust

1
@CodeGust hoàn toàn
daiscog

13

Theo như tôi biết, không có quy định nào trong các thông số kỹ thuật HTML hiện tại để cung cấp chú thích cho một danh sách, cũng như các bảng. Bây giờ tôi vẫn sử dụng một đoạn văn được phân loại hoặc thẻ tiêu đề.

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

Trong tương lai, khi HTML5 được chấp nhận rộng rãi hơn, bạn sẽ có thể sử dụng các thẻ <legend><figure>để thực hiện điều này theo ngữ nghĩa hơn một chút.

Xem bài đăng này trên danh sách gửi thư W3C để biết thêm thông tin.


4

Để đảm bảo trình đọc màn hình kết nối danh sách với một tiêu đề được liên kết, bạn có thể sử dụng aria-labelledbykết nối với một tiêu đề idtương tự như vậy:

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

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

Như đã lưu ý trong câu trả lời trước, hãy đảm bảo rằng cấp tiêu đề của bạn tuân theo thứ tự tiêu đề trong tài liệu của bạn.


1

Không có thẻ giống như chú thích cho một danh sách như một bảng có. Vì vậy, tôi chỉ cho nó một <Hx>(x tùy thuộc vào các tiêu đề đã sử dụng trước đó của bạn).


1

Tôi biết điều này đã cũ nhưng muốn thêm câu trả lời mà tôi đã tìm thấy cho những người trong tương lai: https://www.w3.org/MarkUp/html3/listheader.html

sử dụng <lh>phần tử:

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

Lưu ý: điều này đã được đề cập trong bản nháp của HTML 3.0 nhưng không bao giờ được bao gồm trong HTML 3.2 vì vậy mặc dù nó có thể hiển thị chính xác trong một số trình duyệt nhưng nó không được hỗ trợ.
Nathan Champion

0

Vì tôi đang cố gắng tìm một giải pháp với sự hỗ trợ của trình duyệt cũ hơn, tôi có những gì có thể là một giải pháp quá đơn giản hóa. Sử dụng kiểu hiển thị bảng và id / lớp:

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

Sau đó, áp dụng display: table-row;kiểu cho phần tử trong CSS:

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

Điều này hoạt động tốt hơn nhiều nếu bạn đang sử dụng danh sách mô tả, đó là những gì tôi đã làm khi tôi có cùng một câu hỏi. Trong trường hợp đó, bạn có thể sử dụng <div>trong HTML và display: table-caption;CSS, vì các phần tử div được hỗ trợ trong danh sách dl:

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

Trong CSS, bạn có thể áp dụng nhiều kiểu khác nhau cho chú thích:

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

Tôi nên lưu ý rằng điều table-captionđó không hoạt động tốt ul/olvì nó được coi như một phần tử khối và văn bản sẽ được căn chỉnh theo chiều dọc, điều mà bạn có thể không muốn.

Tôi đã thử nghiệm điều này trên cả Firefox và Chrome.


-2

Bạn luôn có thể sử dụng <label/>để liên kết nhãn với phần tử danh sách của mình:

<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
Điều này không hợp lệ. Thông số kỹ thuật HTML nói rằng forthuộc tính phải là ID của một phần tử có thể gắn nhãn , mà UL(tại thời điểm viết bài) thì không .
daiscog
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.