203 pointsby ravenical4 hours ago21 comments
  • chrismorgan2 hours ago
    > <dl aria-label="Ability Scores">

    This is incorrect:

    1. <dl> has no corresponding (viz. implicit) role, but can be given the role group, list, none or presentation <https://w3c.github.io/html-aria/#el-dl>.

    2. You’re only allowed to define aria-label on elements that have a compatible role, implicit or explicit <https://w3c.github.io/html-aria/#docconformance-naming>.

    3. aria-label is allowed on all but a handful of roles <https://www.w3.org/TR/wai-aria-1.2/#aria-label>, which in this case knocks out presentation and none, leaving group and list.

    4. group doesn’t feel right, list feels acceptable.

    In summary: either ditch the aria-label, or add role="list" (meaning also role="listitem" on children).

    —⁂—

    One thing the article misses is that you can have multiple <dt> in a row too, not just <dd>. The spec has a good example: https://html.spec.whatwg.org/multipage/grouping-content.html...

    They’re not name–value pairs, they’re name–value groups.

    • redmatteran hour ago
      Wow I have never noticed that, thanks for the heads up! Out of curiosity, would you put `role="listitem"` on `<div>` elements that wrap the `<dt>` && `<dd>` elements? It looks like `role="listitem"` is allowed on the `<dt>` element, but that doesn't feel like it would be accurate in the case where multiple `<dt>` elements are grouped together, and I'm not sure if that would mess with how the element is interpreted natively as as term.
      • chrismorgan32 minutes ago
        I know the fundamentals of this sort of thing, but I haven’t done much practical with it, so I don’t feel that I can comment on this point.
    • huflungdung39 minutes ago
      [dead]
  • kqp30 minutes ago
    This is going to be unpopular here, but life became easier when I quit trying to write semantic HTML. It’s just poorly designed, I’m sorry. Every time I’ve reached for a <dl> I’ve eventually regretted it because I wanted multiple levels of wrappers, or a divider between sections, or an icon, or a heading spanning multiple key-value pairs, etc. They make this stuff with some flexibility but nowhere near enough to actually cover the generalized concept it purports to. I still use the corresponding elements when there are observable benefits, of course, like <button>, <h1>, etc, but when all it’s going to do is not quite fit the data model and force me to override everything, it’s just not a practical choice.

    It shouldn’t be so controversial to say that if 99% of usage routes around your API, it’s probably the API’s fault.

    • halapro26 minutes ago
      Sounds like it's CSS' fault then. I think that just like they introduced `display:contents` to remove wrappers, they should also introduce a way to group elements as if they had a common ancestor.

          :wrap(dt, dt+dd) {border: solid 1px}
  • captn3m03 hours ago
    > Prior to HTML5, this was called a definition list. This is because the <dl> was originally only intended to represent glossaries of terms and their definitions.

    TIL I’ve been naming it wrong for a decade.

    • Ancapistanian hour ago
      You’re not alone. This is the second time this week I’ve seen that, and thought it was a mistake the first time.
    • xp842 hours ago
      I don’t want to check what year html5 was standardized because I think it may be north of a decade ;)
      • zbentleyan hour ago
        > I think it may be north of a decade

        Nearly two!

        • stousetan hour ago
          I was better off not knowing that this morning. Might be worth prefixing that tidbit of info with “trigger warning: the unrelenting passage of time”.
    • jasonlotitoan hour ago
      TIL The name was changed from a definition list.
      • Tepixan hour ago
        Same here. I like definition list better ;-)
  • jimbosis2 hours ago
    The world's first website makes heavy use of <dl>s.

    https://info.cern.ch/hypertext/WWW/TheProject.html

    https://info.cern.ch/ (A landing page of sorts to give context and orientation about the actual first website.)

  • simonw3 hours ago
    Here's a useful note on how well screen readers support DL: https://adrianroselli.com/2025/01/updated-brief-note-on-desc...
  • cloud-oak3 hours ago
    The final example of the DnD statt sheet makes me think whether it's legal to nest <dl>s?

    I.e. can we do

        <dl>
          <dt>Actions</dt>
          <dd><dl>...</dl></dd>
        </dl>
  • Demiurge3 hours ago
    I love DL. I think tables, at least in the past, were misused as DLs even more in the past and the inconvenience of the table markup is even worse than a bunch of divs.
    • enriquto2 hours ago
      It's not that inconvenient if you omit unnecessary closing tags:

          <tr>
          <td> first
          <td> second
          <tr>
          <td> what
          <td> ever
      
      I find it simpler and cleaner than any of the markdown table markups
      • myfonj2 hours ago
        Fair point, though /DT and /DD are also optional just like /TH, /TD and /TR are. So in effect, def…scription list could structurally save you one TR for each entry and two "BLE"s:

            <table><tr><th>Term 1<td>Definition 1
                   <tr><th>Term 2<td>Definition 2
            </table>
            <dl><dt>Term 1<dd>Definition 1
                <dt>Term 2<dd>Definition 2
            </dl>
      • debesyla2 hours ago
        Isn't markdown table just a bunch of | ?
        • zufallsheld2 hours ago
          That's the problem.
          • froh2 hours ago
            most specifically the problem is that markdown tables don't allow breaking the table row in multiple lines

            but then you can always use HTML tables in markdown and Pandoc transforms it just fine

            • hnlmorgan hour ago
              <br> has worked fine whenever I’ve needed line breaking in markdown tables
              • quietbritishjim15 minutes ago
                I think they mean breaking the line in the markup, not the output
              • xigoi31 minutes ago
                They mean in the Markdown code, not in the output.
            • jazzypants2 hours ago
              Every markdown implementation is supposed to allow inline HTML.
    • bdcravens2 hours ago
      You're right, but forcing tables to cosplay as DLs was far from the worst way that tables were abused.
      • sodapopcan2 hours ago
        At least <td>s could easily centre things vertically ;)
    • egeozcan2 hours ago
      I always thought the DL as a single row of a table.
  • michalc3 hours ago
    The GOV.UK Design System summary list component is a description list https://design-system.service.gov.uk/components/summary-list...

    And... it also uses the wrapper div for styling

    • 9dev2 hours ago
      The wrapper div is making me a bit sad. These days, using grid layout, you don’t actually need it in most cases
      • petepete6 minutes ago
        The problem with 'in most cases' when it comes to a design system that's used in hundreds of different ways across departments and services, is that some week break.

        I don't really like the div either (I use the design system all day, and maintain a set of components), but it makes documentation much easier.

      • Theodores28 minutes ago
        Absolutely!

        I put dl lists in a grid with no divs needed. As MDN says, div is the last resort, invariably there is something better, and nowadays that is grid styling.

        New to me is multiple dd's.

        For legacy layouts littered with divs and classes, display: contents helps get rid of the div wrappers, promoting whatever is wrapped.

        Even with disclosure elements there are ways to avoid div wrappers using the pseudo element for everything enclosed by the details element apart from the summary element.

  • phyzix57613 hours ago
    I'm curious if the spec actually says you can only wrap it with a div because I like to do semantic html and name my elements specific to my domain.
  • rickstanley3 hours ago
    I've used this a good amount of times, when I coded in front end projects. The first time gave me that satisfying feeling of using the right tool for the job, like completing a puzzle of HTML semantics. I remember JAWS not announcing it correctly in 2018, not sure if it's better now.
    • wizzwizz43 hours ago
      When I checked in 2024 or 2025, Windows Narrator announced it differently in Chrome, Firefox, Edge (Chromium mode) and Edge (IE mode), and none of them worked how I would expect them to. Adrian Roselli's verdict (https://adrianroselli.com/2025/01/updated-brief-note-on-desc...):

      > Description list support continues to be generally good (with VoiceOver still the outlier), even if you may not like how it is supported.

      You shouldn't try to fix this kind of thing by mangling the HTML, since (1) users tend to be used to their screen reader's quirks, and (2) in situations like these, making it juuuust right in one screen reader is likely to make it incomprehensible in another. But it is important to be aware of these quirks, so you don't accidentally design an interface that relies on less-quirky behaviour.

  • shermantanktop2 hours ago
    The <dl> tag seems to cover a subset of a broad semantic space, but doesn’t easily extend beyond adding another <dd>.

    I dunno, I guess I’m a caveman. If it looks right and works (including accessibility) then I figure I’m pursuing something that doesn’t matter a lot.

    • callc32 minutes ago
      Shameless plug: you might be interested in https://calvinlc.com/p/2026/02/11/everything-is-a-div.html

      I need to learn more about web accessibility, but if you completely ignore it (and other sane practices) HTML looks really simple.

      I think the design of HTML is just too much. There’s so many tags that don’t do much. It’s like w3c decided that any common thing people use in websites needs a tag. The end result is more and more tags…

      Can anyone convince me otherwise? It screams design red-flags to me.

      PS: I love the web and think it’s the best platform and future platform we have at the moment. It’s just quirky and loves not breaking old websites!

  • Telemakhos3 hours ago
    I was a bit surprised to see nested <div>s given as some sort of precursor pattern, when <dl> was part of HTML before 2.0 back in the days of table layout.
    • xigoi21 minutes ago
      It’s probably aimed at React developers, many of which are probably not even aware that elements other than <div> exist.
  • tln2 hours ago
    > Admittedly, however, support for the <dl> element is not yet universal.

    Wait what? <DL> has been in HTML since.. the first draft in 1993!

    I like DL's but they can be challenging to style. This article is using a lot of fixed pixel widths which would break on really small screens or larger data.

    • 3eb7988a1663an hour ago
      Granted, I do not know what I am doing with CSS, but the Character Sheet example seems standard flexible elements?

      Some of the extracted CSS chunks

        #statblock{
          box-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 10px 10px -5px rgba(0,0,0,.04);
          font-family:Lato,'Trebuchet MS',sans-serif;
          font-size:85%;
          min-width:50ch;
          max-width:70ch;
          margin-inline:auto;
          background-color:#fffaf0;
          padding-inline:2rem;
          padding-block:1rem
        }
        dl.statblock-bio{
          color:maroon;
          line-height:1.5;
          border-top:5px solid maroon;
          border-bottom:5px solid maroon;
          margin-block:0.75em;
          padding-block:0.75em
        }
        dl.ability-scores{
          min-width:40ch;
          display:flex;
          justify-content:space-around;
          color:maroon
        }
        dl.ability-scores>div{
          text-align:center;
          line-height:1.5
        }
        dl.ability-scores dt{
          font-weight:700
        }
    • an hour ago
      undefined
  • turtleyacht4 hours ago
    Hoped to see CSS for the alternative, where <div> is not nested inside the <dl>. Too used to thinking of div as "layout containers."
  • 3 hours ago
    undefined
  • gbeardish3 hours ago
    What about multiple '&lt;dt&gt;' for one or more '&lt;dd&gt;'?
  • Finnucanean hour ago
    We've always used this in our ebooks for abbreviation and glossary lists. The problem I've always had is that you need to use a bit of css to make two lined-up columns. I've done it with floats. Now, some ebook readers will support grid and flex-box, which give better results, but the Kindle still does not. Kindle is sort of the IE6 of the ebook world.
  • MattRix3 hours ago
    Good title
  • smitty1e2 hours ago
    This seems a clear enough win for things that would fit into a simple python dictionary.

    Why is it preferred over <table> for laying out columns via a the character attributes at the bottom of TFA?

  • mockbuild2 hours ago
    it's on archive html5 .flac 16-bit 44.1kHz no <dl> flag.
  • jdw643 hours ago
    blog looks beautiful. I really wish I had this kind of talent for frontend.