Figma 描述列表与详情键值对系统(Descriptions & Key-Value Pair Architecture)组件架构实战:从水平/垂直双拓扑对齐、响应式列数断点、多样化数据插槽解耦到 Dev Mode 语义化 HTML <dl> / Ant Design 规范交付

2026 年 11 月 13 日

在云计算控制台、ERP 供应链中台、CRM 客户管理系统、电商订单详情页以及审计追踪面板中,用户绝大多数的操作时间都在查阅与核对结构化信息。与承载录入功能的表单(Form)和展示批量明细的数据表格(Data Table)不同,描述列表(Descriptions / Key-Value Details) 专为清晰、紧凑且成组地展示多维度“键值对(Label-Value Pairs)”数据而生。

然而,在日常的设计协同与组件库维护中,描述列表往往是视觉混乱与研发摩擦的高发区:

  1. 对齐基线混乱:不同页面中的标签名(Label)与数值(Value)间距各异,冒号对齐忽左忽右;当标签文本由于多语言国际化或专业术语过长时,直接将右侧数值挤出画板;
  2. 拓扑结构无规范:设计师混用“水平内联(Label 与 Value 同行)”和“垂直堆叠(Label 在上、Value 在下)”,缺乏根据容器宽度自动适配的响应式断点规则;
  3. 跨列与网格失真:多列布局(如 3 列或 4 列网格)中,某些长文本项(如“备注说明”或“部署公钥”)需要横跨整行(Colspan = Full),但在 Auto Layout 嵌套下容易导致左右相邻列宽度断裂;
  4. 数据插槽扩展性差:业务数值远不止纯文本,经常混排状态徽标(Tag)、一键复制图标、问号帮助气泡(Tooltip)与跳转超链接,传统变体复制方式导致组件数量急剧膨胀;
  5. 研发交付语义失真:前端工程师在 Dev Mode 开发模式 中看到的是大量生硬的嵌套 div 与绝对像素,难以判断应该映射为 W3C 标准的 <dl><dt><dd> 描述列表标签,还是 Ant Design 的 Descriptions 网格系统。

本文将深入拆解描述列表的设计系统架构,通过原子项插槽解耦、双拓扑 Auto Layout 编排、边框网格 1px 细线防重叠机制,并输出无障碍合规的前端交付方案。


描述列表核心形态选型矩阵与业务场景 #

根据界面的物理空间限制与信息密度诉求,描述列表主要分为 4 种典型形态。在建立 组件与变体 前,需明确其场景边界:

结构形态 布局特征与视觉风格 典型适用业务场景 空间利用率 研发实现建议
水平内联·无边框 (Horizontal Clean) 标签与数值水平同排,仅以适量间隙或冒号分隔,底色透明 侧边抽屉详情、紧凑型卡片内元数据展示、移动端订单信息 ★★★★☆ Flexbox 弹性行,Label 固定宽度(如 100~140px)
水平内联·网格边框 (Horizontal Bordered) 具有完整的 1px 浅灰边框与浅灰色标签背景,呈现规整表格感 金融审批单据、政企合同协议审查、云服务器配置规格单 ★★★☆☆ CSS Grid 或 HTML Table 规范,标签栏与内容栏严格对齐
垂直堆叠·卡片流 (Vertical Stack) 标签在上(字号略小、弱化颜色),数值在下,上下两行结构 窄屏移动端界面、多列复杂指标对比、数据看板概览模块 ★★★★★ 纵向 Auto Layout,完美避免中英文标签长度不一时横向挤压
紧凑键值·微型浮层 (Compact Micro) 极小字号(12px),标签与数值之间使用点号(·)或灰色斜线弱隔离 Tooltip 浮层内部、表格展开行、折叠面板元数据头 ★★★★★ 行内内联流排版,支持自动换行截断

原子单项(Descriptions Item)插槽解耦与基线对齐 #

描述列表由若干个独立的“键值对单项(Item)”构成。要实现高扩展性,必须将原子项解耦为标准的插槽结构。

1. 原子项结构拆解 #

通过水平与垂直 Auto Layout 组合,构建包含完整插槽的通用原子项:

[Descriptions Item] (Auto Layout: Horizontal, Align Items: Baseline / Top, Fill Container)
  ├── [Left Slot: Label Area] (Auto Layout: Horizontal, Fixed W: 120px 或 Hug, Spacing: 4px)
  │     ├── [Required Asterisk] (红色星号 *, 布尔属性: showRequired)
  │     ├── [Label Text] (14px, 颜色: text/secondary 灰文本, 支持中英文字符)
  │     ├── [Help Tooltip Icon] (14×14px 问号图标, 布尔属性: showHelp)
  │     └── [Colon / Delimiter] (冒号 ":", 边框模式下隐藏, 无边框模式下显示)
  │
  └── [Right Slot: Content / Value Area] (Auto Layout: Horizontal, Fill Container, Spacing: 8px)
        ├── [Primary Value Text] (14px, 颜色: text/primary 高亮黑, 支持换行)
        ├── [Status Tag Slot] (状态胶囊标签, 实例交换属性: TagInstance)
        ├── [Copy Action Slot] (复制图标按钮, 布尔属性: canCopy)
        └── [Link Action Slot] (跳转查看详情文字链, 布尔属性: hasLink)

2. 关键排版陷阱:文本基线对齐(Align Text Baseline) #

在配置水平内联单项时,若直接使用 Auto Layout 默认的“垂直居中对齐(Align vertical center)”,当右侧 Value 包含大号数值、多行文本或内嵌带有 Padding 的标签(Tag)时,左侧的 Label 会发生上下悬空漂移。

解决方案:

  1. 选中原子项 Auto Layout 容器;
  2. 打开高级布局设置(Advanced layout settings),勾选 Align text baseline(基线对齐);
  3. 确保 Label 文本与 Value 文本的 line-height 行高保持规范级对齐(例如统一设定为 20px 或 22px)。此时无论右侧内容如何扩展,第一行文字的底端基线始终在一条水平线上!

多列网格(1~4 列)与响应式跨列(Span)排版机制 #

在不同视口断点下,描述列表需要动态切换列数以保持最佳可读性。结合 Auto Layout 动态布局 与弹性约束规则:

┌────────────────────────────────────────────────────────────────────────┐
│ [Descriptions Grid: 3 Columns Desktop Breakpoint]                      │
├──────────────────────────────────┬──────────────────┬──────────────────┤
│ 用户名: 张伟                     │ 部门: 体验技术部 │ 职位: 资深架构师 │
├──────────────────────────────────┴──────────────────┼──────────────────┤
│ 部署环境: 华东1 (杭州) 生产可用区 A                 │ 状态: [正常运行] │
├─────────────────────────────────────────────────────┴──────────────────┤
│ 备注说明 (Colspan: 3): 该集群承载双十一大促核心链路结算服务,严禁非工作时段热更新。 │
└────────────────────────────────────────────────────────────────────────┘

1. 响应式列数断点策略 #

屏幕断点 容器宽度 (Width) 推荐列数 (Columns) 拓扑模式 跨列处理原则
Desktop 大屏 ≥ 1200px 3 列或 4 列 水平内联 辅助属性 1 列,长文本/安全证书占满全行(Span All)
Laptop 标准笔记本 768px ~ 1199px 2 列 水平内联 标准两列等分,Label 统一锁定为 120px 宽度
Mobile / Drawer 窄屏 < 768px 1 列 垂直堆叠 全部坍缩为单列,Label 在上、Value 在下,消除水平滚动

2. 跨列(Colspan)工程化配置技巧 #

在 Figma 中,Auto Layout 并不像 HTML 原生表格那样直接支持 colspan="2" 属性。为了在组件化中优雅支持跨列:

  • 行容器组合法:将描述列表划分为多行(Row Frame),每行本身是一个横向 Auto Layout 容器(宽度设置为 Fill container);
  • 单列撑满项(Full Width Item):直接放置在行内,宽度设置为 Fill container,并在组件属性中提供 Span: 1 | 2 | Full 预设;
  • 两列/三列等分项:行内放置 2 或 3 个单项,每个单项的宽度统一设置为 Fill container,容器会自动等比平分整行空间,丝毫不受窗口拉伸影响。

边框网格(Bordered)模式下的 1px 细线防重叠机制 #

在金融与政企后台中,带浅灰边框的表格型描述列表(Bordered Descriptions)十分普遍。然而,许多设计师在手工绘制时,给每个单元格四周都加上 1px Stroke,导致相邻单元格拼接处产生 2px 粗黑线 的视觉瑕疵。

1. 1px 纯净网格设计令牌与分层规则 #

遵循规范的设计系统做法:

  1. 外层包裹容器(Outer Container):
    • 整体赋予 1px Solid 完整外框(四周描边),圆角通常设为 6px 或 8px;
    • 勾选 Clip content: ON,确保内部单元格的直角不会溢出外层圆角;
  2. 内层行(Row Frame):
    • 仅设置 下描边(Bottom stroke: 1px);最后一行通过变体关闭下描边,防止与外层底边框重叠;
  3. 单元格列分隔(Cell Divider):
    • 内部每个单元格仅保留 右描边(Right stroke: 1px);当前行的最后一个单元格关闭右描边;
  4. 背景色语义绑定:
    • Label 单元格背景填充为 color/bg/muted (#F8FAFC / 暗色 #1E293B);
    • Value 单元格背景填充为 color/bg/container (#FFFFFF / 暗色 #0F172A)。

通过该结构拼接出来的网格,无论在 100% 缩放还是高分屏放大下,所有交汇线条均为严格标准的 1px,完美与前端渲染结果 1:1 吻合。


Dev Mode 前端工程代码交付与 W3C 语义规范 #

在通过 Dev Mode 开发模式 交付前端开发时,不仅要输出样式代码,更要明确底层 DOM 结构的语义要求。

┌────────────────────────────────────────────────────────┐
│ [Dev Mode Component Inspection: Descriptions]          │
├────────────────────────────────────────────────────────┤
│ • Semantic Tag: <dl> (Description List)                │
│ • Term (Label): <dt class="font-medium text-slate-500">│
│ • Details (Value): <dd class="text-slate-900">         │
│ • CSS Architecture: CSS Grid with subgrid / Flex-col   │
│ • Keyboard / A11y: Native screen-reader pair reading   │
└────────────────────────────────────────────────────────┘

1. 现代 React + TypeScript + Tailwind CSS 标准实现 #

import React from 'react';

export interface DescriptionItem {
  key: string;
  label: React.ReactNode;
  children: React.ReactNode;
  span?: number; // 跨列数,默认 1
}

export interface DescriptionsProps {
  title?: string;
  bordered?: boolean;
  column?: number; // 默认 3 列
  items: DescriptionItem[];
  layout?: 'horizontal' | 'vertical';
}

export const Descriptions: React.FC<DescriptionsProps> = ({
  title,
  bordered = false,
  column = 3,
  items,
  layout = 'horizontal'
}) => {
  return (
    <div className="w-full">
      {title && <h4 className="text-base font-semibold text-slate-900 mb-4">{title}</h4>}

      {/* 使用 W3C 推荐的语义化 <dl> 描述列表标签 */}
      <dl
        className={`w-full ${
          bordered
            ? 'border border-slate-200 rounded-lg overflow-hidden divide-y divide-slate-200 bg-white'
            : 'flex flex-wrap gap-y-4'
        }`}
      >
        <div
          className={`w-full grid ${
            bordered ? 'divide-x divide-slate-200' : 'gap-x-8 gap-y-4'
          }`}
          style={{ gridTemplateColumns: `repeat(${column}, minmax(0, 1fr))` }}
        >
          {items.map(item => {
            const spanStyle = item.span ? { gridColumn: `span ${item.span} / span ${item.span}` } : {};

            if (bordered) {
              return (
                <div
                  key={item.key}
                  style={spanStyle}
                  className={`flex ${layout === 'vertical' ? 'flex-col' : 'flex-row'}`}
                >
                  <dt className="w-32 flex-shrink-0 bg-slate-50 px-4 py-3 text-sm font-medium text-slate-600 border-r border-slate-200 flex items-center">
                    {item.label}
                  </dt>
                  <dd className="flex-1 px-4 py-3 text-sm text-slate-900 flex items-center min-w-0 break-words">
                    {item.children}
                  </dd>
                </div>
              );
            }

            return (
              <div
                key={item.key}
                style={spanStyle}
                className={`flex ${layout === 'vertical' ? 'flex-col gap-1' : 'flex-row gap-2 items-baseline'}`}
              >
                <dt className="text-sm font-normal text-slate-500 whitespace-nowrap">
                  {item.label}
                  {layout === 'horizontal' && ':'}
                </dt>
                <dd className="text-sm font-medium text-slate-900 min-w-0 flex-1 break-words">
                  {item.children}
                </dd>
              </div>
            );
          })}
        </div>
      </dl>
    </div>
  );
};

2. 无障碍与复制体验优化要点 #

  • 屏幕阅读器支持:使用 <dl><dt><dd> 结构,NVDA、VoiceOver 等屏幕朗读器会自动将其识别为关联键值对,朗读格式为:“属性:[Label 内容],值:[Value 内容]”,显著提升无障碍体验;
  • 防冒号多重污染:在水平无边框模式下,通过 CSS 伪元素 ::after { content: ':'; } 注入冒号分隔符,避免用户在双击复制文本内容时意外选中冒号符号;
  • 长文本折行防御:在数值单元格上严格声明 break-words 或 word-break: break-all,防止没有空格的超长字符串(如哈希校验码、IP 地址、长 URL)横向撑爆栅格容器。

更多关于中后台数据呈现体系的设计令牌规范与复杂表格交互,可交叉参考本站 复杂数据表格系统、响应式断点与流体网格系统 以及 设计系统 Tokens 速查。

❓ 常见问题与答疑 (FAQ)

高频疑难解析与避坑指南
A

完全不需要。绝大多数核心功能在免费 Starter 计划中均可完整体验与实操练习,无需额外付费购买付费团队版。