iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >vue实现水波涟漪效果的点击反馈指令
  • 521
分享到

vue实现水波涟漪效果的点击反馈指令

2024-04-02 19:04:59 521人浏览 八月长安
摘要

目录水波效果来看实现 定制一个水波纹默认样式 计算水波纹的位置和直径 鼠标按下时创建水波 鼠标抬起时销毁水波 通过指令binding去扩展你的水波选项 写在最后 水波效果 当用户点击

水波效果

当用户点击时,会以点击中心为圆心产生一个水波扩散的涟漪效果,适用各个场景,美观又不浮夸,关键是可以给用户带来很直观的反馈。

来看实现

首先这里基于vue3自定义指令进行封装,Vue3的自定义指令跟Vue2相比变动不是很大,。我们的目标是完成一个水波指令的基本原型,这里循序渐进展开。

定制一个水波纹默认样式

水波纹实际上就是通过用户点击的位置生成一个小圆圈,并且尺寸逐渐扩大到整个被点击元素的一个过程,所以这里先制定一个水波基本的样式,并设置好过度动画,过度动画应该是一个先慢后快的一个过程,这里使用贝塞尔曲线定制


.my-ripple {
  position: absolute;
  top: 0;
  left: 0;
  z-index: 100;
  border-radius: 50%;
  background-color: currentColor;
  opacity: 0;
  transition: transfORM 0.2s cubic-bezier(0.68, 0.01, 0.62, 0.6), opacity 0.08s linear;
  will-change: transform, opacity;
  pointer-events: none;
}

计算水波纹的位置和直径

如果确定了水波的直径、创建时的(x,y)、过度动画结束时的(x,y),我们就可以通过transition去渲染水波动画了,创建时的(x,y)就是用户点击的位置,但是水波的直径和过度动画结束时的(x,y)怎么计算呢?我们的元素都是矩形,不论用户从元素的任意坐标进行点击,以矩形斜边作为直径的圆都可以完美的覆盖整个元素,斜边的计算我们利用小学数学知识求两边平方和进行开方得到,下面是过度动画结束时的水波推演图。

第一个箭头: 期望得到的水波
第二个箭头: 元素(0,0)点创建的水波
第三个箭头: 元素(0,0)点创建的水波, 不带圆角效果

我们可以发现通过元素(0,0)点创建的水波进行一定偏移就可以得到我们想要的水波,由此我们可以推断出

动画结束时的水波的尺寸 = 圆的斜边
创建时的(x,y) = 用户点击的位置
过度动画结束时的(x,y) = 元素(0,0)点创建的水波进行x和y的偏移得到


function computeRippleStyles(element, event) {
  const { top, left } = element.getBoundinGClientRect()
  const { clientWidth, clientHeight } = element
  
  const radius = Math.sqrt(clientWidth ** 2 + clientHeight ** 2) / 2
  const size = radius * 2
  
  const localX = event.clientX - left
  const localY = event.clientY - top

  const centerX = (clientWidth - radius * 2) / 2
  const centerY = (clientHeight - radius * 2) / 2

  const x = localX - radius
  const y = localY - radius

  return { x, y, centerX, centerY, size }
}

鼠标按下时创建水波

然后我们需要在鼠标按下时创建水波,监听鼠标按下的事件,这里以pc端为例子,刚创建水波时使用transform缩小到0.3,这是作者尝试过相对合适的创建大小, 然后修改transform触发过度水波扩散动画,这里还加入了透明度的过度,可以使水波涟漪更有质感。


function createRipple(event) {
  const container = this
  const { x, y, centerX, centerY, size } = computeRippleStyles(container, event)
  const ripple = document.createElement('div')
  ripple.classList.add('my-ripple')
  ripple.style.opacity = `0`
  ripple.style.transform = `translate(${x}px, ${y}px) scale3D(.3, .3, .3)`
  ripple.style.width = `${size}px`
  ripple.style.height = `${size}px`
  // 记录水波的创建时间
  ripple.dataset.createdAt = String(performance.now())

  const { position } = window.getComputedStyle(container)
  container.style.overflow = 'hidden'
  position === 'static' && (this.style.position = 'relative')

  container.appendChild(ripple)

  window.setTimeout(() => {
    ripple.style.transform = `translate(${centerX}px, ${centerY}px) scale3d(1, 1, 1)`
    ripple.style.opacity = `.25`
  })
}

const VRipple = {
  mounted(el) {
    el.addEventListener('mousedown', createRipple)
  }
}

鼠标抬起时销毁水波

当鼠标抬起时,只需要找到这个生成的水波节点修改透明度,再等到透明度修改动画结束之后将水波纹节点移除即可


function removeRipple() {
  const container = this
  const ripples = container.querySelectorAll('.my-ripple')
  if (!ripples.length) {
    return
  }

  const lastRipple = ripples[ripples.length - 1]
  // 通过水波的创建时间计算出扩散动画还需要执行多久,确保每一个水波都完整的执行了扩散动画
  const delay = 300 - performance.now() + Number(lastRipple.dataset.createdAt)

  setTimeout(() => {
    lastRipple.style.opacity = `0`
    
    setTimeout(() => lastRipple.parentnode?.removeChild(lastRipple), 300)
  }, delay)
}

const VRipple = {
  mounted(el) {
    el.addEventListener('mousedown', createRipple)
    document.addEventListener('mouseup', removeRipple)
  },
  unmounted(el) {
    el.removeEventListener('mousedown', createRipple)
    document.removeEventListener('mouseup', removeRipple)
  }
}

通过指令binding去扩展你的水波选项

你还可以通过binding去扩展你的指令,比如可以提供修改颜色,禁用状态等等选项,这里就不详细展开了。我们来看一下成果。

写在最后

到此为止我们就实现了一个简单的ripple指令,在我们的组件库中也有这样的指令,所以更完善的版本可以去看我们的源码。 先要感谢一下掘金社区,已经有一部分小伙伴开始pr一些代码到我们的仓库中来,我们也很高兴能和社区的小伙伴们去一起做这样一件事情,另外我们的组件库团队一直在募集爱好者来参与贡献,有兴趣的小伙伴欢迎加入讨论,加入方式就是直接去仓库提issue留邮箱,我们会第一时间处理,有没有兴趣都希望为我们点点star,关注一下我们,社区小伙伴的支持和兴趣是我们最大的动力。

仓库地址
文档地址

以上就是vue实现水波涟漪效果的点击反馈指令的详细内容,更多关于vue 点击反馈指令的资料请关注编程网其它相关文章!

--结束END--

本文标题: vue实现水波涟漪效果的点击反馈指令

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

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

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • vue实现水波涟漪效果的点击反馈指令
    目录水波效果来看实现 定制一个水波纹默认样式 计算水波纹的位置和直径 鼠标按下时创建水波 鼠标抬起时销毁水波 通过指令binding去扩展你的水波选项 写在最后 水波效果 当用户点击...
    99+
    2024-04-02
  • 怎么在vue中实现水波涟漪效果的点击反馈指令
    这篇文章将为大家详细讲解有关怎么在vue中实现水波涟漪效果的点击反馈指令,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。定制一个水波纹默认样式水波纹实际上就是通过用户点击的位置生成一个小圆圈,...
    99+
    2023-06-15
  • js实现MaterialUI点击涟漪效果示例
    目录正文HTMLCSSJS实现效果 正文 我个人而言还是挺喜欢Material UI这套设计风格的。一些细节方面做的还不错。就比如今天要给大家分享的点击涟漪效果。Mater...
    99+
    2024-04-02
  • 纯CSS实现鼠标点击水波纹效果的实现步骤
    鼠标点击水波纹效果是Web开发中常见的交互效果之一,它能够为用户带来更加生动的体验。在本文中,我们将分享如何使用纯CSS来实现这一效果,并提供具体的代码示例。实现步骤如下:步骤1:HTML结构首先,在HTML文件中创建一个具有鼠标点击效果的...
    99+
    2023-10-21
    CSS 鼠标点击 水波纹效果
  • Vue自定义加水波纹效果指令实例代码
    目录前言自定义指令指令的作用水波纹水波纹效果实现原理核心代码实现总结前言 大家好,我是不吃鱼d猫,过年以来。断更许久,又回来了,学无止境,作为程序员知识是要不断更新迭代的。在此期间,...
    99+
    2024-04-02
  • Varlet组件实现一个丝滑的点击水波效果详解
    目录正文touchstart 事件处理createRipple 方法forbidRippleTask 方法调用computeRippleStyles方法计算调用setSty...
    99+
    2022-11-13
    Varlet组件点击水波 Varlet 点击水波
  • Android 设置主题实现点击波纹效果的示例
    开头先说说大家都知道的Material Design。Material Design:Material Design是Google推出的一个全新的设计语言,它的特点就是拟物扁平化。Material Design包含了很多内容,我大致把它分为...
    99+
    2023-05-30
    android 水波纹 点击
  • vue如何实现点击按钮切换背景颜色的效果
    不懂vue如何实现点击按钮切换背景颜色的效果?其实想解决这个问题也不难,下面让小编带着大家一起学习怎么去解决,希望大家阅读完这篇文章后大所收获。用vue简单的实现点击按钮切换背景颜色,具体代码如下所示:<div class="...
    99+
    2023-05-30
  • 怎么使用vue实现简单的点击显示与隐藏效果
    本文小编为大家详细介绍“怎么使用vue实现简单的点击显示与隐藏效果”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么使用vue实现简单的点击显示与隐藏效果”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。目前前端框...
    99+
    2023-07-04
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作