当前位置:首页 > VUE

vue水波球实现

2026-01-16 06:26:52VUE

Vue 水波球实现方法

水波球(Ripple Effect)是一种常见的交互效果,当用户点击或触摸元素时,会产生类似水波纹的扩散效果。以下是几种实现方式:

使用 CSS 和 Vue 事件

通过 Vue 的事件绑定和 CSS 动画实现基础水波效果:

<template>
  <div class="ripple-container" @click="createRipple">
    <slot></slot>
    <span class="ripple" :style="rippleStyle"></span>
  </div>
</template>

<script>
export default {
  data() {
    return {
      rippleStyle: {}
    }
  },
  methods: {
    createRipple(e) {
      const container = e.currentTarget
      const circle = document.createElement('span')
      const diameter = Math.max(container.clientWidth, container.clientHeight)
      const radius = diameter / 2

      this.rippleStyle = {
        width: `${diameter}px`,
        height: `${diameter}px`,
        left: `${e.clientX - container.getBoundingClientRect().left - radius}px`,
        top: `${e.clientY - container.getBoundingClientRect().top - radius}px`
      }

      setTimeout(() => {
        this.rippleStyle = {}
      }, 600)
    }
  }
}
</script>

<style>
.ripple-container {
  position: relative;
  overflow: hidden;
  display: inline-block;
}

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

@keyframes ripple {
  to {
    transform: scale(4);
    opacity: 0;
  }
}
</style>

使用第三方库

对于更复杂的效果,可以考虑使用专门的水波效果库:

  1. 安装 vue-ripple-directive

    npm install vue-ripple-directive
  2. 在 Vue 项目中使用:

    
    import Vue from 'vue'
    import Ripple from 'vue-ripple-directive'

Vue.directive('ripple', Ripple)


3. 在模板中应用:
```html
<button v-ripple>Click Me</button>

自定义指令实现

创建自定义 Vue 指令实现更灵活的控制:

Vue.directive('ripple', {
  bind(el) {
    el.style.position = 'relative'
    el.style.overflow = 'hidden'

    el.addEventListener('click', (e) => {
      const circle = document.createElement('span')
      const diameter = Math.max(el.clientWidth, el.clientHeight)
      const radius = diameter / 2

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

      const existingRipple = el.querySelector('.ripple-effect')
      if (existingRipple) {
        existingRipple.remove()
      }

      el.appendChild(circle)

      setTimeout(() => {
        circle.remove()
      }, 600)
    })
  }
})

配套 CSS:

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

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

注意事项

  1. 性能优化:避免频繁创建和移除 DOM 元素,可以复用已有的波纹元素
  2. 移动端适配:考虑添加 touchstart 事件支持移动设备
  3. 颜色自定义:通过 props 或 CSS 变量允许自定义波纹颜色
  4. 无障碍访问:确保效果不会干扰键盘导航和屏幕阅读器

以上方法提供了从简单到复杂的不同实现方案,可根据项目需求选择合适的实现方式。

vue水波球实现

标签: 水波vue
分享给朋友:

相关文章

前端多线程实现vue

前端多线程实现vue

前端多线程与Vue的结合 在Vue中实现多线程通常通过Web Worker技术完成。Web Worker允许在后台线程中运行脚本,避免阻塞主线程,适合处理计算密集型任务。 使用Web Worker…

vue实现滚动截屏

vue实现滚动截屏

实现滚动截屏的基本思路 滚动截屏通常指对超出可视区域的长页面进行完整截图。在Vue中,可以通过结合DOM操作、Canvas绘制及第三方库实现。以下是具体方法: 使用html2canvas库实现 安装…

vue按钮实现截屏

vue按钮实现截屏

Vue 按钮实现截屏的方法 在 Vue 项目中实现截屏功能可以通过多种方式完成,以下是几种常见的方法: 使用 html2canvas 库 安装 html2canvas 库: npm insta…

vue 实现简单登陆

vue 实现简单登陆

以下是一个使用 Vue 3 实现的简单登录功能示例,包含表单验证和基础交互逻辑: 创建 Vue 组件 <template> <div class="login-containe…

vue路由实现内部切换

vue路由实现内部切换

Vue 路由实现内部切换的方法 Vue Router 是 Vue.js 官方的路由管理器,用于实现单页应用(SPA)的页面切换。以下是几种常见的内部路由切换方式: 使用 <router-lin…

vue实现展开与收起

vue实现展开与收起

Vue 实现展开与收起功能 在 Vue 中实现展开与收起功能可以通过多种方式完成,以下是一些常见的方法: 使用 v-show 或 v-if 控制显示 通过 Vue 的指令 v-show 或 v-if…