资讯详情

资讯详情

深入理解 wot-design-uni 的 wd-icon 图标组件:字体图标、自定义图标与图片图标的实现原理

前端UI组件移动开发小程序【免费下载链接】wot-design-uni一个基于Vue3TS开发的uni-app组件库提供70高质量组件支持暗黑模式、国际化和自定义主题。项目地址https://gitcode.com/gh_mirrors/wo/wot-design-uni点击查看免费下载wd-icon是 wot-design-uni 组件库中承担全局图标展示的基础组件它基于字体图标iconfont方案实现一套组件即可同时支持内置图标名、第三方字体图标和图片链接三种用法。本文以官方文档 Icon 组件文档 为主线结合组件源码 wd-icon.vue、属性定义 types.ts 和样式实现 index.scss讲清楚每个属性的底层行为、自定义图标的接入方式以及测试用例如何验证这些行为。组件定位与字体加载机制wd-icon本质上是一个字体图标渲染器它本身不内置任何图形资源而是依赖font-face声明的字体文件把name映射成::before伪元素上的 Unicode 字符。在 index.scss 中可以看到双份字体声明font-face { font-family: wd-icons; src: url(https://at.alicdn.com/t/c/font_4245058_s5cpwl25n7o.woff2?t1696817709651) format(woff2), url(https://at.alicdn.com/t/c/font_4245058_s5cpwl25n7o.woff?t1696817709651) format(woff), url(https://at.alicdn.com/t/c/font_4245058_s5cpwl25n7o.ttf?t1696817709651) format(truetype); } /* #ifdef APP-PLUS || H5 */ font-face { font-family: wd-icons; src: url(./wd-icons.ttf) format(truetype); } /* #endif */这里体现了 uni-app 的条件编译思想默认走远程 CDN 字体体积小的 woff2/woff 优先ttf 兜底而在APP-PLUS等无法稳定加载远程字体的端上切换到组件目录内的本地字体文件 wd-icons.ttf。根节点的样式约束同样在 index.scss 中定义include b(icon) { display: inline-block; font-family: wd-icons !important; font-style: normal; font-weight: normal; font-variant: normal; text-transform: none; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; ::before { display: inline-block; } include m(image) { width: 1em; height: 1em; } include e(image) { width: 100%; height: 100%; } }几个关键细节font-family: wd-icons !important保证图标字形不受父级字体覆盖display: inline-block使图标可以像行内元素一样参与文本排版同时又能接受width/height1em的宽高单位意味着图片图标会跟随font-size即size属性自动缩放字体图标与图片图标在尺寸行为上天然统一字体内每个图标对应一条.wd-icon-xxx:before { content: \exxx; }规则例如.wd-icon-add的字符码就在同一文件的规则列表中如.wd-icon-check:before对应\e64e.wd-icon-close:before对应\e64d。因此找一个图标名的正确方式是查看样式文件中的类名或者直接使用文档站内的图标列表页——它对应源码 Icon 演示页其中内置了约 300 个图标名的完整清单并支持按关键字搜索、点击复制wd-icon namexxx size22px/wd-icon代码片段。基本用法通过name属性设置要使用的图标wd-icon nameadd-circle/wd-icon从源码看name是必填的字符串属性在 types.ts 中由makeRequiredProp(String)定义/** * 使用的图标名字可以使用链接图片 */ name: makeRequiredProp(String),组件渲染时的根节点 class 拼接逻辑在 wd-icon.vueconst rootClass computed(() { const prefix props.classPrefix return ${prefix} ${props.customClass} ${isImage.value ? wd-icon--image : prefix - props.name} })也就是说nameadd-circle最终生成的 DOM 类名是wd-icon wd-icon-add-circle外加可选的custom-class而.wd-icon-add-circle:before这条 CSS 规则负责把具体的字形字符注入::before伪元素。测试用例 wd-icon.test.ts 验证了这一行为const wrapper mount(WdIcon, { props: { name: add } }) expect(wrapper.classes()).toContain(wd-icon) expect(wrapper.classes()).toContain(wd-icon-add)图标颜色设置color属性即可自定义颜色wd-icon nameadd-circle color#0083ff/wd-icon颜色被直接写入根节点的内联样式见 wd-icon.vueconst rootStyle computed(() { const style: CSSProperties {} if (props.color) { style[color] props.color } if (props.size) { style[font-size] addUnit(props.size) } return ${objToStyle(style)} ${props.customStyle} })由于字体图标通过color渲染字符任何 CSS 颜色值red、rgb(255,0,0)、rgba(...)、变量等都可以使用。不设置color时图标会继承父元素颜色——这也是官方文档中color默认值标注为inherit的原因。这一特性使wd-icon天然适配 wot-design-uni 的暗黑模式父级文字色变化时图标颜色自动跟随无需单独配置。测试用例同时覆盖了颜色属性传递与多种颜色取值见 wd-icon.test.ts并验证了color、size、customStyle三者组合后都会出现在根节点 style 中wd-icon.test.tsconst style wrapper.attributes(style) expect(style).toContain(color: red) expect(style).toContain(font-size: 20px) expect(style).toContain(margin: 8px)图标大小设置size属性调整尺寸wd-icon nameadd-circle size20px/wd-icon wd-icon nameadd-circle size25px/wd-icon wd-icon nameadd-circle size30px/wd-iconsize的类型定义是numericProp即同时接受Number和String见 props.ts 中的export const numericProp [Number, String]。当传入纯数字时组件会通过 util.ts 中的addUnit自动补上pxexport function addUnit(num: number | string) { return Number.isNaN(Number(num)) ? ${num} : ${num}px }所以size20、:size20和size20px效果一致而size1.5em这类带单位的字符串会原样透传适合做随字号缩放的响应式图标。测试用例对两种取值都做了断言wd-icon.test.ts像素字符串断言font-size: 20px数字20断言自动补全为font-size: 20px。自定义图标当内置图标不满足业务需要时wd-icon提供两条扩展路径引入第三方字体图标库或直接使用图片。方式一自定义字体图标库class-prefix完整流程分三步准备自己的 iconfont 字体与 CSS。假设在 iconfont 平台生成了项目字体示例字体族名为fish得到如下 CSS仓库中自带的示例文件即为该结构见 src/iconfont/index.css/* 路径 src/iconfont/index.css */ font-face { font-family: fish; src: url(//at.alicdn.com/t/c/font_4626013_vwpx4thmin.woff2?t1721314121733) format(woff2), url(//at.alicdn.com/t/c/font_4626013_vwpx4thmin.woff?t1721314121733) format(woff), url(//at.alicdn.com/t/c/font_4626013_vwpx4thmin.ttf?t1721314121733) format(truetype); } .fish { font-family: fish !important; font-size: 16px; font-style: normal; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } .fish-kehuishouwu:before { content: \e627; }全局引入该 CSS让字体和类名规则生效!-- app.vue -- style import /iconfont/index.css; /style通过class-prefix指向自己的字体族名name使用去掉前缀后的类名后半段!-- 通过 class-prefix 指定类名为 fish -- wd-icon class-prefixfish namekehuishouwu /原理上classPrefix模板属性class-prefix默认值wd-icon会被拼接成${prefix}-${name}最终生成fish fish-kehuishouwu这类类名正好命中第 1 步中.fish-kehuishouwu:before的字形定义。组件测试也覆盖了这一拼接逻辑wd-icon.test.tsconst wrapper mount(WdIcon, { props: { name: add, classPrefix: custom-prefix } }) expect(wrapper.classes()).toContain(custom-prefix) expect(wrapper.classes()).toContain(custom-prefix-add)需要注意的约束class-prefix的值必须是 CSS 中真实存在的字体族类名前缀如fish组件本身不会校验该前缀是否存在自定义字体的 CSS 必须全局引入否则::before字形不生效组件默认声明styleIsolation: shared与addGlobalClass: true见 wd-icon.vue小程序端外部样式类才能正确注入根节点。方式二图片图标把name设置为图片 URL 即可直接渲染图片图标。组件会自动检测只要name中包含/就判定为图片。该判定逻辑在 wd-icon.vueconst isImage computed(() { return isDef(props.name) props.name.includes(/) })wd-icon namehttps://example.com/icon.png/wd-icon命中图片模式后模板会渲染image标签并附加wd-icon--image修饰类见 wd-icon.vuetemplate view clickhandleClick :classrootClass :stylerootStyle image v-ifisImage classwd-icon__image :srcname/image /view /template配合前文1em的 CSS 规则图片会随size/font-size等比缩放视觉表现与字体图标保持一致。测试用例对http://、https://以及data:base64 三类 URL 均做了验证wd-icon.test.ts断言根节点带有wd-icon--image类、内部存在image元素且src与传入值一致。由includes(/)的判定规则还可以推断一个边界行为本地不含斜杠的短路径不会触发图片模式建议使用完整的https://、http://、data:或包含路径分隔符的地址。API 参考Attributes参数说明类型可选值默认值最低版本name图标名称或图片链接string---color图标的颜色string-inherit-size图标的字体大小string | number-inherit-classPrefix类名前缀用于使用自定义图标string-wd-icon0.1.27custom-style根节点样式string---属性定义与源码一一对应name必填color为可选字符串size为numericPropnumber/string 双类型classPrefix默认wd-icon见 types.ts。custom-style与custom-class则来自组件库统一的baseProps见 props.ts所有 wot-design-uni 组件通用。Events事件名称说明参数click点击图标时触发event: Event事件由 wd-icon.vue 中绑定的handleClick发出function handleClick(event: any) { emit(click, event) }典型用途是把图标当按钮使用例如折叠面板的展开箭头。库内部组件本身就是这种用法如 wd-search 中渲染的wd-icon namesearch /、wd-collapse-item 中通过custom-class控制箭头旋转变态的wd-icon namearrow-down /。外部样式类类名说明custom-class根节点自定义样式类可覆盖图标颜色、大小等组件声明了addGlobalClass: true与styleIsolation: shared因此小程序端也可以从外部页面/组件的样式中直接命中.wd-icon内部节点演示页中即通过custom-classicon-item-class配合:deep(.icon-item-class)来统一设置图标颜色见 Icon 演示页。实践建议与常见排查图标不显示优先检查name是否与样式文件中的类名完全一致含-1、-filled、-thin等后缀如search1与search是两个不同图标自定义字体场景再检查全局 CSS 是否引入、class-prefix是否与font-face的font-family一致。颜色不生效内联color优先级最高若发现颜色漏了多半是外层!important规则覆盖可改用custom-class配合更高优先级的类名。尺寸与排版图标是inline-block且默认垂直居中对齐混排文字时若出现基线偏差可给图标设置vertical-align或使用custom-style图片图标用size控制即可无需单独设置宽高。暗黑模式不传color时图标继承父级文字颜色主题切换会自动生效建议优先依赖继承而非硬编码颜色。完整图标清单以 index.scss 中的.wd-icon-*:before规则或 Icon 演示页 的icons数组为准两者当前保持一致。小结wd-icon用不到百行的模板与脚本wd-icon.vue实现了字体图标 图片图标的统一抽象name负责选择字形或图片以/判定color/size通过内联样式直接映射到 CSS 属性class-prefix打开第三方字体库的接入通道。理解rootClass/rootStyle两个计算属性的拼接规则后无论是排查图标不显示、扩展自有图标字体还是在业务组件中复用箭头、搜索等语义图标都能快速定位到对应行为。组件的完整行为契约还可以对照 wd-icon 测试用例 逐条验证。赞分享前端UI组件移动开发小程序【免费下载链接】wot-design-uni一个基于Vue3TS开发的uni-app组件库提供70高质量组件支持暗黑模式、国际化和自定义主题。项目地址https://gitcode.com/gh_mirrors/wo/wot-design-uni点击查看免费下载相关推荐wot-design-uni 图标组件wd-icon完全指南内置字体图标、图片图标与自定义 iconfont 的接入实践wot design uni 图标组件wd icon完全指南内置字体图标、图片图标与自定义 iconfont 的接入实践 导读 wd icon 是 wot前端UI组件移动开发小程序Varlet Icon 组件完全指南从字体图标、图片模式到切换动画与自定义图标库的实现原理Varlet Icon 组件完全指南从字体图标、图片模式到切换动画与自定义图标库的实现原理 本篇指南基于 Varlet基于 Material DesignUI组件前端ant-design-blazor 图标组件 Icon 完全指南从内置图标到 iconfont.cn 自定义图标ant design blazor 图标组件 Icon 完全指南从内置图标到 iconfont.cn 自定义图标 ant design blazor 的 IcUI组件前端上一篇2025最新Gotenberg使用指南从安装到部署的完整流程下一篇Capybara测试超时问题解决方案优化等待时间创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →