当前位置:首页 > 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文件:

.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规范的波纹效果,无需额外配置。

自定义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:

react实现点击波纹效果

.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实现框架效果

Vue 实现框架效果的方法 Vue.js 可以通过多种方式实现框架效果,包括使用内置指令、组件封装或第三方库。以下是几种常见的方法: 使用 Vue 指令实现基础框架效果 通过 Vue 的 v-if、…

vue实现预览效果

vue实现预览效果

实现预览效果的常见方法 在Vue中实现预览效果可以通过多种方式完成,以下列举几种典型场景和对应的实现方案: 图片/文件预览 使用<input type="file">结合FileRead…

vue实现点选效果

vue实现点选效果

实现点选效果的基本思路 在Vue中实现点选效果通常涉及监听用户的点击事件,并通过动态绑定类名或样式来改变元素的外观。核心是利用Vue的响应式数据和事件绑定机制。 使用v-bind和v-on实现 通过…

vue实现开关效果

vue实现开关效果

使用Vue实现开关效果 使用v-model绑定数据 通过v-model绑定一个布尔值来控制开关状态。当用户点击开关时,布尔值会自动更新。 <template> <div cla…

vue实现tab效果

vue实现tab效果

Vue 实现 Tab 效果的方法 使用动态组件和 v-if 通过 v-if 或 v-show 控制不同标签内容的显示与隐藏,结合点击事件切换当前激活的标签页。 <template>…

vue实现筛选效果

vue实现筛选效果

Vue 实现筛选效果的方法 基于计算属性的筛选 在 Vue 中可以通过计算属性实现数据的动态筛选。定义一个计算属性,根据用户输入的筛选条件返回过滤后的数据列表。 <template>…