当前位置:首页 > JavaScript

js实现波纹

2026-02-02 05:35:26JavaScript

实现波纹效果的方法

使用JavaScript实现波纹效果可以通过监听点击事件,动态创建并动画化一个圆形元素来模拟水波纹扩散的效果。以下是实现步骤:

HTML结构

<button class="ripple-button">点击我</button>

CSS样式

.ripple-button {
  position: relative;
  overflow: hidden;
  padding: 12px 24px;
  background-color: #6200ee;
  color: white;
  border: none;
  border-radius: 4px;
  cursor: pointer;
}

.ripple {
  position: absolute;
  border-radius: 50%;
  background-color: rgba(255, 255, 255, 0.7);
  transform: scale(0);
  animation: ripple 600ms linear;
  pointer-events: none;
}

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

JavaScript代码

document.querySelectorAll('.ripple-button').forEach(button => {
  button.addEventListener('click', function(e) {
    const ripple = document.createElement('span');
    ripple.classList.add('ripple');

    const rect = this.getBoundingClientRect();
    const size = Math.max(rect.width, rect.height);
    const x = e.clientX - rect.left - size / 2;
    const y = e.clientY - rect.top - size / 2;

    ripple.style.width = ripple.style.height = `${size}px`;
    ripple.style.left = `${x}px`;
    ripple.style.top = `${y}px`;

    this.appendChild(ripple);

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

实现原理

  1. 创建基本按钮结构并设置position: relativeoverflow: hidden,这是为了限制波纹效果在按钮范围内显示。

  2. 当按钮被点击时,创建一个span元素作为波纹效果的基础元素,并添加ripple类。

    js实现波纹

  3. 计算点击位置相对于按钮的位置,确保波纹从点击点开始扩散。

  4. 设置波纹元素的大小为按钮宽高中的最大值,确保波纹能完全覆盖按钮。

  5. 使用CSS动画实现波纹扩散效果,通过scale变换使元素从小到大,同时逐渐降低透明度。

    js实现波纹

  6. 动画结束后移除波纹元素,避免DOM中积累过多无用元素。

增强版本

如果需要更高级的效果,可以添加以下改进:

document.querySelectorAll('.ripple-button').forEach(button => {
  button.addEventListener('mousedown', function(e) {
    if (e.button !== 0) return; // 只响应左键点击

    const ripple = document.createElement('span');
    ripple.classList.add('ripple');

    const rect = this.getBoundingClientRect();
    const size = Math.max(rect.width, rect.height);
    const x = e.clientX - rect.left - size / 2;
    const y = e.clientY - rect.top - size / 2;

    ripple.style.width = ripple.style.height = `${size}px`;
    ripple.style.left = `${x}px`;
    ripple.style.top = `${y}px`;

    const existingRipples = this.querySelectorAll('.ripple');
    existingRipples.forEach(r => r.remove());

    this.appendChild(ripple);
  });
});

这个版本做了以下改进:

  • 使用mousedown事件而非click事件,响应更快
  • 检查鼠标按键,确保只有左键会触发效果
  • 移除之前未完成的波纹效果,避免重叠

浏览器兼容性

这种方法在现代浏览器中都能良好工作,包括Chrome、Firefox、Safari和Edge。如果需要支持较旧的浏览器,可能需要添加CSS前缀:

@keyframes ripple {
  to {
    -webkit-transform: scale(4);
    transform: scale(4);
    opacity: 0;
  }
}

性能考虑

  1. 使用requestAnimationFrame可以进一步优化动画性能
  2. 避免在快速连续点击时创建过多波纹元素
  3. 考虑使用CSS硬件加速(如transformopacity)来提高动画流畅度

这种波纹效果实现方式轻量且高效,适合大多数Web应用场景。

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

相关文章

css3结合js制作

css3结合js制作

CSS3 结合 JavaScript 制作动态效果 CSS3 和 JavaScript 结合可以实现丰富的动态效果,包括动画、交互和响应式设计。以下是几种常见的实现方式: CSS3 动画与 Java…

js实现乘

js实现乘

JavaScript 实现乘法运算 在 JavaScript 中实现乘法运算可以通过多种方式完成,包括基本运算符、函数封装以及高级算法(如大数乘法)。以下是几种常见方法: 使用基本乘法运算符 Jav…

js 实现vue

js 实现vue

Vue.js 的基本实现 在 JavaScript 中实现 Vue.js 的核心功能,可以通过数据绑定、响应式系统和虚拟 DOM 来实现。以下是实现 Vue.js 核心功能的简化版本。 数据响应式系…

js实现授权

js实现授权

授权流程设计 授权流程通常涉及前端与后端的交互,常见方案包括OAuth2.0、JWT等。以JWT为例的典型流程: 用户提交凭证(如用户名密码)到认证服务 服务端验证通过后生成包含用户信息的JWT令牌…

js实现交换

js实现交换

交换变量的方法 在JavaScript中,交换两个变量的值有多种方法。以下是常见的几种实现方式: 使用临时变量 通过引入一个临时变量来存储其中一个变量的值,实现交换: let a = 1; le…

节流js实现

节流js实现

节流(Throttle)的实现原理 节流是一种限制函数执行频率的技术,确保函数在一定时间间隔内最多执行一次。适用于高频触发事件(如滚动、输入、窗口调整等)的场景。 基础实现方式 使用时间戳判断是否执…