Figma 组件变体进阶:用属性面板做可配置按钮(零代码)

你将做出什么

目标是做一个“可配置按钮”组件:在右侧属性面板里就能切换主/次样式、尺寸、左右图标、加载态、禁用态,并确保图标/文字对齐、间距与约束稳定。全程零代码,适合做设计系统或交付给团队复用。

准备:先把按钮拆成 3 个稳定的层

新建一个 Frame 作为按钮容器(建议 44px 高起步),开启 Auto Layout(横向)。内部只放 3 个子层:

  • Left(左侧图标容器,可为空)
  • Label(文本)
  • Right(右侧图标容器,可为空)

关键点:Left/Right 不直接放图标,而是放一个固定尺寸的容器(例如 16x16 或 20x20),这样图标开关时,按钮高度与对齐不会抖。

步骤 1:用 Auto Layout 把间距“写死”

在按钮容器上设置:

  • Padding:左右 16,上下 10(按你的规范调整)
  • Item spacing:8
  • Alignment:垂直居中

把 Label 的 Resizing 设为 Hug contents;按钮容器可以设为 Hug 或 Fixed,取决于你要“自适应文字”还是“固定宽度”。

步骤 2:创建 Variants(主/次 + 尺寸)

把按钮组件做成 Component,然后 Duplicate 出四个基础状态:

  • Type=Primary / Secondary
  • Size=SM / MD(也可以加 LG)

选中这些组件,点击 Combine as variants。确保属性名简洁一致:Type、Size。不要把“颜色/圆角”写进名称里,用属性驱动。

步骤 3:用 Component Properties 做图标开关

把 Left/Right 容器里的图标做成可替换的图标组件(例如 Icon/16)。然后:

  • 选中 Left 容器里的图标实例,在右侧把它暴露为 Instance swap 属性,命名为 Left icon
  • 同理暴露 Right icon

如果要“无图标”的情况:把 Left/Right 容器本身设置为可见性属性(Boolean),命名为 Has left icon、Has right icon。这样关闭时不仅隐藏图标,也能让容器本身参与布局计算(避免留下空位)。

步骤 4:做加载态(Loading)且不改变按钮宽度

加载态最容易导致按钮抖动,因为文字变成了 Spinner。解决方法:

  • 在 Label 位置放一个 Frame:里面同时放 Text 和 Spinner,两者互斥显示
  • 把 Text 的宽度用 Min width 或固定宽度锁住(取你常用的按钮文案宽度)
  • 暴露 Boolean 属性:Loading

Loading=true 时隐藏 Text 显示 Spinner,但 Label 容器宽度不变,按钮整体宽度保持稳定。

步骤 5:禁用态(Disabled)不要只改透明度

建议在变体里增加 State=Default/Disabled(或用 Boolean:Disabled)。禁用态除了降低对比度,还要保证可读性与可访问性:

  • Primary:背景变浅、文字对比保持可读
  • Secondary:描边与文字同步降低,但不要灰到看不见
  • 图标颜色跟随文字变量(同一色值 token)

步骤 6:命名与发布前自检清单

发布前做一次“组件可用性自检”,能显著减少返工:

  • 属性命名是否统一:Type/Size/Has left icon/Has right icon/Loading/Disabled
  • 切换任意属性时,按钮高度是否稳定、文字是否垂直居中
  • 左右图标开关时是否不会留下空白间距
  • SM/MD/LG 的 Padding 与字号是否符合规范(不要只缩小字号)
  • 样式 token 是否集中管理(颜色/圆角/描边)

可选加分:把“图标位置”做成单一属性

如果你的按钮只允许“左图标”或“右图标”二选一,可以用一个枚举属性 Icon position=None/Left/Right 来减少组合爆炸。实现思路是把 Left/Right 的可见性绑定到同一个属性值(需要组织好组件层级与默认值)。

常见问题排查

  • 切换图标时按钮宽度变了:检查 Left/Right 容器是否仍占位,或 Item spacing 是否在隐藏后仍计算
  • Loading 时文字跳动:给 Label 容器一个稳定宽度,Spinner 居中
  • 不同尺寸对不齐:把字号、行高、上下 padding 成组调整,不要只改高度

按上面做完,你会得到一个可复用、可扩展、属性面板友好的按钮组件,后续再加 Danger、Ghost、Icon-only 也会很顺。

用户评论 (0)

登录后参与讨论

立即登录 注册账号

暂无评论,快来抢沙发吧~

操作成功