当前位置:首页 > VUE

vue实现点击涟漪

2026-03-28 14:47:25VUE

Vue 实现点击涟漪效果

实现点击涟漪效果可以通过 CSS 和 Vue 的事件绑定结合完成。以下是两种常见的实现方式:

使用纯 CSS 和 Vue 事件

通过动态添加涟漪元素并利用 CSS 动画实现效果。

vue实现点击涟漪

<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>

使用第三方库

可以使用现成的 Vue 涟漪效果库,如 vue-ripple-directive

安装:

vue实现点击涟漪

npm install vue-ripple-directive

使用:

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

Vue.directive('ripple', Ripple)
<button v-ripple>Click me</button>

自定义指令实现

创建自定义 Vue 指令实现更灵活的涟漪效果:

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

    el.addEventListener('click', (e) => {
      const ripple = document.createElement('div')
      ripple.className = 'ripple-effect'

      const rect = el.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`

      el.appendChild(ripple)

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

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

这些方法提供了不同复杂度的实现方案,可以根据项目需求选择最适合的方式。纯 CSS 方案轻量但功能有限,自定义指令方案更灵活,第三方库则提供了开箱即用的解决方案。

标签: 涟漪vue
分享给朋友:

相关文章

vue 实现回复

vue 实现回复

Vue 实现回复功能 在 Vue 中实现回复功能通常涉及表单提交、数据绑定和列表渲染。以下是实现步骤和代码示例: 数据绑定与表单 <template> <div>…

vue 实现轮播

vue 实现轮播

Vue 实现轮播的方法 使用第三方库(如 Swiper) 安装 Swiper 库: npm install swiper 在 Vue 组件中引入 Swiper: <template&…

实现vue datepicker

实现vue datepicker

安装依赖 使用 vue-datepicker 或第三方库如 v-calendar 或 vue2-datepicker。以 vue2-datepicker 为例: npm install vue2…

vue实现swipe

vue实现swipe

Vue实现Swipe功能的方法 使用第三方库(推荐) Vue生态中有多个成熟的轮播/滑动组件库,例如vue-awesome-swiper或swiper/vue。以下是基于swiper/vue的实现示例…

vue实现快手

vue实现快手

Vue 实现类似快手的功能 Vue.js 是一个渐进式 JavaScript 框架,适合构建复杂的单页应用。要实现类似快手的功能,可以结合 Vue 和相关技术栈进行开发。 核心功能模块 视频流展示…

vue 实现长按

vue 实现长按

实现长按功能的基本思路 在Vue中实现长按功能,通常需要监听元素的mousedown或touchstart事件,启动一个计时器。当用户按住元素超过设定的时间阈值时,触发长按回调函数。如果在时间阈值内触…