原生JS实现Ripple水波纹按钮效果
本文介绍如何使用原生JavaScript和CSS3实现简单的Ripple水波纹按钮效果。通过监听点击事件动态添加动画类,利用CSS缩放属性实现扩散效果,并针对移动端触摸事件进行优化,提供完整的HTML、CSS及JS代码示例。
原生JS实现Ripple水波纹按钮效果
整理并精简了一段使用原生JavaScript实现的简单Ripple(水波纹)按钮代码,在此进行分享。
具体效果如图所示。

HTML结构准备
首先是HTML结构的准备。
<ul id="nav">
<li>
<a href='#'>
<span>首页</span>
<span class="circle"></span>
</a>
</li>
<li>
<a href='#'>
<span>我的</span>
<span class="circle"></span>
</a>
</li>
<li>
<a href='#'>
<span>更多</span>
<span class="circle"></span>
</a>
</li>
</ul>
采用典型的菜单li布局,其中span.circle元素代表点击时弹出的小圆圈。
CSS样式配置
接下来是CSS样式的配置。
#nav {
display: flex;
}
#nav li {
position: relative;
overflow: hidden;
flex: 1;
}
li a {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
}
.circle{
position: absolute;
background: rgba(86,187,247,.1);
width: 1px;
height: 1px;
top:50%;
left: 50%;
border-radius: 50%;
}
.circle.act{
animation: navCircle .4s;
}
@keyframes navCircle
{
from {transform: scale(0);border-radius: 50%;}
to {transform:scale(200);border-radius: 50%;}
}
布局思路如下:为li元素设置相对定位,为小圆圈设置绝对定位,并为其添加navCircle动画。该动画利用CSS3的缩放功能使圆圈变大。经过测试,设置为200倍缩放且时长为0.4秒时效果较为人性化,其他倍数用户可自行尝试。
JavaScript逻辑实现
最后是JavaScript逻辑的实现。
var li = document.getElementById('nav').querySelectorAll('li');
var circle = document.getElementById('nav').querySelectorAll('.circle');
for(var i=0,len = li.length;i<len;i++){
((i)=>{
li[i].addEventListener('click',(e)=>{
circle[i].setAttribute('class','circle act');
circle[i].setAttribute('style','top:'+e.layerY+'px;left:'+e.layerX+'px');
});
li[i].addEventListener('touchend',()=>{
circle[i].setAttribute('class','circle');
})
})(i)
}
代码逻辑较为直观:当点击li元素时,为小圆圈添加 'act'类名,并设置其起始位置;在触摸结束时,移除'act'类名。有读者可能会问为何不使用touchstart事件?这是因为layerY属性在相关上下文中不可用,经过查找并未找到该属性。此外,未使用forEach是因为部分浏览器不支持该方法,导致兼容性问题。
注意:touchend事件仅适用于移动端环境。
开发过程说明。
开发过程说明
开发此功能的初衷是参考Android应用中的类似交互,探索H5的实现方式。起初尝试通过随时间增加宽度和高度来实现,但发现性能表现不佳。随后改为直接增加缩放倍数,从而实现了性能与效果的平衡,最终完成了该功能。
D3.js 比例尺与坐标轴的配置详解
2026-11-05 16:54:46
JavaScript怎么遍历对象的Symbol键和不可枚举属性
2026-11-05 13:13:39
封装一个健壮的JS字符串判空工具函数
2026-11-05 12:16:14
JavaScript合并数组的三种常用方法:concat、扩展运算符与push
2026-11-05 11:22:29
JavaScript立即执行函数(IIFE)是什么及基本语法
2026-11-05 10:51:19
