A description list — also called a definition list — is an HTML structure built from <dl>, <dt>, and <dd> that pairs terms with their definitions, descriptions, or values. It is the correct semantic markup for glossaries, product specifications, metadata blocks, FAQ-style key/value pairs, and schedules — anywhere a name maps to a value.
<dl> (the container), <dt> (description term — the "key"), <dd> (description details — the "value").<dt> must be followed by at least one <dd>. A single term can have multiple <dd> elements, and multiple <dt> elements can share one <dd> (e.g. synonyms with one definition).<dt> and <dd> must be direct children of <dl> — or, since HTML 5.3, wrapped in a single <div> for styling.<dt> with its <dd> when navigating.<dl> spec blocks are eligible for Google rich results (Product structured data) and are parsed cleanly by AI search engines for citation in shopping answers.Think of <dl> as the HTML version of a dictionary entry: the term is the headword, the description is everything that explains it. When the relationship is wrong — terms without descriptions, layouts dressed up as lists — assistive technology cannot tell the user which value belongs to which key.
<dl> is the only native HTML element that conveys a key/value relationship. Using the wrong element costs you on three fronts:
<p><strong>Color:</strong> Red</p>, the screen reader reads "Color, Red" as a single paragraph — there is no machine-readable link between the label and the value, no list announcement, and no way to jump term-to-term.<dl> as structured key/value data. A product page with <dl>spec blocks is significantly more likely to be cited correctly when an AI Overview answers "what is the weight of product X?"<dl> helps Google associate Schema.org Product properties with their values without ambiguity.<dl> (or skipping it) removes that affordance.The structure is strict but flexible. Each <dt> can be followed by one or more <dd> elements; consecutive <dt> elements share the <dd> that follows. Since HTML 5.3, a single <div> may wrap a term/description group purely for styling — it does not change the semantics.
<!-- Bad: visual key/value with no semantics -->
<p><strong>Color:</strong> Red</p>
<p><strong>Weight:</strong> 2 kg</p>
<p><strong>Material:</strong> Aluminum</p>
<!-- Bad: tabular layout for what is really key/value data -->
<table>
<tr><td>Color</td><td>Red</td></tr>
<tr><td>Weight</td><td>2 kg</td></tr>
</table>
<!-- Good: a proper description list -->
<dl>
<dt>Color</dt>
<dd>Red</dd>
<dt>Weight</dt>
<dd>2 kg</dd>
<dt>Material</dt>
<dd>Aluminum</dd>
</dl>
<!-- Good: one term, multiple descriptions -->
<dl>
<dt>Accessibility</dt>
<dd>The practice of making content usable by people with disabilities.</dd>
<dd>A baseline requirement under WCAG 2.2.</dd>
</dl>
<!-- Good: synonyms sharing one definition -->
<dl>
<dt>CEO</dt>
<dt>Chief Executive Officer</dt>
<dd>The highest-ranking executive in an organization.</dd>
</dl>
<!-- Good (HTML 5.3): <div> wrappers for styling only -->
<dl>
<div class="row">
<dt>Published</dt>
<dd>2025-05-21</dd>
</div>
<div class="row">
<dt>Author</dt>
<dd>Saar Twito</dd>
</div>
</dl>Misused <dl> markup rarely shows up as a visual bug, so it usually goes uncaught until a screen reader user encounters it. Use these checks:
<dt>/<dd> elements outside a <dl> container, orphaned terms with no description, and content patterns (spec sheets, glossaries) that should be using <dl> but are not.<dl> is announced as "description list" with the term and value paired.<dt>/<dd> outside <dl>, illegal child elements, and other structural errors.<dl> exposes the role list; <dt> and <dd> expose listitem.The relationship must be "this term maps tothis value." Glossary entries, product specifications, metadata blocks, schedules, and FAQ pairs all qualify. A visual two-column layout that does not express a key/value relationship is not a definition list.
An orphaned <dt> is invalid HTML and breaks the semantic contract. If you do not have a description, do not use <dl>.
When two or more terms share a single definition, list the <dt> elements consecutively before a single <dd>. This is the canonical pattern for synonyms, abbreviations, and aliases.
A term with several distinct meanings or values (a dictionary headword with multiple senses, a spec field with multiple values) should have one <dt> followed by multiple <dd> elements.
Do not wrap <dt> or <dd> in <li>, <p>, or other elements. The only allowed wrapper is a single <div> per group (HTML 5.3+), and only for styling.
Use <table> for genuinely tabular data (rows and columns of related records). For key/value blocks like product specs, <dl> is more accurate and easier for screen reader users to navigate — they get a list, not a table to traverse cell by cell.
Want a two-column layout? Use CSS Grid on the <dl> (or on the optional <div> wrappers). Do not flatten the structure into <p> tags to make styling easier — you lose the semantics.
dl {
display: grid;
grid-template-columns: max-content 1fr;
column-gap: 1rem;
row-gap: 0.5rem;
}
dt { font-weight: 600; }
dd { margin: 0; }Conversational dialogue, sequential steps, navigation menus, and form labels each have their own correct element (<p>, <ol>, <nav> + <ul>, <label>). Reusing <dl> for them confuses assistive technology.
What is happening: The author wrote <dt>/<dd> directly in the document body or inside a <ul>/<li>, breaking the contract. HTML validators flag this; screen readers either ignore the elements or mis-announce them.
Fix: Wrap the term/description pairs in a <dl> container. Remove any <li> wrappers — <dt> and <dd> are themselves the list items.
What is happening: Each spec is rendered as <p><strong>Weight:</strong> 2 kg</p>. There is no machine-readable relationship between the label and the value, so screen readers, AI engines, and Google all read it as plain prose.
Fix: Replace with a single <dl> containing one <dt>/<dd> pair per spec. Style it with CSS Grid to keep the same visual layout.
What is happening: Designers grab <dl> because it looks like "label on the left, content on the right." But the content is not actually a key/value pair — it is a heading and a paragraph, or a navigation label and a link.
Fix: Use the correct element for the content (<h3> + <p>, <ul>, <nav>, etc.) and lay it out with CSS. Reserve <dl> for true key/value data.
What is happening: A term was added but its <dd> was never written, leaving a <dt> followed immediately by another <dt> with no description in between. Screen readers announce the term but cannot pair it with a value.
Fix: Either add the missing <dd>, or — if the two terms share the same following description — leave them stacked but ensure a <dd> appears before the next group.
All three elements look similar at a glance, but they communicate different relationships to assistive technology and search engines. Pick the one that matches the actual semantics of the data.
| Element | Best Used For | Relationship It Conveys | When to Avoid |
|---|---|---|---|
<dl> | Glossaries, product specs, metadata, FAQ key/value, schedules | Term maps to definition or value | Items that are not key/value pairs |
<ul> | Navigation, feature lists, unordered collections | Items belong to the same group, no order, no key/value relationship | When each item has a label/value structure |
<ol> | Step-by-step instructions, ranked lists | Items in a meaningful sequence | When order does not matter |
<table> | Rows of related records with multiple columns | Cross-referenced data across rows and columns | Single-pair key/value data (use <dl> instead) |
They are the same element. HTML4 called it a "definition list" and the elements were "definition term" and "definition description." HTML5 renamed it to "description list" and broadened the scope to any term/value pairing — not just dictionary-style definitions. The tags (<dl>, <dt>, <dd>) and behavior are unchanged.
Yes. A term with multiple definitions, values, or explanations should have one <dt> followed by as many <dd> elements as needed. Screen readers announce each description in sequence and keep them associated with the same term.
Yes. Stack the <dt> elements consecutively, then provide one <dd>. This is the right pattern for synonyms, abbreviations, and aliases (e.g. "CEO" / "Chief Executive Officer" sharing one definition).
Do both. <dl> with <dt> for the question and <dd> for the answer is the correct semantic markup for the visible HTML. FAQPage JSON-LD structured data is a separate, machine-readable layer that helps Google generate rich results. They complement each other.
Yes — since HTML 5.3 (2018), a single <div> may wrap one <dt>/<dd> group inside a <dl>, purely for styling. Major browsers and screen readers ignore the wrapper for accessibility purposes. Do not nest other elements; do not use <li>.
Yes. Generative engines parse <dl> as structured key/value data and are far more likely to extract individual fields cleanly when summarizing or citing a page. A product page that uses <dl> for its spec sheet is materially more likely to have its specs quoted accurately in an AI Overview answer. Loose <p><strong>Label:</strong> value</p> markup forces the engine to guess at the structure.
Indirectly but meaningfully. Google does not rank pages higher purely because they use <dl>, but semantic markup makes it easier for Google to associate Schema.org Product properties with the right values, which feeds product rich snippets and shopping results. Combined with proper JSON-LD, <dl> spec blocks improve the odds of earning a rich snippet.
<dl> is one of the most under-used semantic elements in HTML and one of the easiest accessibility wins. Whenever your content pairs a term with a value — a glossary, a product spec sheet, a metadata block, an FAQ — switch from <p>-with-bold-labels or layout tables to <dl>. The change is invisible to sighted users (with the right CSS) but transforms the experience for screen reader users, AI search engines, and Google's rich-results pipeline.
Run a Greadme deep scan to find every page where definition-list semantics are missing or misused, and to get a one-click fix for each one.