返回顶部
首页 > 资讯 > 前端开发 > JavaScript >怎么使用vue开发波纹点击特效组件
  • 683
分享到

怎么使用vue开发波纹点击特效组件

2024-04-02 19:04:59 683人浏览 安东尼
摘要

本篇内容主要讲解“怎么使用Vue开发波纹点击特效组件”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么使用vue开发波纹点击特效组件”吧!开发之前的思考常见的波

本篇内容主要讲解“怎么使用Vue开发波纹点击特效组件”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么使用vue开发波纹点击特效组件”吧!

开发之前的思考

常见的波纹点击效果的实现方式是监听元素的 mousedown 事件,在元素内部创建一个 波纹元素 ,并调整元素的 transfORM: scale(0);  到 transform: scale(1);, 通过计算点击的位置来设置 波纹元素 的大小和位置,以达到波纹扩散的效果。

我将组件分为两个部分, circleRipple.vue 和 TouchRipple.vue 各自实现不同的功能

  1. circleRipple.vue 波纹扩散组件,完成波纹扩散的效果

  2. TouchRipple.vue 监听 mouse 和 touch 相关事件,控制 circleRipple 的显示,位置。

circleRipple.vue

circleRipple 需要完成波纹扩展的效果,而且可以从外部控制它的大小和位置, 所以利用 vue 的 transition 动画完成效果,  提供mergeStyle 、 color 、opacity 参数来从外部控制它的样式。实现代码如下。

<template>   <transition name="mu-ripple">     <div class="mu-circle-ripple" :style="styles"></div>   </transition> </template>  <script> import {merge} from '../utils' export default {   props: {     mergeStyle: {       type: Object,       default () {         return {}       }     },     color: {       type: String,       default: ''     },     opacity: {       type: Number     }   },   computed: {     styles () {       return merge({}, {color: this.color, opacity: this.opacity}, this.mergeStyle)     }   } } </script>  <style lang="less"> @import "../styles/import.less"; .mu-circle-ripple{   position: absolute;   width: 100%;   height: 100%;   left: 0;   top: 0;   pointer-events: none;   user-select: none;   border-radius: 50%;   background-color: currentColor;   background-clip: padding-box;   opacity: 0.1; }  .mu-ripple-enter-active, .mu-ripple-leave-active{   transition: transform 1s @easeOutFunction, opacity 2s @easeOutFunction; }  .mu-ripple-enter {   transform: scale(0); }  .mu-ripple-leave-active{   opacity: 0 !important; } </style>

vue2 对于动画方面做了比较大的修改,除了把指令换成组件外,它还可以完成更复杂的动画效果,具体可以看这里 vue2 transition

TouchRipple.vue

TouchRipple 需要控制 circleRipple 的显示。完成以下内容:

  1. 监听 mouse 和 touch 相关事件, 控制 circleRipple 的显示。

  2. 通过点击事件 event 对象, 计算出 circleRipple 的大小和位置

  3. 如果频繁点击可能出现多个 circleRipple

首先,基本模板 + 数据模型

<template>   <!--最外层用div包裹-->   <div @mousedown="handleMouseDown" @mouseup="end()" @mouseleave="end()" @touchstart="handleTouchStart"  @touchend="end()" @touchcancel="end()">     <!--外层包裹防止波纹溢出-->     <div :style="style" ref="holder">       <!--多个波纹用 v-for 控制-->       <circle-ripple :key="ripple.key" :color="ripple.color" :opacity="ripple.opacity" :merge-style="ripple.style" v-for="ripple in ripples"></circle-ripple>     </div>     <!--利用slot分发实际内容-->     <slot></slot>   </div> </template>  <script> import circleRipple from './circleRipple' export default {   props: {     // 是否从中间扩散,设为false会从点击处扩散     centerRipple: {       type: Boolean,       default: true     },     // 外层包裹的样式     style: {       type: Object,       default () {         return {           height: '100%',           width: '100%',           position: 'absolute',           top: '0',           left: '0',           overflow: 'hidden'         }       }     },     // 波纹颜色     color: {       type: String,       default: ''     },     // 波纹透明度     opacity: {       type: Number     }   },   data () {     return {       nexTKEy: 0, // 记录下一个波纹元素的key值, 相当于uuid,不设置的话会使动画失效       ripples: [] // 波纹元素参数数组     }   },   mounted () {     this.ignoreNextMouseDown = false // 防止既有 touch 又有 mouse点击的情况   },   methods: {     start (event, isRippleTouchGenerated) {       // 开始波纹效果     },     end () {       // 结束波纹效果     },     handleMouseDown (event) {       // 监听 鼠标单击     },     handleTouchStart (event) {       // 监听 touchstart 方法     }   },   components: {     'circle-ripple': circleRipple   } } </script>

开始和结束波纹效果

增加一个波纹元素只需要在 ripple 增加一个 object 即可,不同的是当需要从点击处扩展时,需要计算一下波纹元素的大小和位置。

{   // isRippleTouchGenerated 是否是touch 事件开始的   start (event, isRippleTouchGenerated) {     // 过滤 touchstart 和 mousedown 同时存在的情况     if (this.ignoreNextMouseDown && !isRippleTouchGenerated) {       this.ignoreNextMouseDown = false       return     }          // 添加一个 波纹元素组件     this.ripples.push({       key: this.nextKey++,        color: this.color,       opacity: this.opacity,       style: this.centerRipple ? {} : this.getRippleStyle(event) // 不是从中心扩展的需要计算波纹元素的位置     })     this.ignoreNextMouseDown = isRippleTouchGenerated  },  end () {    if (this.ripples.length === 0) return    this.ripples.splice(0, 1) // 删除一个波纹元素    this.stopListeningForScrollAbort() // 结束 touch 滚动的处理   } }

因为 vue2 基于 Virtual DOM 的, 所以如果没有 key 在增加一个元素又同时删除一个元素的时候,dom  tree并没有发生变化,是不会产生动画效果的。

监听 mousedown 和 touchstart

mousedown 和 touchstart 处理上会有所不同,但都是用来启动波纹效果的, touch涉及到多点点击的问题,我们一般取***个即可。

{     handleMouseDown (event) {       // 只监听鼠标左键的点击       if (event.button === 0) {         this.start(event, false)       }     },     handleTouchStart (event) {       event.stopPropagation() // 防止多个波纹点击组件嵌套       if (event.touches) {         this.startListeningForScrollAbort(event) // 启动 touchmove 触发滚动处理         this.startTime = Date.now()       }       this.start(event.touches[0], true)     } }

touchmove控制

当发生touchMove事件是需要判断是否,移动的距离和时间,然后结束小波纹点击小姑

{   // touchmove 结束波纹控制   stopListeningForScrollAbort () {     if (!this.handleMove) this.handleMove = this.handleTouchMove.bind(this)     document.body.removeEventListener('touchmove', this.handleMove, false)   },   startListeningForScrollAbort (event) {     this.firstTouchY = event.touches[0].clientY     this.firstTouchX = event.touches[0].clientX     document.body.addEventListener('touchmove', this.handleMove, false)   },   handleTouchMove (event) {     const timeSinceStart = Math.abs(Date.now() - this.startTime)     if (timeSinceStart > 300) {       this.stopListeningForScrollAbort()       return     }     const deltaY = Math.abs(event.touches[0].clientY - this.firstTouchY)     const deltaX = Math.abs(event.touches[0].clientX - this.firstTouchX)     // 滑动范围在 > 6px 结束波纹点击效果     if (deltaY > 6 || deltaX > 6) this.end()   } }

计算波纹的位置和大小

需要从点击处扩散的波纹效果,需要计算波纹元素的大小和位置

{   getRippleStyle (event) {     let holder = this.$refs.holder     //  这个方法返回一个矩形对象,包含四个属性:left、top、right和bottom。分别表示元素各边与页面上边和左边的距离。     let rect = holder.getBoundinGClientRect()      // 获取点击点的位置     let x = event.offsetX     let y     if (x !== undefined) {       y = event.offsetY     } else {       x = event.clientX - rect.left       y = event.clientY - rect.top     }     // 获取***边长     let max     if (rect.width === rect.height) {       max = rect.width * 1.412     } else {       max = Math.sqrt(         (rect.width * rect.width) + (rect.height * rect.height)       )     }     const dim = (max * 2) + 'px'     return {       width: dim,       height: dim,       // 通过margin控制波纹中心点和点击点一致       'margin-left': -max + x + 'px',       'margin-top': -max + y + 'px'     }   } }

使用

由于 touchRipple 内部都是 position:absolute 布局,使用时,需要在外部加上 position:relative

// listItem.vue <a :href="href" @mouseenter="hover = true" @mouseleave="hover = false" @touchend="hover = false"     @touchcancel="hover = false" class="mu-item-wrapper" :class="{'hover': hover}">     <touch-ripple class="mu-item" :class="{'mu-item-link': link}" :center-ripple="false">       <div class="mu-item-media">         <slot name="media"></slot>       </div>       <div class="mu-item-content">         // ...       </div>     </touch-ripple> </a> <style>  .mu-item-wrapper {     display: block;     color: inherit;     position: relative; } </style>

到此,相信大家对“怎么使用vue开发波纹点击特效组件”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: 怎么使用vue开发波纹点击特效组件

本文链接: https://lsjlt.com/news/86301.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 怎么使用vue开发波纹点击特效组件
    本篇内容主要讲解“怎么使用vue开发波纹点击特效组件”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么使用vue开发波纹点击特效组件”吧!开发之前的思考常见的波...
    99+
    2024-04-02
  • vue中怎么通过父组件点击触发子组件事件
    这期内容当中小编将会给大家带来有关vue中怎么通过父组件点击触发子组件事件,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。父组件app.vue<template>...
    99+
    2024-04-02
  • vue draggable组件拖拽点击无效问题怎么解决
    今天小编给大家分享一下vue draggable组件拖拽点击无效问题怎么解决的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解...
    99+
    2023-06-30
  • vue自定义组件@click点击失效问题怎么解决
    这篇文章主要讲解了“vue自定义组件@click点击失效问题怎么解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“vue自定义组件@click点击失效问题怎么解决”吧!自定义组件@click...
    99+
    2023-06-30
  • 怎么用vue组件实现弹出框点击显示隐藏效果
    本篇内容介绍了“怎么用vue组件实现弹出框点击显示隐藏效果”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!代码如下1.在当前页面中(主页面)&...
    99+
    2023-07-04
  • vue组件库如何开发使用
    本文小编为大家详细介绍“vue组件库如何开发使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“vue组件库如何开发使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。yarn workspace + lerna:...
    99+
    2023-07-04
  • 使用css3怎么实现一个冲击波效果
    使用css3怎么实现一个冲击波效果?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。实现思路:观察波由小变大,涉及的css3属性变化有width,height,left,top,o...
    99+
    2023-06-08
  • 怎么在vue中实现水波涟漪效果的点击反馈指令
    这篇文章将为大家详细讲解有关怎么在vue中实现水波涟漪效果的点击反馈指令,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。定制一个水波纹默认样式水波纹实际上就是通过用户点击的位置生成一个小圆圈,...
    99+
    2023-06-15
  • vue.js2.0中怎么实现父组件点击触发子组件
    今天就跟大家聊聊有关vue.js2.0中怎么实现父组件点击触发子组件,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。<body> ...
    99+
    2024-04-02
  • vue怎么给自定义的组件绑定点击事件
    这篇文章主要介绍“vue怎么给自定义的组件绑定点击事件”,在日常操作中,相信很多人在vue怎么给自定义的组件绑定点击事件问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”vue怎么给自定义的组件绑定点击事件”的疑...
    99+
    2023-06-30
  • 怎么解决vue点击弹窗自动触发点击事件的问题
    这篇文章给大家分享的是有关怎么解决vue点击弹窗自动触发点击事件的问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。业务场景:使用vue +element ui 的el-dialog,点击弹窗之后,默认加载第一个...
    99+
    2023-06-15
  • vue卡片式点击切换图片组件使用详解
    本文实例为大家分享了vue卡片式点击切换图片组件,供大家参考,具体内容如下 因为公司业务的问题,最近在写vue项目,有了一个卡片图片的点击的需求,自己又不想写动画效果,就偷个懒,采用...
    99+
    2024-04-02
  • Vue中怎么实现组件化开发
    这篇文章给大家介绍Vue中怎么实现组件化开发,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1,分别改写成1级选项和2级选项的2个组件(好像比较low)2,引用4级联动组件,改写成可选1...
    99+
    2024-04-02
  • Vue-router怎么实现组件化开发
    这篇文章主要介绍“Vue-router怎么实现组件化开发”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Vue-router怎么实现组件化开发”文章能帮助大家解决问题。代码如下:#单个组件路由impo...
    99+
    2023-07-04
  • VUE中v-html不能触发点击事件怎么办
    这篇文章主要介绍VUE中v-html不能触发点击事件怎么办,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!背景:后端返前端html格式的数据,前端用v-html解析渲染,如:<a...
    99+
    2024-04-02
  • 怎么使用Flex组件进行开发
    这篇文章主要介绍了怎么使用Flex组件进行开发,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。使用Flex组件开发在Flex应用程序中ActionScript的最主要的用处大概...
    99+
    2023-06-17
  • 怎么用Vue实现点击导航高亮效果
    在前端开发中,导航是一个必不可少的元素,作为网站或应用的主要入口,导航的设计和交互是影响用户体验的重要因素之一。本文将介绍如何使用Vue来实现点击导航高亮的效果,以提升用户的交互体验。一、项目环境准备在开始前,需要先准备一个使用Vue的项目...
    99+
    2023-05-14
  • vue组件库怎么使用
    今天小编给大家分享一下vue组件库怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。完整项目目录结构git clone到...
    99+
    2023-07-04
  • vue怎么自定义和使用开关组件
    这篇“vue怎么自定义和使用开关组件”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“vue怎么自定义和使用开关组件”文章吧。s...
    99+
    2023-06-29
  • Android开发使用RecyclerView添加点击事件实例详解
    目录引言一、RecyclerView基本使用1. 添加适配器Adapter2. 创建列表的每个项的item_layout.xml文件3. 在activity中使用二、Recycler...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作