ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

morphicons三种使用模式全解析:非受控、受控、命令式——图标变形动画生命周期契约一次讲透

morphicons三种使用模式全解析:非受控、受控、命令式——图标变形动画生命周期契约一次讲透 morphicons三种使用模式全解析非受控、受控、命令式——图标变形动画生命周期契约一次讲透【免费下载链接】morphiconsAny icon morphs into any other — universal morphing for stroke-based icons with spring physics. Zero dependencies, ~7 KB gzip.项目地址: https://gitcode.com/gh_mirrors/mo/morphiconsmorphicons 是一个零依赖约 7 KB gzip的 SVG 图标变形动画库支持 React、Vue、Svelte、React Native 和 Web Component 五种绑定任意线性图标都能带弹簧物理平滑变形为另一个图标。本文面向新手用最少的心智负担讲透它的三种使用模式非受控、受控、命令式以及贯穿所有绑定的生命周期契约——即三种模式如何共存、优先级是什么、切换时动画怎么接。30 秒看懂三种模式速览morphicons 的设计哲学是状态在你手里动画是实现细节。三种模式对应三类场景模式核心属性 / 方法典型场景有无弹簧动画⭐ 非受控icon属性菜单 ↔ 关闭按钮切换覆盖 90% 用例✅ 有️ 受控fromtoprogress手势拖拽、滚动进度联动❌ 冻结定格由你驱动⚡ 命令式morphTo()/set()步骤序列、一次性临时切换morphTo有set无一个 3 行的非受控用法就能跑起来图标数据来自lucide等数据包的IconNode不是组件import { MorphIcon } from morphicons/react; import { Menu, X } from lucide; // data, not components MorphIcon icon{open ? X : Menu} springsnappy /状态在外部open变了morphicons 检测到属性变化后自动播放弹簧变形不需要任何 key、from/to 对或动画包装器。模式一非受控模式——改属性动画自动播放这是默认模式也是新手入口只要icon属性换了值就自动从当前形状飞过去。它的三个特点弹簧可选springsnappy快、轻微过冲、smooth临界阻尼无过冲、bouncy俏皮或传{ stiffness, damping }自定义。随时可打断变形到一半再点一次按钮动画会从当前中间形状重新规划并保留弹簧速度——连点不会跳变手感始终连续。属性穿透size、color、strokeWidth、className等与 lucide-react 同构可当静态图标的直接替代品。适合所有状态驱动的场景开关按钮、加载 → 完成、播放 → 暂停。模式二受控模式——把手柄交给手势和滚动当变形的进度应该由外部连续量决定拖拽距离、滚动位置、时间轴时弹簧反而碍事。这时切换到受控模式MorphIcon from{Menu} to{X} progress{dragProgress} /from/to定义一对端点progress0 到 1把图标冻结在这对之间的任意中间形态——每帧你给多少进度它就在哪没有弹簧、没有自己的时钟。两个行为值得记住进度正好 0 或 1 时输出的是端点图标的标准形状真实曲线不是折线近似中途改变progress是增量 seek不会每次从from重新走。模式三命令式模式——ref 拿出手柄序列随心有时目标图标无法用状态表达比如先变 A飞完再变 B最后停在 C。这时通过 ref / template ref /bind:this拿到MorphHandleconst ref useRefMorphHandle(null); MorphIcon ref{ref} icon{Menu} / ref.current?.morphTo(Check); // 动画飞过去 ref.current?.set(X); // 直接跳变不播动画morphTo与set的区别就一句话前者播放弹簧动画后者瞬间切换常用于重置、测试、截图。Web Component 版本里元素本身就是句柄el.morphTo(x)直接可用见 src/element/index.ts。生命周期契约三种模式的优先级与切换规则三个模式混用不是错误——morphicons 在五种绑定中共享同一份契约源码在 src/dom/controller.ts规则有且只有三条1. 惰性驱动第一个图标出现时才启动引擎不带任何图标挂载组件完全合法服务端输出path d。真正的动画驱动器在第一个图标出现时才诞生——无论它是晚到的icon属性比如异步加载的数据、晚到的from/to对还是命令式的set/morphTo。首个图标直接渲染、不播动画而驱动器还没诞生时调用morphTo行为等同于set没有起飞点也就没有可飞的动画。2. 受控优先成对存在时 icon 被忽略只要from和to同时存在这对端点就独占路径此时改icon会被忽略弹簧不会触发。把这对撤掉路径立刻交还icon并带动画接管。混用不报错优先级是显式约定的这正是受控模式给手势让路的语义基础。3. 干净重入离开受控模式会作废旧的冻结对任何一次退出受控模式命令式调用或icon接管都会使冻结的from/to对失效。之后再传回同样的from/to会基于from重新起算渲染结果与全新挂载在该progress时完全一致——不会出现记得上次停在中间的鬼影。这三条规则被镜像测试逐条钉死React 版在 test/react/mount.test.tsxVue 版在 test/vue/mount.test.tsSvelte 版在 test/svelte/mount.test.ts——三份测试覆盖同一组场景保证五种绑定行为一致。同一套契约五种绑定零差异理解契约后换框架只是语法切换语义完全相同ReactuseRef拿句柄逻辑在 src/react/index.tsxVuetemplate ref 拿句柄expose出morphTo/set逻辑在 src/vue/index.tsSveltebind:this拿句柄逻辑集中在 src/svelte/shared.tsReact Native与 React 同构额外解决 New Architecture 下 Fabric 提交覆盖的问题Web Component / Astromorph-icon元素即句柄SSR 输出精确静态 SVG、水合零闪烁见 src/astro/MorphIcon.astroSSR 是所有绑定的一致承诺服务端用纯核心不碰 DOM算出初始d字符串客户端水合时字节完全一致零闪烁、零布局偏移。图标数据契约IconNode或原始d字符串定义在 src/core/types.ts。新手常见问题 FAQ三种模式怎么选状态切换选非受控手势/滚动连续量驱动选受控无法用状态表达的序列或临时切换选命令式。90% 的场景只碰非受控。受控模式下改 icon 没反应是 bug 吗不是这是契约第 2 条成对存在时受控优先。撤掉from/to即可恢复icon驱动。动画太夸张或太慢换弹簧预设springsmooth无过冲、snappy快、bouncy俏皮。需要尊重系统减弱动态效果设置吗默认不降级图标微动效被认为普遍可接受全站需要时用reducedMotionuser此时 OS 开关打开后所有morphTo退化为瞬间切换。从哪里读源码一条最短路径生命周期契约的权威实现框架无关src/dom/controller.ts动画驱动器与弹簧src/dom/index.ts、src/core/spring.ts纯几何核心解析 → 重采样 → 对齐 → 插值src/core/ 目录三种模式在各框架的落地src/react/index.tsx、src/vue/index.ts镜像测试套件契约的验收标准test/react/mount.test.tsx架构决策背景docs/adr/0001-frozen-core-contracts-adapters-entry.md完整使用说明与性能数据README.md结语一句话带走本文非受控管状态、受控管手势、命令式管序列惰性启动、受控优先、干净重入。把这三条生命周期契约记牢五种绑定下的 morphicons 对你来说就是同一个组件——而它的体积只有约 7 KB。【免费下载链接】morphiconsAny icon morphs into any other — universal morphing for stroke-based icons with spring physics. Zero dependencies, ~7 KB gzip.项目地址: https://gitcode.com/gh_mirrors/mo/morphicons创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表