首页
/ Style Dictionary中实现可复用文本样式分组的技术方案

Style Dictionary中实现可复用文本样式分组的技术方案

2025-06-15 19:27:37作者:俞予舒Fleming

在基于Style Dictionary构建设计系统时,我们经常需要处理复杂的排版样式。这些样式通常包含多个属性,如字体、字号、行高等。本文将介绍如何在Style Dictionary中将这些分散的排版属性分组为可复用的CSS类。

问题背景

当使用Style Dictionary管理排版样式时,常见的JSON结构会将每个排版属性(如fontFamily、fontSize等)定义为独立的token。这种结构虽然清晰,但在实际CSS使用中不够便捷,因为开发者需要为每个元素手动组合多个CSS变量。

解决方案概述

通过自定义格式和属性转换,我们可以将相关的排版属性自动组合成完整的CSS类。核心思路是:

  1. 为每个排版token添加CSS属性标识
  2. 根据token路径生成对应的CSS类名
  3. 将相同类名的属性分组并生成完整的CSS规则

实现步骤详解

1. 添加CSS属性标识

首先需要创建一个属性转换器,为每个排版token添加元数据:

{
  value: 'Stolzl',
  type: 'fontFamily',
  attributes: {
    cssProp: 'font-family',
    cssClass: 'typography-desktop-body-regular-xl'
  },
  name: 'typography-desktop-body-regular-xl-font-family'
}

2. 自定义格式实现

创建自定义格式来处理这些带有CSS类信息的token:

StyleDictionary.registerFormat({
  name: 'css/typographyClasses',
  formatter: function({ dictionary }) {
    const classMap = new Map();
    
    dictionary.allTokens.forEach(token => {
      if (token.attributes?.cssClass) {
        if (!classMap.has(token.attributes.cssClass)) {
          classMap.set(token.attributes.cssClass, []);
        }
        classMap.get(token.attributes.cssClass).push(token);
      }
    });
    
    let output = '';
    classMap.forEach((tokens, className) => {
      output += `.${className} {\n`;
      tokens.forEach(token => {
        const fallback = token.type === 'fontFamily' ? ', sans-serif' : '';
        output += `  ${token.attributes.cssProp}: var(--${token.name})${fallback};\n`;
      });
      output += `}\n\n`;
    });
    
    return output;
  }
});

3. 配置Style Dictionary

在配置文件中应用这个自定义格式:

{
  "source": ["tokens/**/*.json"],
  "platforms": {
    "css": {
      "transformGroup": "css",
      "buildPath": "build/css/",
      "files": [
        {
          "destination": "typography.css",
          "format": "css/typographyClasses"
        }
      ]
    }
  }
}

生成结果示例

执行构建后,将生成如下CSS:

.typography-desktop-body-regular-xl {
  font-family: var(--typography-desktop-body-regular-xl-font-family), sans-serif;
  font-weight: var(--typography-desktop-body-regular-xl-font-weight);
  line-height: var(--typography-desktop-body-regular-xl-line-height);
  font-size: var(--typography-desktop-body-regular-xl-font-size);
  letter-spacing: var(--typography-desktop-body-regular-xl-letter-spacing);
  text-transform: var(--typography-desktop-body-regular-xl-text-case);
  text-decoration: var(--typography-desktop-body-regular-xl-text-decoration);
}

进阶优化建议

  1. 智能回退值:可以根据属性类型自动添加适当的回退值,如字体栈、默认行高等

  2. 响应式处理:通过媒体查询包装类,实现不同断点的排版样式

  3. Sass/Less扩展:生成mixin或函数,提供更灵活的调用方式

  4. 文档生成:同时生成样式使用文档,方便开发者查阅

总结

通过Style Dictionary的自定义格式功能,我们可以将分散的排版属性智能地组合成完整的CSS类。这种方法不仅提高了开发效率,还确保了设计系统的一致性和可维护性。虽然实现过程需要一定的自定义开发,但带来的长期收益是值得的。

登录后查看全文
热门项目推荐

项目优选

收起
ohos_react_nativeohos_react_native
React Native鸿蒙化仓库
C++
178
263
RuoYi-Vue3RuoYi-Vue3
🎉 (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue3 & Vite、Element Plus 的前后端分离权限管理系统
Vue
868
514
openGauss-serveropenGauss-server
openGauss kernel ~ openGauss is an open source relational database management system
C++
130
183
openHiTLSopenHiTLS
旨在打造算法先进、性能卓越、高效敏捷、安全可靠的密码套件,通过轻量级、可剪裁的软件技术架构满足各行业不同场景的多样化要求,让密码技术应用更简单,同时探索后量子等先进算法创新实践,构建密码前沿技术底座!
C
279
315
HarmonyOS-ExamplesHarmonyOS-Examples
本仓将收集和展示仓颉鸿蒙应用示例代码,欢迎大家投稿,在仓颉鸿蒙社区展现你的妙趣设计!
Cangjie
398
373
CangjieCommunityCangjieCommunity
为仓颉编程语言开发者打造活跃、开放、高质量的社区环境
Markdown
1.07 K
0
ShopXO开源商城ShopXO开源商城
🔥🔥🔥ShopXO企业级免费开源商城系统,可视化DIY拖拽装修、包含PC、H5、多端小程序(微信+支付宝+百度+头条&抖音+QQ+快手)、APP、多仓库、多商户、多门店、IM客服、进销存,遵循MIT开源协议发布、基于ThinkPHP8框架研发
JavaScript
93
15
note-gennote-gen
一款跨平台的 Markdown AI 笔记软件,致力于使用 AI 建立记录和写作的桥梁。
TSX
83
4
cherry-studiocherry-studio
🍒 Cherry Studio 是一款支持多个 LLM 提供商的桌面客户端
TypeScript
599
58
GitNextGitNext
基于可以运行在OpenHarmony的git,提供git客户端操作能力
ArkTS
10
3