当前位置:首页 > React

react实现点击波纹效果

2026-01-27 19:07:57React

实现点击波纹效果的方法

在React中实现点击波纹效果可以通过CSS和JavaScript结合完成。以下是两种常见的方法:

使用CSS动画和React事件

创建一个自定义按钮组件,利用CSS动画实现波纹效果。

import React from 'react';
import './RippleButton.css';

const RippleButton = ({ children, onClick }) => {
  const createRipple = (event) => {
    const button = event.currentTarget;
    const circle = document.createElement('span');
    const diameter = Math.max(button.clientWidth, button.clientHeight);
    const radius = diameter / 2;

    circle.style.width = circle.style.height = `${diameter}px`;
    circle.style.left = `${event.clientX - button.getBoundingClientRect().left - radius}px`;
    circle.style.top = `${event.clientY - button.getBoundingClientRect().top - radius}px`;
    circle.classList.add('ripple');

    const ripple = button.getElementsByClassName('ripple')[0];
    if (ripple) {
      ripple.remove();
    }

    button.appendChild(circle);
    if (onClick) onClick(event);
  };

  return (
    <button className="ripple-button" onClick={createRipple}>
      {children}
    </button>
  );
};

export default RippleButton;

对应的CSS文件:

react实现点击波纹效果

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

.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;
  }
}

使用Material-UI的Ripple效果

如果项目中使用Material-UI,可以直接使用其提供的ButtonBase组件,它内置了波纹效果。

import React from 'react';
import Button from '@material-ui/core/Button';

const RippleButton = () => {
  return (
    <Button variant="contained" color="primary">
      Click for Ripple
    </Button>
  );
};

export default RippleButton;

Material-UI的按钮默认已经实现了Material Design规范的波纹效果,无需额外配置。

react实现点击波纹效果

自定义Hook实现

创建一个可复用的useRipple钩子,方便在任何元素上添加波纹效果。

import { useRef } from 'react';

const useRipple = () => {
  const ref = useRef(null);

  const applyRipple = (e) => {
    const target = ref.current;
    const rect = target.getBoundingClientRect();
    const x = e.clientX - rect.left;
    const y = e.clientY - rect.top;
    const diameter = Math.max(target.clientWidth, target.clientHeight);

    const ripple = document.createElement('div');
    ripple.style.width = ripple.style.height = `${diameter}px`;
    ripple.style.left = `${x - diameter/2}px`;
    ripple.style.top = `${y - diameter/2}px`;
    ripple.classList.add('ripple-effect');

    target.appendChild(ripple);

    setTimeout(() => {
      ripple.remove();
    }, 600);
  };

  return [ref, applyRipple];
};

export default useRipple;

使用示例:

import React from 'react';
import useRipple from './useRipple';
import './RippleEffect.css';

const RippleComponent = () => {
  const [rippleRef, applyRipple] = useRipple();

  return (
    <div 
      ref={rippleRef}
      onClick={applyRipple}
      className="ripple-container"
    >
      Click Me
    </div>
  );
};

export default RippleComponent;

对应的CSS:

.ripple-container {
  position: relative;
  overflow: hidden;
  padding: 20px;
  background-color: #2196f3;
  color: white;
  cursor: pointer;
}

.ripple-effect {
  position: absolute;
  border-radius: 50%;
  background-color: rgba(255, 255, 255, 0.7);
  animation: ripple-animation 0.6s linear;
  pointer-events: none;
}

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

以上方法提供了不同复杂度的实现方案,可以根据项目需求选择最适合的方式。纯CSS+React的方案适合轻量级实现,而Material-UI的方案适合遵循Material Design规范的项目,自定义Hook则提供了最大的灵活性。

标签: 波纹效果
分享给朋友:

相关文章

vue实现定位效果

vue实现定位效果

使用Geolocation API实现定位 在Vue中可以通过浏览器内置的Geolocation API获取用户位置信息。需要在组件的mounted钩子中调用相关方法: mounted() {…

vue 实现分页效果

vue 实现分页效果

使用 Element UI 实现分页 Element UI 提供了现成的分页组件 el-pagination,适合快速集成到 Vue 项目中。 安装 Element UI: npm install…

vue 实现toogle效果

vue 实现toogle效果

使用 v-if 和 v-else 实现切换 通过 Vue 的指令 v-if 和 v-else 可以轻松实现元素的显示与隐藏切换。 <template> <button @c…

vue 实现动画效果

vue 实现动画效果

Vue 实现动画效果的方法 Vue 提供了多种方式实现动画效果,包括内置的过渡系统、第三方动画库以及 CSS 动画。以下是几种常见的方法: 使用 Vue 内置过渡系统 Vue 的 <trans…

vue实现不了效果

vue实现不了效果

在 Vue 中实现特定效果时遇到问题,通常与代码逻辑、数据绑定或生命周期管理有关。以下是常见排查方向和解决方案: 检查数据绑定 确保数据已正确声明并在模板中绑定。Vue 的响应式系统依赖 data…

vue实现回弹效果

vue实现回弹效果

Vue 实现回弹效果的方法 回弹效果(Bounce Effect)常见于移动端交互,可以通过 CSS 动画或 JavaScript 实现。以下是几种在 Vue 中实现回弹效果的方案: 使用 CSS…