用Sass的@each遍历图标map(如$icons: ("home": "e900", "user": "e901")),生成.icon-#{$name}类并设content: "#{$code}",需用双引号包裹Unicode转义,配合@font-face声明字体,推荐map而非list以确保名码映射准确。
直接生成 .icon-home、.icon-user 无需手写几十个这类类名——关键是将图标名列表交给 @each,然后拼接类选择器及相应的 content 值。
常见错误是把图标名作为字符串硬编码进 content,最终输出文字而不是 Unicode 字符;也可能因漏加引号而让 Sass 报 Undefined variable。
$icons: ("home": "e900", "user": "e901")
@each $name, $code in $icons 遍历,类名用 .icon-#{$name} 拼接content 值必须用双引号包裹,并确认它是合法的 Unicode 转义(如 "e900"),单引号会失效@font-face 并设置 font-family
带语义的图标管理更适合 map,纯顺序枚举则可用 list。实际项目几乎都会选择 map,因为名称与对应码点需要同时保存,而 list 很难维持索引对齐。
用 list 容易踩的坑:$icons: "home" "user" 看似简洁,但没法关联码点;想用 nth($icons, $i) 取值还得额外维护一个平行数组,极易错位。
立即学习“前端免费学习笔记(深入)”;
$icons: ("home": "e900", "search": "e902", "close": "e905")
selection.json),可借助工具转换为 Sass map,不要手敲二者都不建议直接用于生成图标类本身,但 @mixin 更安全。用 @extend 容易让 CSS 输出体积膨胀,尤其是多个图标类都 @extend 使用同一基础样式时,Sass 会把全部选择器复制出来。
典型问题:写了 @extend %icon-base,生成的 CSS 中每个 .icon-xxx 都会重复一遍 display: inline-block; font-family: 'Icons'; ——这完全背离了“复用”的初衷。
@mixin icon-base() 封装公共样式,再在每个类里 @include icon-base
@extend,应仅限极少数基类(如重置 vertical-align),并确认不会引起选择器爆炸.icon,再让 .icon-home 由多个类共用——HTML 里写 class="icon icon-home"
重点并非“怎样生成”,而是“在哪里生成”。许多人直接把图标类放入全局作用域,最终与第三方 UI 库的 .icon-* 发生碰撞,或遭到权重更高的选择器覆盖。
最容易被忽略的是未添加命名空间前缀,例如直接生成 .user,但项目中已经存在 .user { color: red } 的用户模块样式。
.ic-home、.ic-user,比 .icon-* 更不容易发生冲突@at-root 约束输出位置,防止嵌套层级受到污染(比如不要在 .header { ... } 里生成图标类):global(.icon-home) 显式导出grep -r "icon-" dist/ 检查构建产物,确认不存在意外注入或重复循环语法并非真正的难点,麻烦在于图标码点更新后没有同步 Sass map——人工核对 JSON 与 .scss 文件,十次有八次会遗漏一个,因此自动化这一步才是卡点。