Figma插件中如何获取并修改选中组件的填充颜色?
我在开发Figma插件时想批量修改选中组件的填充颜色,但按文档写的代码运行后颜色没变,控制台也没报错。我先用figma.currentPage.selection获取选中的节点,然后循环调用node.fills[0].color = {r:1,b:0,g:0},但颜色没生效,这是哪里出问题了?
尝试过把代码放进figma.transaction()里还是不行,而且发现如果选中的是文本节点会报错。有没有完整的修改填充颜色的正确写法示例?
figma.showUI(__html__);
figma.ui.onmessage = msg => {
if (msg.type === 'changeColor') {
const nodes = figma.currentPage.selection;
nodes.forEach(node => {
if (node.type === 'RECTANGLE') {
node.fills[0].color = {r: 1, g: 0, b: 0};
}
});
figma.closePlugin();
}
};
你代码的问题有两点:
1. fills数组可能是空的或者不是纯色类型(比如渐变或者图片填充),直接改color会无效甚至报错
2. 修改属性后需要手动触发更新,figma.transaction()里修改不一定够
我给你一个能跑的版本:
血泪教训:
1. 不要直接修改node.fills[0],要展开数组创建新对象
2. 类型判断必须严格检查,特别是文本节点容易翻车
3. 最好先判断node.fills是否存在,很多组件可能没填充
4. 颜色值是0-1还是0-255取决于你用的Figma API版本,自己试一下就知道
文本节点报错的问题,是因为文本的fill是只读属性,必须用赋值替换整个数组才能生效。我之前就是在这坑里躺了半小时,debug到怀疑人生。
注意几点:
1. 判断
node.fills是否存在且长度大于0。2. 检查填充类型是否为
SOLID(纯色),否则会报错。3. 文本节点确实会报错,这里没处理,你可以根据需要加个
if (node.type !== 'TEXT')。这样改完基本就没问题了,运行一下试试。如果还有特殊情况,再慢慢调试吧,开发插件有时候就是这么折腾人。