当前位置:首页 > JavaScript

js实现波纹

2026-03-15 05:19:09JavaScript

实现波纹效果的 JavaScript 方法

使用 JavaScript 实现波纹效果可以通过监听点击事件动态创建波纹元素,并添加动画效果。以下是两种常见实现方式:

基础 DOM 操作实现

document.addEventListener('click', function(e) {
  const ripple = document.createElement('span');
  ripple.className = 'ripple';
  document.body.appendChild(ripple);

  ripple.style.left = `${e.clientX}px`;
  ripple.style.top = `${e.clientY}px`;

  ripple.style.animation = 'ripple-effect 0.6s linear';

  ripple.addEventListener('animationend', () => {
    ripple.remove();
  });
});

对应 CSS 样式:

.ripple {
  position: absolute;
  transform: translate(-50%, -50%);
  width: 20px;
  height: 20px;
  border-radius: 50%;
  background-color: rgba(255, 255, 255, 0.7);
  pointer-events: none;
}

@keyframes ripple-effect {
  0% {
    transform: translate(-50%, -50%) scale(1);
    opacity: 1;
  }
  100% {
    transform: translate(-50%, -50%) scale(20);
    opacity: 0;
  }
}

Canvas 高性能实现

对于需要大量波纹效果的场景,使用 Canvas 性能更优:

const canvas = document.createElement('canvas');
canvas.style.position = 'fixed';
canvas.style.top = '0';
canvas.style.left = '0';
canvas.style.pointerEvents = 'none';
document.body.appendChild(canvas);

const ctx = canvas.getContext('2d');
let ripples = [];

function resizeCanvas() {
  canvas.width = window.innerWidth;
  canvas.height = window.innerHeight;
}

window.addEventListener('resize', resizeCanvas);
resizeCanvas();

document.addEventListener('click', (e) => {
  ripples.push({
    x: e.clientX,
    y: e.clientY,
    radius: 0,
    alpha: 1
  });
});

function animate() {
  ctx.clearRect(0, 0, canvas.width, canvas.height);

  for (let i = 0; i < ripples.length; i++) {
    const ripple = ripples[i];
    ctx.beginPath();
    ctx.arc(ripple.x, ripple.y, ripple.radius, 0, Math.PI * 2);
    ctx.strokeStyle = `rgba(255, 255, 255, ${ripple.alpha})`;
    ctx.lineWidth = 2;
    ctx.stroke();

    ripple.radius += 3;
    ripple.alpha -= 0.02;

    if (ripple.alpha <= 0) {
      ripples.splice(i, 1);
      i--;
    }
  }

  requestAnimationFrame(animate);
}

animate();

优化注意事项

  1. 性能优化:对于频繁触发的场景,建议使用对象池技术复用 DOM 元素或限制同时显示的波纹数量
  2. 移动端适配:需要处理 touch 事件确保移动设备正常触发
  3. 样式定制:可以通过 CSS 变量或参数配置波纹颜色、大小和动画时长
  4. 事件委托:在特定容器上实现时,应该使用事件委托而非全局监听

现代 CSS 替代方案

纯 CSS 方案可以使用 :active 伪类结合动画:

js实现波纹

.button {
  position: relative;
  overflow: hidden;
}

.button:active::after {
  content: '';
  position: absolute;
  width: 100%;
  height: 100%;
  top: 0;
  left: 0;
  background: radial-gradient(circle, rgba(255,255,255,0.8) 10%, transparent 70%);
  animation: ripple 0.6s linear;
}

@keyframes ripple {
  from {
    transform: scale(0);
    opacity: 1;
  }
  to {
    transform: scale(4);
    opacity: 0;
  }
}

标签: 波纹js
分享给朋友:

相关文章

js实现延迟

js实现延迟

实现延迟的方法 在JavaScript中,实现延迟操作有多种方式,以下是几种常见的方法: 使用setTimeout函数 setTimeout是JavaScript中最常用的延迟执行方法。它接受一个回…

js实现百叶窗

js实现百叶窗

使用CSS和JavaScript实现百叶窗效果 通过CSS动画和JavaScript事件监听可以实现百叶窗效果。核心思路是将内容区域分割为多个条状元素,通过控制它们的展开/折叠状态来模拟百叶窗。 &…

使用js实现

使用js实现

使用JavaScript实现 JavaScript可以通过Math.random()函数生成随机数,结合其他方法可以实现多种随机数生成需求。 // 生成0到1之间的随机小数 const random…

js实现密码

js实现密码

密码强度验证 使用正则表达式验证密码强度是一种常见方法。以下代码检查密码是否包含大小写字母、数字和特殊字符,且长度至少为8位: function checkPasswordStrength(pass…

js实现文字滚动

js实现文字滚动

实现文字滚动的几种方法 使用CSS动画实现滚动 通过CSS的@keyframes和transform属性可以实现平滑的文字滚动效果。 <style> .scroll-text { w…

js实现下拉菜单

js实现下拉菜单

使用HTML和CSS创建基础结构 HTML部分需要包含一个触发下拉的按钮和隐藏的下拉菜单内容: <div class="dropdown"> <button class="dr…