声明
代码借鉴了 keen-ui 和 material-ui 的实现方式
前言
在日常项目中,经常会看到点击button或某个元素块时,有水波纹效果,如下图所示:
下面,我们将分析如何实现这个效果
设计
常见的波纹点击效果的实现方式是监听元素的 mousedown、
mouseup
事件(pc端), touchstart
touchend
事件(mobile端),因为mouse事件和touch事件时优先于click事件的,并且有多个回调状态。
通过监听上述事件,在元素内部创建一个波纹元素,并调整元素的 transform
和 opacity
属性,通过计算点击的位置来设置波纹元素的大小和位置,已达到波纹扩散的效果。
我们讲组件分为2个部分,circleRipple
子组件 和 ripple
父组件:
circleRipple
为波纹扩散组件,由transition
组件包裹来设置动画,实现波纹扩散效果ripple
父组件,监听mouse
和touch
相关事件来控制circleRipple
的位置和显示
实现
CircleRipple
利用 vue 的 transition
组件的来完成 circleRipple
的动画效果,之所以设置为子组件,就是为了方便从外部通过传参来控制它的样式。实现代码如下:
1 | <template> |
样式代码如下所示:
1 | .ripple-circle |
上述代码中有2个需要注意的属性:
- 设置
background-color: currentColor
, 使用该关键字的元素的(或其最近父元素)color属性的颜色值 - 设置
background-clip: padding-box
, 使背景被裁剪到内边距框,不包含border
Ripple
Ripple
需要控制 circleRipple
的显示,如果频繁点击可能出现多个 circleRipple
1 | <template> |
注意:@contextmenu.prevent 表示鼠标右击时阻止浏览器打开默认的菜单选项
针对上述代码的分析见下图所示:
👇下面有一个在线的可操作水波纹示例(大家可以点击亵玩):👇
https://codepen.io/shellWolf/pen/vPyQJX?editors=1100
样式代码如下所示:
1 | .ripple |
该组件通常与 button
、 cell
等组件结合使用。
使用注意事项:由于
Ripple
组件内部都是 position:absolute 布局,使用时,需要在外部加上 position:relative
✨请点击查看 DEMO 效果(滚动到水波纹点击效果那一栏)
附录 ✨