惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

美团技术团队
阮一峰的网络日志
阮一峰的网络日志
T
The Blog of Author Tim Ferriss
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
宝玉的分享
宝玉的分享
L
LangChain Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Last Week in AI
Last Week in AI
博客园 - 司徒正美
M
MIT News - Artificial intelligence
人人都是产品经理
人人都是产品经理
WordPress大学
WordPress大学
B
Blog RSS Feed
H
Hackread – Cybersecurity News, Data Breaches, AI and More
博客园 - Franky
B
Blog
V
V2EX
J
Java Code Geeks
D
Docker
博客园 - 叶小钗
The Cloudflare Blog
量子位
博客园_首页
MongoDB | Blog
MongoDB | Blog

Surmon.me

一人有限集团 你就是不敢 创造力是温柔的谎言 人类正在退出人类 AI 代替不了这样的你 脉冲点火背后的架构设计 基于 Cloudflare 生态的 AI Agent 实现 NodePress 支持用户登录了 从统计学习到通用智能 2025 投资报告:走慢的路 无依之地 会杀人的菩萨 无我不是共识 文化的积重与偏见 当下即安 科学的尽头是态度 无我不是 Egoless 信仰不因恐惧而存在 世间无解的矛与盾 先别急着做些什么 佛不需要你的皈依 真理的幻觉 两扇大门 造心里的浮屠 自胜者强 逻辑与智慧 真的相 快乐的秘密 只需愿意 是名体验
涟漪效果是怎么实现的
Surmon · 2018-01-24 · via Surmon.me

涟漪效果是怎么实现的

其实,很简单很简单,我要画几张图。

之前 vue-touch-ripple 是基于 rippleJS 实现的,rippleJS 是一个封装好的库,时间有些早了。

突发奇想,想用 Vue 的思路将组件重构,所以,最终是目前最新版这么个结构:

  • ripple.vue 涟漪容器,用于控制涟漪层的渲染、配置的计算和传递、单个涟漪体的坐标和大小的计算、涟漪动画队列的维护和更新
  • core.vue 单个涟漪体本身,实例完成后即开始动画,动画使用定时器触发结束,结束后通知涟漪容器销毁自身

思路

点击一个元素,触发一次涟漪效果,涟漪效果不受任何外部条件影响(除非路由跳转释放了整个宿主组件)。

涟漪效果结束时(定时器触发),涟漪体向宿主组件(涟漪容器)发出结束信号,容器组件释放对应涟漪体(从动画队列/数组中删除此涟漪体)。

在执行释放时,需要检查鼠标是否抬起,如果鼠标未抬起,且目标涟漪体为动画末尾,则需要维持最后一位动画直至鼠标抬起。

涟漪容器的渲染时间应该 === 动画队列的首位渲染开始前 + 末尾渲染结束后,而动画队列的动画统一由 Vue 内置的 transition-group 驱动,所以需要使用 @enter@after-leave 时间来标记动画周期。

又因为动画队列在不断地迭代、渲染、释放,所以必须手动维护一个动画池计数,用以标记动画是否彻底完成,所以涟漪容器内部维护了一个 rippleCount 计数器,当计数器为 0 时,即为所有动画已释放之后,则可以释放涟漪宿主容器。

是不是晦涩难懂?没关系,我看得懂就行。

涟漪尺寸,这是个涉及点数学的问题,就是要计算出两个点之间的距离,看下面的图:

图好难画,就随便画一个吧!

最早以为初始化一个 1px 的圆,放大至对应的比例就可以,还可以减小渲染开销,没想到的是,放大后锯齿模糊了。

于是乎,初始化圆的时候便直接计算出 1:1 的尺寸,然后初始时缩放为 0.1 就可以了。

好了好了,就这样, 代码在这

现在我已经将博客的弹幕功能也使用这种分离的思路实现了,非常棒,我怎么这么优秀!