设计稿换肤翻车
凌晨两点,甲方发来第 17 版需求:主色从 #2B6CB0 改成 #E53E3E,所有按钮、边框、悬停态都得跟着变。Figma 里一个个改图层属性,漏了三个次级按钮的 hover 色,第二天被 QA 打回。用本工具把设计稿里的颜色、圆角、阴影全部抽成变量名,甲方改主色时只需改一个 token 值,所有关联组件自动同步,改完直接导出 JSON 给开发。
改动左侧任意变量,下方卡片、按钮、文本、边框与阴影即时套用当前主题的 token 值。
卡片标题
圆角、内边距、阴影、边框均由 token 控制。切换顶栏亮/暗查看双主题表现。
设计稿里几十个颜色变量,手动一个个改主题色,改完发现漏了一个阴影 token。这个工具把 CSS 变量整理成结构化列表,输入设计 token 名称和色值,自动生成带 `--` 前缀的变量声明,支持嵌套命名和注释。纯浏览器处理,代码不离开本地——适合前端开发在组件库换肤前批量生成变量表。
凌晨两点,甲方发来第 17 版需求:主色从 #2B6CB0 改成 #E53E3E,所有按钮、边框、悬停态都得跟着变。Figma 里一个个改图层属性,漏了三个次级按钮的 hover 色,第二天被 QA 打回。用本工具把设计稿里的颜色、圆角、阴影全部抽成变量名,甲方改主色时只需改一个 token 值,所有关联组件自动同步,改完直接导出 JSON 给开发。
新来的前端同事接手老项目,CSS 文件里散落着 47 个 #333、23 个 #666,没人知道哪个是文字色哪个是边框色。用本工具扫描整个项目的样式文件,把所有硬编码颜色提取出来,按用途归类成 $text-primary、$border-default 等 token,生成对照表。交接时把 token 文档丢过去,新人改一个变量就能调全站色调,不用再猜。
公司有 Web、小程序、App 三个端,设计规范里定义了一套主题色板,但各端开发各自写 CSS,导致同一品牌色在 iOS 上偏紫、安卓上偏蓝。用本工具把设计规范的色板、间距、字体层级录入为 JSON token,三端开发直接引用同一份变量文件。改一次 token,三端同步上线,不再出现「品牌色不一致」的 Bug。
产品经理要求在两周内上线暗色模式,设计师只给了亮色稿。用本工具把亮色主题的所有颜色变量提取出来,按语义(背景、文字、边框)映射成一组暗色值,生成两套 token 文件。前端只需在 html 上切换 data-theme 属性,所有组件自动跟随,不用逐页写媒体查询。
公司从旧品牌色 #0070C0 升级到 #0052CC,涉及 300 多个页面。用本工具把旧色值全部替换成变量名,再在变量定义处统一改新色值。改完后用工具跑一遍差异对比,确认没有遗漏的硬编码。上线后用户无感知,设计师不用再盯着每个页面的截图逐一比对。
| 输入 | 输出 | 说明 |
|---|---|---|
| --primary: #3366FF; --bg: #FFFFFF; --text: #1A1A1A | { "primary": "#3366FF", "bg": "#FFFFFF", "text": "#1A1A1A" } | 常规:三变量基础输入,验证变量名与值正确解析并输出 JSON Token 对象 |
| --font-size: 16px; --line-height: 1.5; --spacing: 8px | { "font-size": "16px", "line-height": "1.5", "spacing": "8px" } | 常规:带单位的变量,验证非颜色值也能正常输出,不丢失单位 |
| --border: 1px solid #ccc; --shadow: 0 2px 4px rgba(0,0,0,0.1) | { "border": "1px solid #ccc", "shadow": "0 2px 4px rgba(0,0,0,0.1)" } | 常规:复合值(含空格和函数),验证解析不截断,保留完整声明 |
| --empty: ; --null: ; --blank: | { "empty": "", "null": "", "blank": "" } | 边界:值为空或仅空格,输出空字符串而非报错或忽略,符合 CSS 变量行为 |
| --a: 1; --b: 2; --c: 3; --d: 4; --e: 5; --f: 6; --g: 7; --h: 8; --i: 9; --j: 10 | { "a": "1", "b": "2", "c": "3", "d": "4", "e": "5", "f": "6", "g": "7", "h": "8", "i": "9", "j": "10" } | 边界:10 个变量,验证批量处理无遗漏,按输入顺序输出 |
| --color: #FF5733; --color: #33FF57 | { "color": "#33FF57" } | 易错:重复变量名,工具取最后定义值(CSS 层叠规则),用户易误以为会报错 |
| --bg: url('image.png'); --font: 'Open Sans', sans-serif | { "bg": "url('image.png')", "font": "'Open Sans', sans-serif" } | 易错:含引号或特殊字符的值,验证引号嵌套解析正确,不破坏字符串 |
1.变量名包含非法字符
--my-color: #333;--my-color: #333;CSS 自定义属性名必须以两个连字符 `--` 开头,且只能包含字母、数字、连字符、下划线。变量名中的空格或特殊符号(如 `my color`)会导致声明无效。
2.忘记在 var() 中提供回退值
background-color: var(--bg);background-color: var(--bg, #fff);当 `--bg` 未定义时,`var()` 会解析为 `initial`,可能导致背景透明或意外颜色。显式提供回退值能保证样式稳定。
3.var() 嵌套时漏掉闭合括号
color: var(--primary, var(--fallback);color: var(--primary, var(--fallback));`var()` 嵌套时,外层 `var()` 的第二个参数本身也是一个 `var()` 调用,必须正确闭合两个括号,否则整个声明被忽略。
4.在 @media 中重复声明变量而非覆盖
@media (max-width: 600px) { :root { --gap: 8px; } }@media (max-width: 600px) { :root { --gap: 8px; } }在媒体查询中重新声明变量是覆盖而非新增,但若前面已有 `--gap`,此处会覆盖。常见误区是认为变量会自动合并,实际是后声明的值生效。
5.变量值带引号导致类型错误
div { --bg: 'url(bg.png)'; background: var(--bg); }div { --bg: url(bg.png); background: var(--bg); }CSS 变量值可以带引号,但 `background` 属性不接受带引号的 `url()`。引号使值变成字符串,而非函数调用,导致背景不显示。
6.在 calc() 中直接使用不带单位的变量
width: calc(var(--cols) * 100px);width: calc(var(--cols) * 100px);若 `--cols` 是纯数字(如 `3`),`calc()` 可以正常计算。但若 `--cols` 包含单位(如 `3px`),则乘法会报错。变量值必须与运算符兼容。
7.变量作用域误用导致意外覆盖
.card { --radius: 8px; } .card .btn { border-radius: var(--radius); }.card { --radius: 8px; } .card .btn { border-radius: var(--radius); }CSS 变量继承自父元素。若 `.btn` 的父级 `.card` 定义了 `--radius`,则 `.btn` 可用。但若 `.btn` 自身或更近的祖先未定义,则向上查找,可能得到意外值。
8.在 keyframes 中引用变量但浏览器不支持
@keyframes slide { from { left: var(--start); } to { left: var(--end); } }@keyframes slide { from { left: 0px; } to { left: 100px; } }CSS 变量在 `@keyframes` 中的支持较晚(Chrome 66+)。旧浏览器会忽略整个 keyframes 块。若需兼容,建议在关键帧中直接使用具体值。
CSS 变量值 = 设计令牌值 × 比例因子(若启用)
设计令牌值从主题 Token 映射的原始值比例因子可选缩放系数,默认 1.0设计令牌 `--color-primary` 的原始值为 `#3366FF`,比例因子未启用(默认 1.0),输出 CSS 变量值即为 `#3366FF`。若启用比例因子 0.8,则输出为 `#2952CC`(通过 RGB 通道线性缩放)。
在输入区按「变量名: 值」的格式逐行粘贴,例如 `primary: #1E90FF` 或 `radius-sm: 4px`。工具会自动解析并生成 CSS 自定义属性(`--primary: #1E90FF`)和可选的 Token 映射表。如果变量有层级(如颜色/间距分类),可以在变量名前加前缀如 `color-primary`,输出时会保留分组。不支持带花括号的完整 CSS 规则块,只处理纯键值对。
CSS 自定义属性名对连字符(-)和下划线(_)都合法,工具会原样保留,不会自动转换。但如果变量名以数字开头(如 `1st-color`),CSS 自定义属性会报错,因为 CSS 变量名必须以 `--` 开头后跟标识符,标识符不能以数字开头。工具遇到这类非法输入会标红提示,不会自动修正。检查变量名首字符是否为数字或特殊符号即可。
Figma 导出的 JSON(如 design-tokens 格式)或 Sketch 的样式数据,本工具不直接解析 JSON 或嵌套结构。需要先将 Token 中的键值对提取为纯文本格式,比如 `color/primary: #1E90FF`,然后粘贴到输入区。工具只处理平铺的键值对,不支持嵌套对象或数组。如果 Token 有层级(如 `color.primary.base`),建议手动扁平化为 `color-primary-base: #1E90FF` 再输入。
工具只处理输入区中明确给出的变量定义,不会解析或替换其他 CSS 代码中的 `var()` 引用。如果你输入了 `primary: #1E90FF`,输出的是 `--primary: #1E90FF`,但不会自动生成 `background: var(--primary)` 这样的使用语句。若需要生成使用语句,需手动在输入区额外添加 `bg: var(--primary)` 之类的引用行,工具会将其视为新变量输出。
变量值中的空格会被保留,但行内注释(如 `primary: #1E90FF /* 主色 */`)会因解析规则被丢弃。工具按 `变量名: 值` 的格式逐行解析,`: ` 后的所有内容(直到行尾)均视为值,包括空格和特殊字符。如果值本身包含冒号(如时间值 `10:30`),需要确保变量名后只有一个冒号,否则工具可能错误截断。建议将复杂值用引号包裹或单独测试。
工具支持同时输出 CSS 变量、JSON Token 映射和 SCSS 变量三种格式。CSS 输出中变量名前会加 `--` 前缀;JSON 输出中键名保持原样,值是对应的 CSS 变量引用(如 `"primary": "var(--primary)"`);SCSS 输出中变量名前加 `$` 前缀。三种格式的原始值(颜色、尺寸等)均来自输入,不会相互转换。如果输入的是色值 `#1E90FF`,三种格式都会保留该色值,只是变量名语法不同。
支持直接粘贴多行文本,每行一条变量定义。可以从设计工具的导出列表、CSV 文件或代码编辑器中复制多行内容一次性粘贴。工具会自动按换行符分割并解析。注意:如果从 Excel 或表格软件复制,单元格之间的制表符(Tab)不会被识别为分隔符,需要先替换为冒号或手动整理成 `变量名: 值` 格式。建议粘贴前检查是否有空行或多余分隔符。
本工具完全在浏览器本地运行(FE 实现),不依赖后端。Safari 和微信内置浏览器对 CSS 变量解析本身无兼容问题,但如果浏览器版本过低(如 Safari < 10)或禁用 JavaScript,工具可能无法加载。如果出现界面错乱或按钮无反应,检查是否开启了内容拦截插件,或尝试更新浏览器。报错通常与工具本身无关,更多是浏览器环境限制。
隐私保证所有计算与处理均在你的浏览器本地完成,输入数据不会上传服务器,也不会保存或共享。