Figma 描述列表与详情键值对系统(Descriptions & Key-Value Pair Architecture)组件架构实战:从水平/垂直双拓扑对齐、响应式列数断点、多样化数据插槽解耦到 Dev Mode 语义化 HTML <dl> / Ant Design 规范交付
在云计算控制台、ERP 供应链中台、CRM 客户管理系统、电商订单详情页以及审计追踪面板中,用户绝大多数的操作时间都在查阅与核对结构化信息。与承载录入功能的表单(Form)和展示批量明细的数据表格(Data Table)不同,描述列表(Descriptions / Key-Value Details) 专为清晰、紧凑且成组地展示多维度“键值对(Label-Value Pairs)”数据而生。
然而,在日常的设计协同与组件库维护中,描述列表往往是视觉混乱与研发摩擦的高发区:
- 对齐基线混乱:不同页面中的标签名(Label)与数值(Value)间距各异,冒号对齐忽左忽右;当标签文本由于多语言国际化或专业术语过长时,直接将右侧数值挤出画板;
- 拓扑结构无规范:设计师混用“水平内联(Label 与 Value 同行)”和“垂直堆叠(Label 在上、Value 在下)”,缺乏根据容器宽度自动适配的响应式断点规则;
- 跨列与网格失真:多列布局(如 3 列或 4 列网格)中,某些长文本项(如“备注说明”或“部署公钥”)需要横跨整行(Colspan = Full),但在 Auto Layout 嵌套下容易导致左右相邻列宽度断裂;
- 数据插槽扩展性差:业务数值远不止纯文本,经常混排状态徽标(Tag)、一键复制图标、问号帮助气泡(Tooltip)与跳转超链接,传统变体复制方式导致组件数量急剧膨胀;
- 研发交付语义失真:前端工程师在 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 会发生上下悬空漂移。
解决方案:
- 选中原子项 Auto Layout 容器;
- 打开高级布局设置(Advanced layout settings),勾选
Align text baseline(基线对齐); - 确保 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 纯净网格设计令牌与分层规则 #
遵循规范的设计系统做法:
- 外层包裹容器(Outer Container):
- 整体赋予
1px Solid完整外框(四周描边),圆角通常设为6px或8px; - 勾选 Clip content: ON,确保内部单元格的直角不会溢出外层圆角;
- 整体赋予
- 内层行(Row Frame):
- 仅设置 下描边(Bottom stroke: 1px);最后一行通过变体关闭下描边,防止与外层底边框重叠;
- 单元格列分隔(Cell Divider):
- 内部每个单元格仅保留 右描边(Right stroke: 1px);当前行的最后一个单元格关闭右描边;
- 背景色语义绑定:
- Label 单元格背景填充为
color/bg/muted(#F8FAFC/ 暗色#1E293B); - Value 单元格背景填充为
color/bg/container(#FFFFFF/ 暗色#0F172A)。
- Label 单元格背景填充为
通过该结构拼接出来的网格,无论在 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)
高频疑难解析与避坑指南完全不需要。绝大多数核心功能在免费 Starter 计划中均可完整体验与实操练习,无需额外付费购买付费团队版。