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

推荐订阅源

WordPress大学
WordPress大学
Stack Overflow Blog
Stack Overflow Blog
Latest news
Latest news
T
The Blog of Author Tim Ferriss
D
DataBreaches.Net
C
Check Point Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Security Latest
Security Latest
宝玉的分享
宝玉的分享
S
Schneier on Security
Blog — PlanetScale
Blog — PlanetScale
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Cisco Talos Blog
Cisco Talos Blog
MyScale Blog
MyScale Blog
B
Blog RSS Feed
N
Netflix TechBlog - Medium
P
Privacy & Cybersecurity Law Blog
L
LINUX DO - 热门话题
Apple Machine Learning Research
Apple Machine Learning Research
T
Tenable Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
NISL@THU
NISL@THU
Google DeepMind News
Google DeepMind News
Hacker News: Ask HN
Hacker News: Ask HN
Schneier on Security
Schneier on Security
博客园 - Franky
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
S
Secure Thoughts
T
Threat Research - Cisco Blogs
D
Docker
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
人人都是产品经理
人人都是产品经理
G
GRAHAM CLULEY
Application and Cybersecurity Blog
Application and Cybersecurity Blog
博客园 - 【当耐特】
PCI Perspectives
PCI Perspectives
GbyAI
GbyAI
酷 壳 – CoolShell
酷 壳 – CoolShell
Cyberwarzone
Cyberwarzone
V
Vulnerabilities – Threatpost
F
Fortinet All Blogs
罗磊的独立博客
Engineering at Meta
Engineering at Meta
Y
Y Combinator Blog
SecWiki News
SecWiki News
A
Arctic Wolf
小众软件
小众软件
T
Troy Hunt's Blog
博客园 - 三生石上(FineUI控件)
Know Your Adversary
Know Your Adversary

Surmon.me

一人有限集团 你就是不敢 创造力是温柔的谎言 人类正在退出人类 AI 代替不了这样的你 脉冲点火背后的架构设计 基于 Cloudflare 生态的 AI Agent 实现 NodePress 支持用户登录了 从统计学习到通用智能 2025 投资报告:走慢的路 无依之地 会杀人的菩萨 无我不是共识 文化的积重与偏见 当下即安 科学的尽头是态度 无我不是 Egoless 信仰不因恐惧而存在 世间无解的矛与盾 先别急着做些什么 佛不需要你的皈依 真理的幻觉 两扇大门 造心里的浮屠 自胜者强 逻辑与智慧 真的相 快乐的秘密 只需愿意 是名体验 最深沉的梦 森林里倒下的树 现象与相 庸人自扰 React 与 Vue 的完美融合 开心就好吗 与原生家庭和解 两支毒箭 怎么自净其意 一尘不染 一片白云 让风穿膛而过 喝下去,然后闭嘴 活在当下 当纠结发生时 唯「我」独尊 一场把戏(时间) 一场把戏(二元对立) “我” 和 “我” 谁是众生? 船里没有人 玫瑰不需要说话 没有人能渡任何人 你我为轮,使之不再 当我们在谈论独立时 自我约束就是最好的自我接纳 从善与恶的表象出发 佛法不是心理学 别人眼中的你并不是你 高高山上走 祝你心想事成 祝你的噩梦早日发生 道是无情却有情 裙子只为自己而穿 不要盲目地评估自己 先别急着 “爱自己” 让生命欣然舞动 你无法复制乔布斯 符号不是目的 如果一件事发生了 每当我起心动念时 爱出者爱返 理解不是尊重的基础 在没有解决自己的问题之前 “知足常乐” 不是比较 逻辑是无法成为信仰的 买不到的自由 成为诵经者 伤口听不懂大道理 是立场让你不自由 - Unfreedom 天雨大不润无根之草 做自己的神 当心诱惑本身 牛洞冥思录 修罗启示录 让大脑自举 我更喜欢叫它无梦寺 存在主义也许不是解药 出南洋记 2022 的所有答复 没意义的表达 思考的记录 故宫暂行之幻想 极端的比较 解构的终极 舍利子是如何炼成的 心要野 佛教的偏见 文艺青年 我是动物
涟漪效果是怎么实现的
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 就可以了。

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

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