2025年12月06日·阅读约1分钟

无代码 UI 构建器中的设计 token:保持主题一致性的实践

在无代码 UI 构建器中使用设计 token,可以一次性定义颜色、排版、间距和变体,从而无需凭感觉即可发布一致的界面。

无代码 UI 构建器中的设计 token:保持主题一致性的实践

为什么团队会出现不一致的 UI

UI 不一致很少一开始就是“设计问题”。它通常是时间问题。有人现在就需要一个按钮,于是他们从别的页面复制一个并做点修改,直到看起来差不多为止。

这就是微小差异悄悄出现的方式:两个几乎相同的蓝色,圆角从 6 变到 8,标题“有点粗”,内边距取决于谁搭建了页面。在无代码构建器里,更容易做出一次性的微调,因为控件触手可及,改动看起来无害。

随着产品增长,漂移会加速。页面越多,重复模式就越多。参与构建的人越多,个人偏好就越显著。团队成员越多,“临时修复”在孤立情况下就越常见。如果一个人做客户门户,另一个人做管理面板,你最终会得到同一品牌的两种不同诠释。

“凭感觉”在日常工作中随处可见:挑颜色直到“看着对”,把间距挪几像素因为屏幕感觉“太紧”,创建新的按钮样式而不是使用现有的,混用字号因为默认看起来“有点小”,或者修复一个屏幕却没有检查其他地方。

成本会在后期显现。评审变慢,因为反馈变得主观(“让它感觉更像另一个页面”)。返工堆积,因为难以将更改应用到所有地方。Web 与移动走样,因为不同的人做出了相似但不相同的选择。

设计 token 通过用共享的值替代“差不多合适”的决策来解决这个问题。即使团队和应用增长,UI 也能保持一致。

用通俗的话说什么是设计 token

设计 token 是对 UI 的命名决策。不是说“用这个蓝色”或“让按钮感觉宽松”,而是把这些选择用清晰的名字标注,任何人都能复用。

Token 本身并不是原始值。原始值可能是 16px、#2563EB 或 600(字体粗细)。token 是解释该值在产品中含义的标签,比如 space-4color-primaryfont-weight-semibold

这种转变能阻止凭感觉选择的习惯。当人们按感觉挑值时,会慢慢积攒出五个略有不同的蓝、三个稍有差异的标题和在不同屏幕间变化的间距。

Token 最好作为单一真相来源(single source of truth)存在。如果每个屏幕和组件都引用同一套名字,那么你可以通过更新少数 token 值来改变整个应用的外观,而不是在几十个屏幕里逐个查找并修改。

Token 还搭建了设计与构建之间的桥梁。设计师在规范中使用 token 名称,构建者在无代码 UI 构建器中使用相同名称,这样设计在交接时得以保留。

大多数 token 集合分为几类:颜色角色(primary、background、text、danger)、排版(字体系列、字号、粗细、行高)、间距步进(内边距、外边距、间隙)、形状与层次(圆角、边框宽度、阴影),有时还有动效(时长与缓动)。

大多数产品实际需要的 token 集合

大多数团队并不需要庞大的 token 库。他们需要一套小而清晰的集合来覆盖大多数页面,以便人们不再猜测数值。在无代码工具中这点尤为重要,因为“就这一次”的微调传播得很快。

一个实用的入门集覆盖五类:

  • 颜色:一些品牌角色(primary、secondary)、一套中性色(文本、背景、边框)和状态角色(success、warning、error)。如果经常用到,添加 hover 和 disabled 角色。
  • 排版:一种字体(最多两种)、一个小的字号尺度(例如 12/14/16/20/24/32)、实际使用的粗细以及匹配的行高。
  • 间距:简洁的阶梯(例如 4/8/12/16/24/32)用于内边距和间隙。
  • 形状与效果:几种圆角(none/sm/md/lg)、边框宽度和一小套阴影(0-3)。
  • 动效(可选):仅在应用使用动画时添加,2-3 种时长和 1-2 种缓动命名即可。

有一条规则能让库保持理智:如果某个值在三处或更多地方出现,就把它做成 token。如果只有一次出现,就先怀疑一下,别让它变成“新常态”。

防止 token 混乱的命名规则

好的 token 名称能在争论发生前就阻止它们。如果人们能在不搜索的情况下猜到 token,便会复用它们。猜不到就会创建新 token,你的主题就会分裂。

优先使用语义名称(不要只写颜色)

优先使用描述 UI 职能的名字,而不是描述外观的名字。text-primary 告诉大家何时使用它。blue-600 只是油漆桶。

一个有用的模式是双层结构:

  • 基础 token:原始构建块,如 color-blue-600space-16font-14
  • 语义 token:基于意义的 UI 角色,如 text-primarybg-surfaceborder-muted

在无代码 UI 构建器中,语义 token 能帮助非设计者快速选择正确的值,而不凭感觉乱改。

新增 token 的规则

大多数 token 库变得混乱是因为“新增”成了默认。把“复用”设为默认。

把规则保持简单:

  • 仅当某个值在 2+ 处 使用,或支持实际的 状态(hover、disabled、error)时才新增 token。
  • 若是一次性的样式,把它保留在组件内部。
  • 若两个 token 的差异微乎其微,就选一个并删除另一个。
  • 若你无法用一句话说明该 token 的用途,就别添加它。

然后统一命名风格。选择一种大小写风格(kebab-case 非常实用),使用稳定前缀(text-bg-border-icon-space-),并保持数值刻度一致(space-4space-8space-12space-16)。

步骤指南:从已有的使用情况定义 token

把 tokens 变成主题
一次性设置全局颜色、排版和间距,然后在应用中复用它们。
立即构建

把当前 UI 当作证据。在创建任何新东西前做个快速清点:收集截图、检查样式,写下生产环境中实际看到的每个颜色值、字号和间距(包括那些只在单屏出现的“一次性”值)。

接下来,有目的地减少重复。你通常会发现五种略有差异的同一灰色,或间距在 14、15、16 之间跳来跳去。选一个值保留,然后把旧值映射到它。这正是 token 变得实用的地方:你不再为品味争论,而是就一小套共享选择达成一致。

一个合理的第一版可以在一次迭代中完成:

  • 调色板 token:原始颜色(品牌色、中性色、反馈色)
  • 语义 token:基于意义的颜色(文本、背景、边框、success、warning)
  • 排版尺度:6-8 个字号并赋予清晰角色(body、label、H1-H3)
  • 间距尺度:6-10 个可复用步进
  • 组件基础:几种标准圆角和阴影

为每个 token 添加一句使用指引:在哪里使用以及哪里不该使用。例如:“text-muted 用于辅助文本,不用于主按钮。”

最后,决定归属。指定一个人(或小团队)来批准变更,并制定简单规则:"只有当现有 token 无法适配时才新增 token。" 这能在产品增长时保持系统稳定。

在无代码 UI 构建器中如何应用 token

从每个屏幕继承的默认值开始:基础文本样式(字体、字号、行高、颜色)、标题样式(H1-H3),以及一小套布局间距规则,避免页面显得随意。

接着,将 token 映射到工具中的主题设置:主题变量、全局样式、样式预设或设计系统设置。目标是选择“Primary”或“Space/16”时选择的是一个 token,而非一次性数值。

把可复用样式集中在日常使用的模式上。入门集可以包含卡片样式(背景、边框、圆角、内边距、阴影)、表单字段样式(标签、输入、帮助文本)、按钮样式,以及表格行密度和 hover 状态。

状态是混乱潜入之处,所以要及早定义。每个交互组件的 hover、focus、disabled、error 都应使用 token 驱动的值。聚焦(focus)应在任何地方使用相同的环形颜色和粗细;错误(error)应在边框和文本颜色配对上始终如一。

最后,规划共享。如果你的工作区支持模板或可复用模块,把 tokens 和基础样式放在一个“起始应用”里,新项目从它复制。这样新屏幕默认就一致了。

保持组件变体一致性

从 tokens 到代码
可视化构建并生成可部署或自托管的生产就绪源代码。
生成代码

变体是 UI 系统要么变得平静可预测,要么变成一堆一次性修改的地方。变体在映射到颜色、排版和间距的 token 时最有效。

先从少量常用组件入手:按钮、输入、徽章、提示和卡片。为它们提供两条相同的选择维度:尺寸意图。尺寸应是机械性的(影响排版与间距);意图应代表含义(语义颜色)。

无猜测的尺寸与意图

当尺寸变体只改变少数基于 token 的属性(字体大小、内边距、圆角)时,它们会保持一致。意图变体应主要改变颜色角色(背景、文本、边框),绝不可悄悄改变间距。

一套覆盖大多数产品的集合:

  • 尺寸:sm、md、lg
  • 意图:primary、secondary、danger
  • 状态:default、hover、focus、disabled

团队可以遵循的交互规则

定义应用于每个组件的状态规则,而不只是按钮。例如:focus 始终显示可识别的环,hover 在一致的方式下提高对比度,disabled 使用相同的不透明度并阻止点击。

只有当某个变体代表经常出现的含义(比如“danger”)时才添加新变体。如果只是一次性布局需求,通常应该是新组件或外层包装,而不是大家日后会滥用的变体。

让 Web 与移动主题保持一致

当产品同时发布到 Web 与移动端时,“同一品牌”不总是“像素一致”。目标是屏幕彼此感觉像一家人,即便各平台有不同的默认值。

先从可以跨平台通行的共享 token 开始:颜色角色(background、surface、text、primary、danger)、排版尺度(字号与粗细)和间距 token(4、8、12、16、24)。这些能消除猜测并使更新可预测。

然后接受实际差异。移动端需要更大的触控目标,通常也需要稍大的间距。Web 端需要更密集的表格、侧栏和多栏布局。字体也可能不同:你可能在 Web 上用品牌字体,但为可读性与性能在 iOS/Android 上使用平台默认字体。

一个实用方法是两层:全局 token 定义含义,平台 token 定义该含义如何呈现。

  • 全局:color.textcolor.primaryspace.mdradius.smtype.body
  • 仅 Web:type.family.webcontrol.height.webspace.tableRow
  • 仅移动:type.family.mobilecontrol.height.mobilespace.touch

保持组件名称一致(如 Button/Primary),即便尺寸不同。发布前对两个主题都进行对比度检查。

治理:如何让 token 随时间保持健康

保持 Web 与移动端一致
用共享的语义 token 和平台特定的尺寸来对齐 Web 与移动端界面。
试试吧

只有当 token 保持稳定且易懂时它们才有效。没有轻量治理,团队会悄悄新增“又一个蓝”或“又一个内边距”,你又回到凭感觉阶段。

轻量的 token 变更流程

保持流程小而真实:

  • 请求:任何人都可以提出新增或修改 token 的请求,并附上截图与原因。
  • 审查:一名设计师与一名开发/构建者检查对关键屏幕的影响。
  • 批准:确认命名、可访问性(对比度、触控大小)以及该 token 是否确实是新需求。
  • 发布:按计划发布更新(每周或每个迭代),而不是零散发布。
  • 通知:说明变更内容以及推荐使用的替代项。

保留简单的变更日志并标注弃用。如果旧 token 被替换,说明应使用何种替代方案,保持旧 token 在一段时间内可用,并明确标记以免新页面继续采用它。

清理工作也是职责的一部分。每月一次移除未使用的 token 与组件变体(或至少标记它们)。

让每个人都能用好 token

非设计者需要示例,而不是理论。

做到:使用间距阶梯控制间隙,使用 Primary Button 变体作为主要操作。

别做:把内边距设为“13px 因为看起来合适”,或者为匹配某屏创建新的按钮样式。

把 token 工作与产品优先级挂钩:新功能、品牌重塑和无障碍修复应驱动 token 更新,而不是个人偏好。

常见错误与陷阱

在 AppMaster 中阻止 UI 漂移
创建基于 token 的 UI 样式,让每个新页面默认保持一致。
试用 AppMaster

失去 token 好处的最快方式是把它们当成杂物收集地。一开始出发点正确,但几个临时修复堆积后,团队又回到凭感觉选择。

一个常见的陷阱是过早创建太多 token。若每个页面都有自己的颜色或间距 token,你不是在构建系统,而是在编目例外。只有当某个值会被共享使用时才新增 token。

另一个隐蔽问题是让原始值偷偷进入组件。有人为按钮设为 14px 的内边距“就这一次”,或在卡片中直接用十六进制颜色。几周后没人记得为何它不同。养成习惯:若是可见且会重复出现,就应该是 token。

还要注意混用 token 类型。基础 token(如 gray-900space-4)描述原始值。语义 token(如 text-primarysurface-muted)描述含义。当某个组件使用基础 token,而另一个组件为相同角色使用语义 token 时,就会出问题。

状态也是后期的痛点。团队常常先定义正常样式,然后在发布前拼凑 focus、hover、disabled 和 error。这就是你最终看到不一致的 focus 环和三种不同“错误红”的原因。

在扩展前做个快速陷阱检查:

  • 将新 token 限制为共享需求,而非一次性页面
  • 尽量避免在组件内部使用原始值
  • 区分基础 token 与语义 token 并一致地应用它们
  • 及早定义状态(focus、error、disabled)
  • 给暗色模式或未来品牌更新留出余地,通过替换语义 token 来实现,而不是重写组件

在扩展前的快速清单

在把 UI 推广到更多页面、团队或产品前,检查基础是否足够清晰以便复制而不会猜测。

  • 颜色角色为语义化。 Token 覆盖文本(默认、muted、inverse)、表面(页面、卡片)、边框(默认、focus)和状态(success、warning、danger)。
  • 类型映射到小尺度。 少量文本样式(H1-H3、body、small),并定义大小、粗细与行高。
  • 间距使用易记步进。 常用内边距与间隙来自紧凑阶梯(4、8、12、16、24)。若“14”不断出现,说明阶梯需要调整。
  • 核心组件有变体。 常用组件应有尺寸(sm/md/lg)和意图(primary/secondary/danger),并与 token 角色匹配。
  • 归属明确。 一个人或小组批准变更,并用轻量例行流程说明:为什么、影响、何时发布。

示例:在门户与管理面板中阻止 UI 漂移

设计系统加完整应用
在一个地方将清晰的 UI 系统与真实的业务逻辑、API 和数据库模型结合起来。
构建应用

一个小团队同时构建两个应用:客户门户和内部管理面板。不同人负责不同屏幕,并在无代码 UI 构建器中快速搭建。几周后,尽管没人能指出具体问题,界面开始让人感觉“不对”。

在使用 token 之前,审查意见叠加:按钮几乎相同但不完全一样,间距在屏幕间跳变,表单字段不一致,门户无意间显得“友好”,而管理面板显得“严格”。

他们通过引入一套小而实用的 token 集修复了问题。定义了语义颜色(Primary、Success、Danger、TextMuted)、间距尺度(4、8、12、16、24)以及按钮变体(Primary、Secondary、Ghost),统一了圆角和状态。

现在贡献者不再在每个页面挑随机的十六进制颜色或字号。他们选择 token 和变体,因此每个新页面都继承相同的决策。

构建速度加快,因为选择已经做出。评审从琐碎的视觉修正转向真正的 UX 问题。“把这个按钮设为 primary 变体”取代了“你能把它调成更蓝点、稍微高一点吗?”

随后一次小规模的品牌重塑到来:主色改变、字号尺度收紧。借助 token,团队只需更新少数值,门户和管理面板就会同时刷新。

下一步:先小规模试点,再逐步标准化

挑一个使用频繁且明显存在漂移的问题流程,如入职流程、设置页面或一个简单表单。把单个流程转换为 token 驱动是最快证明方法并停止凭感觉选择。

从一套小而安全的 token 开始:primary/background/text/border/danger、一个短的字号尺度、一个间距阶梯,以及 2-3 个圆角与阴影等级。然后创建一小套仅使用 token 的组件:一个按钮、一个输入、一个卡片、一个提示。仅在确有必要时才添加变体。

与团队进行短评审,使用两张截图:一张是含有不一致内边距与字体的“之前”屏幕,另一张是用 token 与变体搭建的“之后”屏幕。就几条规则达成一致(例如“不得使用硬编码颜色”和“间距必须使用 token”),先修复最重要的不一致项。

推广时,先把新屏幕转换,随后在触及旧页面时逐步回填。如果支持请求需要新增管理筛选面板,用 token 驱动的组件重建该面板并只替换你正在编辑的部分。

如果你在 AppMaster 中构建完整产品(后端、Web 与移动),尽早设置 token 与可复用 UI 样式能让新页面默认继承相同决策。这样视觉一致性与应用逻辑可以同时向前推进,而不必在后期反复清理。

常见问题

即便有设计师,为什么界面不一致的问题还会持续发生?

UI 漂移通常从一些“小幅度的‘就这一次’修改开始:复制一个组件、调整内边距,或凭感觉挑颜色。随着时间推移,这些细微差异在不同页面和不同协作者之间累积,审查也从快速对照共享规则变成了主观讨论。

设计 token 到底是什么(不用理论解释)?

设计 token 是可复用的命名 UI 决策,用来替代对原始值的猜测。原始值可能是 16px#2563EB,但 token 名称会说明用途,例如 space-16color-primary,这样大家每次都会选择相同的设置。

对于真实产品,我们首先应该定义哪些 token 类别?

先从颜色角色、排版、间距,以及少量圆角和阴影值开始。这能覆盖大部分页面并阻止最常见的“凭感觉”问题,同时保持 token 集合够小,方便团队实际使用。

什么时候应该新增 token,而不是保留一次性样式?

一个实用的默认规则是:当某个值在两个或更多地方出现,或支持实际的状态(如 hover、focus、disabled、error)时,就创建 token。若某个值确实只在一次出现,就把它保留为组件内的局部样式,避免意外成为全局标准。

我们的 token 名称应该用语义(比如 text-primary)还是原始(比如 blue-600)?

推荐使用语义名称,像 text-primarybg-surface,这样人们不需记忆调色板也能正确选择。blue-600 等原始名称适合作为基础构建块,但在组件中直接使用原始名更容易导致颜色被滥用。

如何在不破坏现有体验的情况下,从不一致的 UI 创建 token?

先审计当前已发布的 UI:收集实际使用的颜色、字体大小和间距,然后有目的地合并近似重复的值。把旧值映射到新的 token,这样未来的页面会复用 token,而不是重新引入“几乎相同”的值。

在无代码 UI 构建器中,如何把 token 实际应用起来?

先设置全局默认样式,然后把 token 映射到构建器中所谓的主题变量或全局样式,让组件引用名称而不是十六进制或像素值。接着为常用组件创建一小套可复用样式,并确保其 hover、focus、disabled 和 error 状态也使用 token。

如何为按钮和输入等组件创建变体而不制造混乱?

让变体保持简单、可预测:把变体限制为尺寸(size)和意图(intent)。尺寸只应改变少量基于 token 的属性(字体大小、内边距等),意图应主要替换语义颜色角色,这样“danger”按钮就不会偷偷改变间距或排版。

如何在不强求像素一致的情况下,将 Web 与移动主题对齐?

共享全局语义 token,保持含义一致,然后允许平台专属的 token 去处理触控目标大小和密度差异。目标是“同一家族,而非完全相同像素”,让 Web 与移动在遵循各自约束的同时感觉一致。

如何管理 token 才能让系统长期保持干净?

指定明确的负责人,并建立一个简短的审核流程,避免把新增 token 当成临时修复。保持稳定的更新节奏,并通过弃用(deprecate)而不是悄悄替换旧 token,能让系统在更多人参与构建(包括在 AppMaster 项目中)时保持清晰。

容易上手
创造一些 惊人的东西

使用免费计划试用 AppMaster。
准备就绪后,您可以选择合适的订阅。

开始吧