更新记录
2.0.0(2026-08-14)
新增
lime-hanzi-writer组件,适配 uni-app / uni-app x(uvue + vue 双端)- 笔顺书写动画:播放、逐笔动画、循环播放、暂停 / 继续
- 田字格背景(
showGrid/gridColor) - 逐笔高亮(
highlightStroke) - 笔顺测验(
quiz):支持测验提示、跳过笔画、错误回调等 - 自定义颜色(笔画 / 部首 / 高亮 / 轮廓 / 田字格)与尺寸(
size/width/height) - 本地汉字数据(
charDataMap/setLocalCharData)与动态切换(setCharacter) - 插件根
index.ts统一导出公开静态 API(setLocalCharData/setCharDataVersion等)
使用网络加载汉字数据时,组件会请求
https://cdn.jsdelivr.net/npm/hanzi-writer-data@{version}/{character}.json,小程序平台需在小程序后台配置该域名白名单;如需无网络请求,请使用本地数据。
平台兼容性
uni-app(4.44)
| Vue2 | Vue3 | Chrome | Safari | app-vue | app-nvue | Android | iOS | 鸿蒙 |
|---|---|---|---|---|---|---|---|---|
| √ | √ | √ | √ | √ | - | 5.0 | √ | √ |
| 微信小程序 | 支付宝小程序 | 抖音小程序 | 百度小程序 | 快手小程序 | 京东小程序 | 鸿蒙元服务 | QQ小程序 | 飞书小程序 | 小红书小程序 | 快应用-华为 | 快应用-联盟 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| √ | - | - | - | - | - | - | - | - | - | - | - |
uni-app x(5.23)
| Chrome | Safari | Android | iOS | 鸿蒙 | 微信小程序 |
|---|---|---|---|---|---|
| √ | √ | 5.0 | √ | √ | √ |
name: lime-hanzi-writer 汉字笔顺动画组件 description: 汉字笔顺动画与测验组件,支持笔画书写动画、田字格、笔顺测验,可用于汉字教学、笔顺练习等场景 tags:
- hanzi-writer
- 汉字
- 笔顺
- 动画
- 书写
- canvas componentTag: l-hanzi-writer plugin: lime-hanzi-writer category: 业务组件 dependencies:
-
lime-shared
lime-hanzi-writer 汉字笔顺动画组件
汉字笔顺动画与测验组件,支持笔画书写动画、田字格背景、笔顺测验等功能,可用于汉字教学、笔顺练习等场景。
插件依赖:lime-shared
安装方法
- 在 uni-app 插件市场中搜索并导入
lime-hanzi-writer - 导入后可能需要重新编译项目
- 在页面中使用
l-hanzi-writer组件
代码演示
基础用法
显示一个汉字,带笔画书写动画。
<l-hanzi-writer character="永" :size="200" />
播放笔顺动画
通过 ref 调用 animateCharacter 方法,播放从第一笔到最后一笔的书写动画。
<l-hanzi-writer ref="writerRef" character="永" :size="200" />
<button @click="playAnimation">播放动画</button>
const playAnimation = () => {
writerRef.value?.animateCharacter()
}
显示田字格
通过 showGrid 属性显示田字格背景辅助线。
<l-hanzi-writer character="永" :size="200" :showGrid="true" />
自定义颜色
<l-hanzi-writer
character="永"
:size="200"
strokeColor="#333"
highlightColor="#54b4d3"
outlineColor="#ccc"
/>
使用本地字符数据
通过 charDataMap 传入本地字符数据,避免网络请求。数据格式参考 hanzi-writer-data。
<l-hanzi-writer character="永" :size="200" :charDataMap="dataMap" />
import yongData from '@/static/hanzi-data/永.json'
const dataMap = { '永': yongData }
笔顺测验
通过 quiz 方法进入测验模式,用户按正确笔顺书写。
<l-hanzi-writer ref="writerRef" character="永" :size="200" />
<button @click="startQuiz">开始测验</button>
const startQuiz = () => {
writerRef.value?.quiz({
onComplete: (summary) => {
console.log('测验完成,总错误数:', summary.totalMistakes)
}
})
}
测验时同一笔画连续写错达到 showHintAfterMisses 次后会高亮提示正确写法,默认 3 次。可通过 prop 调整:
<!-- 第一次写错就提示 -->
<l-hanzi-writer character="永" :size="200" :show-hint-after-misses="1" />
循环播放动画
<l-hanzi-writer ref="writerRef" character="永" :size="200" />
<button @click="loopAnimation">循环播放</button>
const loopAnimation = () => {
writerRef.value?.loopCharacterAnimation()
}
动态切换汉字
<l-hanzi-writer ref="writerRef" character="永" :size="200" />
<button @click="switchChar">切换</button>
const switchChar = () => {
writerRef.value?.setCharacter('学')
}
网络请求与域名白名单
组件加载汉字笔顺数据时,若未通过 charDataMap 或 setLocalCharData 提供本地数据,会自动发起网络请求获取汉字数据:
https://cdn.jsdelivr.net/npm/hanzi-writer-data@{version}/{character}.json
{version}为内置 CDN 版本号(默认2.0.1,可通过setCharDataVersion修改){character}为当前汉字,例如永的请求地址为https://cdn.jsdelivr.net/npm/hanzi-writer-data@2.0.1/永.json
⚠️ 小程序必须配置合法域名白名单
微信小程序、支付宝小程序等平台对
wx.request/uni.request有域名校验限制。使用网络加载(未配置本地数据)时,需要在各平台后台「服务器域名 → request 合法域名」中添加:https://cdn.jsdelivr.net若你通过
setCharDataVersion切换了其他 CDN 源(如unpkg.com),请对应添加该域名。如不希望任何网络请求,请务必使用 使用本地字符数据 或调用
setLocalCharData提供全量离线数据。
API 文档
Props
基础配置
| 参数 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| character | 显示的汉字 | string | - |
| size | 组件尺寸(px),设置后 width = height = size | number | - |
| width | 组件宽度(px),size 优先 | number | - |
| height | 组件高度(px),size 优先 | number | - |
| padding | 内边距(px) | number | 0 |
| disableScroll | 触摸时是否禁止页面滚动 | boolean | true |
动画配置
| 参数 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| animationSpeed | 笔顺动画速度 | number | - |
| delayBetweenStrokes | 笔画之间的间隔(ms) | number | 500 |
颜色配置
| 参数 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| strokeColor | 笔画颜色 | string | #555 |
| radicalColor | 部首颜色,为 null 时与 strokeColor 相同 | string | null | null |
| highlightColor | 高亮颜色(测验提示用) | string | #AAF |
| outlineColor | 轮廓颜色 | string | #DDDDDD |
| gridColor | 田字格线颜色 | string | #DDDDDD |
显示控制
| 参数 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| showOutline | 是否显示轮廓 | boolean | true |
| showGrid | 是否显示田字格背景 | boolean | false |
| showHintAfterMisses | 测验时同一笔画连续写错几次后显示高亮提示,传 1 表示每次错都提示 | number | 3 |
数据配置
| 参数 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| charDataMap | 本地汉字数据映射,存在时优先于网络加载 | object | - |
样式定制
| 参数 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| lClass | 根元素自定义类名 | string | object | - |
| lClassCanvas | 画布元素自定义类名 | string | object | - |
| lStyle | 根元素自定义样式 | string | object | - |
Methods
通过 ref 调用组件方法。
| 方法名 | 说明 | 参数 |
|---|---|---|
| showCharacter | 显示汉字 | options?: AnimationOptions |
| hideCharacter | 隐藏汉字 | options?: AnimationOptions |
| animateCharacter | 播放笔画书写动画 | options?: OnCompleteOptions |
| animateStroke | 播放指定笔画动画 | strokeNum: number, options?: OnCompleteOptions |
| highlightStroke | 高亮指定笔画 | strokeNum: number, options?: OnCompleteOptions |
| loopCharacterAnimation | 循环播放书写动画 | - |
| pauseAnimation | 暂停动画 | - |
| resumeAnimation | 恢复动画 | - |
| showOutline | 显示轮廓 | options?: AnimationOptions |
| hideOutline | 隐藏轮廓 | options?: AnimationOptions |
| quiz | 开始笔顺测验 | options?: QuizOptions |
| cancelQuiz | 取消测验 | - |
| skipQuizStroke | 跳过当前测验笔画 | - |
| setCharacter | 切换汉字 | char: string |
| setCharDataMap | 动态更新本地字符数据映射 | map: UTSJSONObject |
| getStrokeCount | 获取笔画数 | 返回 number |
| getCharacterData | 获取字符数据 | 返回 Promise\<Character> |
| updateDimensions | 更新尺寸 | options: { width?, height?, padding? } |
| updateColor | 更新颜色 | colorName: string, colorVal: string | null, options?: AnimationOptions |
| destroy | 销毁组件 | - |
上述方法通过组件 ref 调用。以下全局方法通过模块导入调用(设置内置数据加载器的行为):
| 方法名 | 说明 | 参数 |
|---|---|---|
| setLocalCharData | 设置全局本地汉字数据映射,优先于网络加载,适用于全量离线 | map: UTSJSONObject |
| setCharDataVersion | 设置网络加载的 hanzi-writer-data CDN 版本号(默认 2.0.1),切换数据源版本 |
version: string |
import { setLocalCharData, setCharDataVersion } from '@/uni_modules/lime-hanzi-writer'
// 全量离线:所有用到的汉字都需提前放入 map
setLocalCharData({ '永': yongData, '汉': hanData })
// 使用其它 CDN 版本(别忘了同步配置对应域名白名单)
setCharDataVersion('3.0.0')
Events
| 事件名 | 说明 | 回调参数 |
|---|---|---|
| mistake | 测验中书写错误时触发 | StrokeData |
| correctStroke | 测验中正确书写笔画时触发 | StrokeData |
| complete | 测验完成时触发 | { character: string, totalMistakes: number } |
AnimationOptions
| 参数 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| duration | 动画时长(ms) | number | - |
| onComplete | 动画完成回调 | (res: { canceled: boolean }) => void | - |
QuizOptions
| 参数 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| onComplete | 测验完成回调 | (summary: { character: string; totalMistakes: number }) => void | - |
| onCorrectStroke | 正确书写笔画回调 | (strokeData: StrokeData) => void | - |
| onMistake | 书写错误回调 | (strokeData: StrokeData) => void | - |
StrokeData
| 字段 | 说明 | 类型 |
|---|---|---|
| character | 当前汉字 | string |
| strokeNum | 当前笔画序号 | number |
| mistakesOnStroke | 当前笔画错误次数 | number |
| totalMistakes | 总错误次数 | number |
| strokesRemaining | 剩余笔画数 | number |
| drawnPath | 用户绘制的路径 | { points: Point[] } |
| isBackwards | 是否反向书写 | boolean |
updateColor 的 colorName 合法取值:strokeColor / radicalColor / highlightColor / outlineColor / drawingColor / highlightCompleteColor
Vue2 使用说明
插件使用了 composition-api,如需在 Vue2 项目中使用,请按照官方教程配置。
关键配置代码(在 main.js 中添加):
// vue2
import Vue from 'vue'
import VueCompositionAPI from '@vue/composition-api'
Vue.use(VueCompositionAPI)
快速预览
导入插件后,可以直接使用以下标签查看演示效果:
<!-- 代码位于 uni_modules/lime-hanzi-writer/components/lime-hanzi-writer -->
<lime-hanzi-writer />
插件标签说明
| 标签类型 | 示例 | 说明 |
|---|---|---|
| 组件标签 | l-hanzi-writer |
默认组件标签,直接使用组件功能 |
| 演示标签 | lime-hanzi-writer |
默认演示标签,查看完整演示效果 |
平台已知问题
uni-app x App 端
| 问题 | 说明 | 状态 |
|---|---|---|
| lineDashOffset 取值范围受限 | App 端 ctx.lineDashOffset 不支持超过约 60 的值,而汉字笔画路径很长(dashOffset 远超 60),导致基于 setLineDash + lineDashOffset 的笔画生长动画失效。已通过条件编译改用按 displayPortion 截取路径点的方式模拟书写效果 |
已修复(折线截取,精度略低于 Web 端 dash 方案) |

收藏人数:
购买源码授权版(
试用
赞赏(0)
下载 73697
赞赏 594
下载 12509477
赞赏 1943
赞赏
京公网安备:11010802035340号