在Figma中分工制作设计组件时,常常会遇到意想不到的问题。尤其是将图标组件化之后,颜色无法正常切换,您是否也有过这样的困扰?
本文将针对许多Figma用户都会遇到的“图标实例颜色无法同步”问题,通俗易懂地讲解其原因与解决方法。
我做的按钮被前辈做成了组件!而且图标部分也能切换了!太厉害了!不过图标还不够,我要继续把图标注册为组件,做成更好用的组件!
我默默地埋头制作了大量图标。
咦?图标组件怎么切换不过来? 明明和前辈用的是同样的做法……为什么颜色就是切换不了呢?
这是因为你的图标制作方法有问题哦!
前辈!怎样才能让颜色切换起来呢?
哼哼,好吧!我就把Figma图标切换的秘诀告诉你。好好记笔记,牢牢记在脑子里哦!
好的!我会努力记住的!
为什么颜色会被继承?Figma 覆盖机制解析
在 Figma 中制作按钮时,常会设置为通过实例属性切换图标部分。然而,实际切换图标时,设定的颜色没有被应用,或者颜色被自动改变,这类问题也并不少见。
在 Figma 中切换图标(icon)时,你是否遇到过设定的颜色没有生效、颜色无法改变的问题?本文将通俗易懂地介绍其原因和解决方法。
为了让图标切换时颜色能够正确切换,请仔细检查图标本身以及按钮的相关设置。
首先确认按钮组件的结构
首先,让我们确认一下如下结构中颜色被覆盖的情况。
① 原始图标组件为黑色
② 以实例形式复制到按钮中后,仅覆盖了颜色
③ 在此状态下切换为其他图标时,图标颜色有时会不是白色,而是恢复为默认颜色
技巧:理解主组件与覆盖实例之间的关系
最基本的注意事项是:一旦覆盖了某个属性,该属性将不再反映主组件的更改。
已覆盖的部分:如果在实例中更改颜色或文本,该部分将变为独立状态。之后即使更改主组件中的相同部分,也不会应用到该实例上。已覆盖的内容(填充和描边的颜色、文本等)将优先显示。
未覆盖的部分:未更改的属性(例如 padding 或 margin)将直接反映主组件的更改。
需要特别注意的是,更改主组件的图层结构时的情况。如果更改图层名称,或删除图层后再添加新图层,Figma 可能会将其识别为不同的元素,导致实例的覆盖被重置。
基于以上内容,让我们来查找图标颜色无法切换的原因。
原因 1:「填充(Fill)」与「描边(Stroke)」设置混用
即使外观相同的图标,在 Figma 中「填充(Fill)」和「描边(Stroke)」也是完全不同的属性。因此,如果将使用填充绘制的图标切换为使用描边粗细绘制的图标,颜色覆盖可能无法正确反映。
示例:
图标 A
图标B
- 图标A:由填充(Fill)构成的轮廓化图标
- 图标B:通过线条(Stroke)描绘轮廓的图标
如上所示,图标的绘制方式不同,颜色的应用结果也会随之改变,因此统一表现方式非常重要。点击图标B的图标时,Fill 被指定为白色,但由于该图标组件仅由线条构成,颜色并不会被替换。不过实际上,填充部分其实已经正确应用了白色(因为没有填充元素,白色无处可去……)。
✅ 应对方法:
约定所有图标均使用“填充”方式制作。用线条绘制的图标,务必进行轮廓化(command + shift + O)并转换为“填充”对象。这样在实现时也更易于处理。
本公司在实现时,会将 SVG 的 path 放入 CSS 变量中,或使用 Astro Icon 进行引入,因此统一采用填充方式。
如果保持线条(Stroke)形式,图标放大或缩小时线条粗细会随之变化,也可能导致设计失真。除非有特别的理由,否则建议进行轮廓化并统一为“填充”,这才是最佳做法!
仅用线条构建的图标,在缩放时线条尺寸会保持不变。箭头等简单路径的图标问题较少,但对于复杂图标,若保持12px则容易糊成一团,若放大到80px则往往会显得松散、失去平衡。
用线条构建的图标在调整尺寸时,线条粗细也不会随之改变,因此最好的做法是进行轮廓化。如果希望保留轮廓化之前的版本,建议将原始数据放在组件附近保存。
即使将线条(Stroke)构成的图形合并后转换为填充(Fill),也常常会出现部分区域大小无法改变等问题。
原因2:图层名称不一致
在 Figma 中,切换组件实例时,图层名称相同的元素会继承样式和属性。
示例:
图标 A
图标B
- 图标 A 矢量的图层名称:
Vector - 图标 B 矢量的图层名称:
Vector2
如果图层名称不同,Figma 会将其视为“不同的对象”,覆盖的样式将无法正确应用。
✅ 解决方法:统一图标中使用的图层名称(例如全部使用 Vector)
总之,想要上色的路径图层名称先全部设置为相同的名字吧!
原因3:图层结构(层级)不同
即使统一了图层名称,有时仍无法正常切换。这种情况下,可能与图层结构的差异有关。在实例切换的源与目标之间,如果图层数量或结构不同,属性可能无法正确映射。但是,如果图层名称相同,层级存在少量差异通常也不会有问题。
示例:
图标 A
图标B
图标 C
- 图标 A 为「Vector
(path)」,将其轮廓化并合并为一个矢量(基础图标) - 图标 B 的层级为「Flame
(Flame)> Vector(path)」 → OK(颜色会沿用路径名「Vector」) - 图标 C 的结构为「Vector
(Flame)> Flame(path)」 → NG(会出现因名为「Vector」的 Flame 所设颜色而产生的变化)
像这样,当图层名「Vector」包含群组的结构时,需要注意样式的应用方式。另外,即使名称相同,颜色变化也只会反映在最上层(参见图标 C),第二层的 Vector 不会反映颜色变化。
✅ 应对方法:不仅要统一图层名,还要设计成实际应用样式的路径结构保持一致,这样就更容易避免问题。
只要矢量名称一致,即使结构稍有不同,通常也没有问题。不过在团队开发中,为了方便之后加入的成员,建议尽量统一内部结构。
原因 4:原组件与填充(Fill)或描边(Stroke)的数量不同
如果只使用一种颜色,只要合并图层或统一图层结构和图层名,就无需担心。但是,如果要切换到填充(Fill)或描边(Stroke)数量与原组件不同的图标等,就可能只有部分颜色发生切换,其他颜色保持不变,导致结果与预期不符。基本上建议图标统一使用单色。如果必须使用两种颜色,则需要另外制作双色图标的图标变量等来解决。
✅ 应对方法:
- 不要混用单色和多色图标。
- 如果需要多色图标,请使用变量复制图标组件,并制作双色图标专用版本。
- 使用多色图标时,基本不使用颜色覆盖(Override)。
即使覆盖单色图标,也只能更改一种颜色,请注意!
原因5:混合模式和蒙版的影响
如果图标使用了蒙版或特殊的混合模式(如正片叠底等),即使更改颜色,外观也可能没有任何变化。
✅ 解决方法:
如果使用了蒙版或混合模式,请通过合并或整合对象(Flatten)等方式,将其转换为外观一致的简单路径对象后再组件化。
即使是这种情况,最后也最好将其轮廓化等,简化为普通路径,这样会更加稳妥。如果使用了正片叠底,建议通过实时描摹等方式充分转换为路径,这样会更加稳妥。
验证总结
原因 | 内容 | 解决方法 |
|---|---|---|
图层名称不一致 | 切换实例后属性未被继承 | 所有图标统一图层名称(例如:Vector) |
图层结构不一致 | 图层层级或结构不同时,样式可能无法正常应用 | 统一最终渲染对象的结构 |
与源组件的图层数量不同 | 与源组件的 fill 数量指定不一致 | 通过应用 Style、合并复合路径(Flatten)来解决 |
混合/蒙版 | 颜色无法在视觉上生效 | 恢复为 |
实际确认的颜色生效行为
以下为在按钮内切换各种图标时确认到的颜色生效行为(见图)。
测试模式 | 结果 | 备注 |
|---|---|---|
路径轮廓化 | ✅ 有颜色生效 | 结构简单,较为稳定。但不便于重新编辑。 |
对路径进行布尔运算时(如合并等) | ✅ 有颜色生效 | 如果最顶层的图层名称相同,基本没有问题。只要直属图层数量与原实例相同,就能正常切换。 |
vector 的层级结构不同(Group > Vector) | ✅ 有颜色生效 | 只要对应位置的图层名称一致即可。但如果结构不同或名称重复,可能无法正确显示。 |
较为复杂的图形(混合或路径合并等) | ✅ 有颜色生效 | 合并路径后会更加稳定 |
将源矢量放入分组或框架中等、改变结构的情况 | 🔺 颜色也可能无法正确反映 | 这些可能会被识别为不同的图层,因此如需添加内容,建议复制组件并修改复制后的版本,这样更可靠。 |
Vector名称不同 | ❌ 颜色未生效 | 图层名称不一致时,会被识别为不同的对象 |
内部结构比原始数据更复杂,差异较多 | ❌ 颜色未应用 | 图层数量增加或画框数量变多时,只有部分颜色会生效。差异较大,很可能会被判定为其他图层。 |
删除复制源后再替换 | ❌ 颜色未生效 | 即使同名,也会被视为不同对象 |
图标路径的父画框中存在同名画框时 | ❌ 颜色作用到了父画框上 | 颜色修改会同步到同名的父级 Frame 上,因此路径无法应用样式。 |
运维技巧
验证中发现的要点:
- 图层名称与结构是否一致非常重要。
- 填充建议通过 Color Style 或 Variables 管理,会更加稳妥,但并非必须指定。
- 制作图标时,为便于实现,建议统一使用填充(线条在缩放时尺寸容易走样,因此推荐转换为轮廓)。
- 如需向现有图标添加元素,建议不要直接编辑当前已应用的变体,而是新建图标并逐个替换,这样更容易避免颜色问题。
为了让设计制作到实现的过程顺利推进,以下是几个要点:
- 统一 Frame 的尺寸(避免使用 24px、40px、80px 等各不相同的尺寸)。
- 图标部分设为可缩放后,图标尺寸随之缩放时会自动调整到合适的大小(无论是实现还是设计环节,数据处理都会轻松很多)。
此外,我们的实现规则如下:
- 颜色设为纯黑 #000(Astro Icon 的原始数据必须为黑色,否则无法更改颜色)
运营阶段容易出现的问题:
- 谨慎修改现有图标:在运营过程中,如果向现有图标添加元素或进行修改,结构可能会意外改变,从而容易导致颜色无法正确应用的问题。这种情况下,建议不要直接编辑现有组件,而是遵循规则,将其创建为新的图标组件并进行替换,这样会更加安全。
总结
明白了吗?制作图标时,基本遵循这三条规则就没问题啦! 1. 绘制方式统一为“填充”(线条需转为轮廓!) 2. 统一需要上色的路径的“图层名称” 3. 尽量保持图标的“图层结构”简单 还有,运营阶段需要特别注意的是对现有图标的修改。修改过程中结构可能发生变化,导致颜色无法生效,这种问题很常见。 因此,不要直接修改现有图标,而是遵循规则创建新组件,并在该组件中修改图标。之后在按钮组件中把旧图标替换为新图标,颜色相关的问题应该会大大减少。
谢谢!这样我也成为图标达人了!我会按照前辈教的方法来创建组件的!
切换图标实例时,即使外观相同,只要内部结构不同,颜色也无法正确应用。
本文介绍的要点中,尤其是“统一为填充”和“统一图层名称”这两点,只要严格执行,大多数问题都可以避免。
如果仍然无法正常切换,通常是内部结构不同,或父图层使用了相同名称。
希望本文能帮助您在 Figma 中更加顺畅地完成设计工作。
UI设计每天都在更新!正在思考如何将LP设计与无障碍设计结合起来。最近离开了标记工作,我在想“要不要也提升一下自己的JS能力?”。喜欢北村匠海!
Hashi
Web设计师 / 2018年入职 / 内心至今仍是一名新手设计师