PAYATHON 2026

如何用响应式 description list 展示可访问的键值对?

数据小许

结论

如果内容由标签和对应说明组成,建议用 HTML 的 <dl>、<dt> 和 <dd> 表示,再通过 CSS Grid 控制列数。每组标签和值作为一个完整条目,按阅读顺序放进 DOM。宽屏显示两列,窄屏切换为一列。这样可以避免用 role="table" 模拟表格,也不用为屏幕阅读器维护隐藏副本。

用 description list 表示键值对

原示例用 <div role="table>、role="rowheader" 和 role="cell" 表达键值对。对于这类数据,原生描述列表更直接:<dt> 表示名称,<dd> 表示对应的值。

<dl class="kv-list">
  <div class="kv-item">
    <dt>Label 1</dt>
    <dd>Value 1</dd>
  </div>
  <div class="kv-item">
    <dt>Label 2</dt>
    <dd>Value 2</dd>
  </div>
  <div class="kv-item">
    <dt>Label 3</dt>
    <dd>Value 3</dd>
  </div>
  <div class="kv-item">
    <dt>Label 4</dt>
    <dd>Value 4</dd>
  </div>
</dl>

每个 .kv-item 在 DOM 中都按“标签、值”的顺序排列。网格调整视觉布局时,标签和值仍保持成对关系。

.kv-list {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 0.5rem 1rem;
  margin: 0;
  border: 1px solid black;
}

.kv-item {
  display: grid;
  grid-template-columns: max-content minmax(0, 1fr);
  gap: 0.5rem;
  padding: 0.5rem;
}

.kv-item dt {
  font-weight: bold;
}

.kv-item dd {
  margin: 0;
}

@media (max-width: 40rem) {
  .kv-list {
    grid-template-columns: 1fr;
  }
}

40rem 是布局断点示例,可以根据内容宽度和实际设计调整。minmax(0, 1fr) 能让网格轨道收缩,减少长内容撑破列宽的情况。如果值中可能出现很长且没有空格的字符串,还可以设置 overflow-wrap: anywhere。

何时使用原生表格

如果数据需要按行和列比较,并且列结构明确,应使用原生 <table>、<tr>、<th scope="row"> 和 <td> 表达表格关系,再用 CSS 设置视觉样式。单纯的名称和值列表通常更适合用 <dl>。结构应根据数据关系选择,而非根据视觉布局需要的列数决定。

关于选中状态

如果某项只需要显示选中样式,可以在对应的 .kv-item 上设置状态类,再通过 CSS 呈现,无需复制一份屏幕阅读器专用列表。如果用户可以操作选择项,则应根据交互方式使用原生控件,例如单选时使用 radio,并确保控件有可访问名称。静态描述列表不应仅为了标记视觉选中状态而改造成 ARIA 交互组件。

备注:内容仅供参考。