所有分类
  • 所有分类
  • Html5资源
  • React资源
  • Vue资源
  • Php资源
  • ‌小程序资源
  • Python资源

Vue3水波纹指令:2025年Material Design交互新标准

概述

vue-ripple-directive 是一系列为 Vue.js 应用提供 Material Design 风格水波纹效果的指令库。这些库让开发者能够轻松地为任何元素添加点击波纹动画效果,显著提升用户交互体验,让界面更加生动有趣。

安装

Vue 2 版本

npm install vue-ripple-directive --save
# 或者
yarn add vue-ripple-directive

Vue 3 版本

npm install vue3-whr-ripple-directive --save
# 或者
yarn add vue3-whr-ripple-directive

基本使用

Vue 2 中使用

// main.js
import Ripple from "vue-ripple-directive";

Vue.directive("ripple", Ripple);

Vue 3 中使用

// main.js
import { createApp } from "vue";
import Ripple from "vue3-whr-ripple-directive";

const app = createApp(App);
app.directive("ripple", Ripple);
app.mount("#app");

基础示例

<div v-ripple class="button is-primary">前端开发技术前沿</div>

配置选项

参数类型默认值说明
color-valueString‘rgba(0, 0, 0, 0.35)’水波纹颜色
修饰符mouseover(悬停触发)、数字(动画时长)

全局设置

import Ripple from "vue-ripple-directive";

Ripple.color = "rgba(255, 255, 255, 0.35)";
Ripple.zIndex = 55;
Vue.directive("ripple", Ripple);

使用场景

按钮交互

<template>
  <div class="flex gap-4">
    <button v-ripple class="primary-button">点击我</button>
    <button v-ripple="'rgba(255, 0, 0, 0.4)'" class="primary-button">
      自定义颜色
    </button>
    <button v-ripple.mouseover.500 class="primary-button">鼠标悬停触发</button>
  </div>
</template>

<style>
.primary-button {
  background: #007bff;
  color: white;
  border: none;
  padding: 12px 24px;
  border-radius: 4px;
  cursor: pointer;
  position: relative;
  overflow: hidden;
}
</style>

列表项

<template>
  <div class="bg-white rounded-xl shadow-2xl overflow-hidden">
    <div
      v-for="item in items"
      :key="item.id"
      v-ripple
      class="p-6 cursor-pointer relative overflow-hidden transition-all duration-200 ease-in-out border-b border-slate-100 hover:bg-slate-50 hover:translate-x-1 last:border-b-0"
    >
      <div>
        <h4 class="text-lg font-semibold text-slate-800 mb-2">
          {{ item.title }}
        </h4>
        <p class="text-sm text-slate-600 leading-relaxed">
          {{ item.description }}
        </p>
      </div>
    </div>
  </div>
</template>

<script setup>
const items = [
  {
    id: 1,
    title: "Vue 3 组合式API",
    description: "使用 setup() 函数和响应式系统",
  },
  {
    id: 2,
    title: "TypeScript 类型系统",
    description: "增强代码可维护性和开发体验",
  },
  {
    id: 3,
    title: "Vite 构建工具",
    description: "快速的开发服务器和热更新",
  },
  {
    id: 4,
    title: "CSS3 动画效果",
    description: "流畅的过渡和变换动画",
  },
  {
    id: 5,
    title: "响应式设计",
    description: "适配各种屏幕尺寸的布局",
  },
];
</script>

表格

<template>
  <div class="bg-white rounded-lg shadow-md overflow-hidden">
    <!-- 表头 -->
    <div class="bg-blue-600 text-white">
      <div class="grid grid-cols-4 gap-4 p-4 font-semibold">
        <div>姓名</div>
        <div>邮箱</div>
        <div>部门</div>
        <div>状态</div>
      </div>
    </div>

    <!-- 表格内容 -->
    <div class="divide-y divide-gray-200">
      <div
        v-for="user in users"
        :key="user.id"
        v-ripple
        class="grid grid-cols-4 gap-4 p-4 hover:bg-gray-50 cursor-pointer transition-colors"
      >
        <div class="font-medium text-gray-900">{{ user.name }}</div>
        <div class="text-gray-600">{{ user.email }}</div>
        <div class="text-gray-600">{{ user.department }}</div>
        <div>
          <span
            class="inline-flex items-center px-2 py-1 rounded-full text-xs font-medium"
            :class="
              user.status === '在线'
                ? 'bg-green-100 text-green-800'
                : 'bg-gray-100 text-gray-800'
            "
          >
            {{ user.status }}
          </span>
        </div>
      </div>
    </div>
  </div>
</template>

<script setup>
const users = [
  {
    id: 1,
    name: "张三",
    email: "zhangsan@example.com",
    department: "技术部",
    status: "在线",
  },
  {
    id: 2,
    name: "李四",
    email: "lisi@example.com",
    department: "产品部",
    status: "离线",
  },
  {
    id: 3,
    name: "王五",
    email: "wangwu@example.com",
    department: "设计部",
    status: "在线",
  },
];
</script>

最佳实践

容器设置

/* 确保容器有相对定位 */
.ripple-container {
  position: relative;
  overflow: hidden; /* 防止波纹溢出 */
}

颜色搭配

<template>
  <!-- 深色背景使用浅色波纹 -->
  <div v-ripple="'rgba(255, 255, 255, 0.3)'" class="dark-button">深色按钮</div>

  <!-- 浅色背景使用深色波纹 -->
  <div v-ripple="'rgba(0, 0, 0, 0.1)'" class="light-button">浅色按钮</div>
</template>

常见问题

1. 波纹位置不正确

问题: 波纹出现在错误的位置

解决方案: 确保容器有 position: relative

.ripple-container {
  position: relative;
}

2. 波纹颜色不显示

问题: 波纹颜色没有生效

解决方案: 确保颜色值格式正确

<!-- 正确的颜色格式 -->
<div v-ripple="'rgba(255, 0, 0, 0.5)'">红色波纹</div>
<div v-ripple="'#ff0000'">十六进制颜色</div>

3. 动画卡顿

问题: 波纹动画不流畅

解决方案: 减少同时存在的波纹数量

// 限制最大波纹数量
Vue.use(Ripple, {
  maxRipples: 3,
});

4. 移动端兼容性

问题: 在移动设备上效果不佳

解决方案: 使用触摸事件

<template>
  <div v-ripple.touch class="mobile-button">移动端按钮</div>
</template>

总结

vue-ripple-directive 库为 Vue 应用提供了简单易用的水波纹效果实现方案。通过合理使用这些库并遵循最佳实践,能够显著提升用户交互体验,让界面更加生动有趣。

原文链接:https://code.ifrontend.net/archives/1340,转载请注明出处。
0

评论0

显示验证码
没有账号?注册  忘记密码?