js 实现点击按钮小球加入购物车动画

本文旨在实现类似点击按钮实现小球加入购物车效果。

使用技术:

  • Vue2
  • 使用 Pubsub 监听按钮点击事件(如果不想用也可以自己改造下)
  • 监听 onmousemove 来获取按钮点击时的鼠标位置

在这里插入图片描述

小球组件:

html + css:

小球父元素:定义了一些基本样式。采用 fixed 布局,让小球相对浏览器窗口进行定位;通过 opacity 控制显隐。

小球:采用任意图片。

<template><div class="ball-wrap"ref="ball":style="{opacity: ball.show,width: size + 'px',height: size + 'px',}"><i class="el-icon-document" ></i></div>
</template><style scoped>
.ball-wrap {border-radius: 50%;z-index: 9999;position: fixed;top: 0;left: 0;display: flex;align-items: center;justify-content: center;background-color: #165BD3;
}
.el-icon-document {color: #fff !important;margin: 0 !important;
}
</style>

js:

props:控制小球大小、动画持续时间(不传也有默认值)

data:通过 ball.show 来控制小球的 opacity

mounted:

小球当前位置通过变量 currentMousePos 来记录,通过使用监听函数 onmousemove 修改当前鼠标位置。

小球挂载时增加监听 onmousemove,使用 debounce 防抖函数,保证 50ms 内只更新一次鼠标位置

核心方法 drop:开启小球动画

exportRecordsListNav:小球结束处的 dom 元素,直接通过 id 获取了,用 ref 还需要跨组件获取,觉得有些麻烦

主要流程:获取结束元素的位置 -> 设置小球到初始位置 -> 设置结束位置 -> 动画结束后小球隐藏、清除 transition 属性

<script>import debounce from 'lodash/debounce'// 记录小球当前位置、通过监听 onmousemove 来更新小球位置const currentMousePos = {x: 0,y: 0}export default {props: {// 球的大小size: {type: Number,default: 30},//持续时间duration: {type: Number,default: 1000},},data() {return {ball: {show: 0,},};},mounted() {// 初始化小球,控制小球显隐this.initBall()// 小球挂载时监听 onmousemove,使用 debounce 保证 50ms 内只更新一次小球位置window.addEventListener('mousemove', debounce((e) => {currentMousePos.x = e.clientXcurrentMousePos.y = e.clientY}, 50))},methods: {initBall(){this.ball.show = 0},// 外部调用方法,开始执行动画drop(){// 获取结束位置的元素及坐标const exportRecordsListNav = document.getElementById('export-records-list')const endPos = {}endPos.x = exportRecordsListNav.getBoundingClientRect().leftendPos.y = exportRecordsListNav.getBoundingClientRect().top// 小球显示this.ball.show = 1// 设置小球初始位置this.$refs.ball.style.transform = `translate(${currentMousePos.x}px, ${currentMousePos.y}px)`// 延时是为了防止合并移动setTimeout(() => {// 增加动画效果this.$refs.ball.style.transition = `transform ${this.duration}ms ease-in-out`// 设置小球结束位置this.$refs.ball.style.transform = `translate(${endPos.x}px, ${endPos.y}px)`// 动画结束后,小球隐藏,清除动画效果// 清除动画效果是为了下次小球从 (0,0) 移动到初始位置时不需要有动画setTimeout(()=>{this.ball.show = 0this.$refs.ball.style.transition = 'unset'}, this.duration)}, 100)},}}</script>

使用方式:

我将结束元素和小球封装成了一个组件,原因是认为工作项目中小球动画只和该导航栏相关。

由于加入购物车的按钮会在很多不同的单页面 page 里,因此使用 Pubsub 技术告诉结束元素此刻点击了按钮,再由结束元素组件调用 drop 方法,这样在其他页面只需进行发布订阅,不需要关注其他操作。

结束元素组件:
<template><div><span id="export-records-list">购物车</span><MovableBall ref="movableBallRef"/></div>
</template><script>
import MovableBall from '@/components/movable-ball/index.vue' 
import Pubsub from 'pubsub-js'
export default {data () {},components: {MovableBall,},mounted () {// 订阅消息、接受到消息后执行 moveBall 方法Pubsub.subscribe('add-to-card', this.moveBall)},methods: {moveBall() {if(this.$refs.movableBallRef) {// 开启小球动画this.$refs.movableBallRef.drop()}},},
}
</script>
点击「加入购物车按钮」的单页面:
<script>
import Pubsub from 'pubsub-js'
export default {methods: {// 点击按钮加入购物车addToCard() {// 发布消息Pubsub.publish('add-to-card')                        }}
}
</script>

参考文档:
仿加入购物车飞入动画效果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/522882.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

品牌如何玩转饥饿营销?媒介盒子分享

饥饿营销是许多品牌都会用的策略&#xff0c;从“限定发售”、“先到先得”、“季节限定”、“专属VIP”等都属于饥饿营销的范畴&#xff0c;为什么饥饿营销屡试不爽&#xff0c;原因就在于人们面对同等的收益和损失时&#xff0c;损失会令他们更加难以接受。今天媒介盒子就来和…

奖励建模(Reward Modeling)实现人类对智能体的反馈

奖励建模&#xff08;Reward Modeling&#xff09;是强化学习中的一个重要概念和技术&#xff0c;它主要用于训练智能体&#xff08;如AI机器人或大型语言模型&#xff09;如何更有效地学习和遵循人类期望的行为。在强化学习环境中&#xff0c;智能体通过尝试不同的行为获得环境…

电机控制系列模块解析(第八篇)—— 高频注入法

一、基本原理 在电机控制领域&#xff0c;高频方波注入法常用于估计转子的位置和转速。其工作原理是每隔一定的时间间隔在电机输出电压上叠加一个电压脉冲。然后&#xff0c;在两相静止坐标系下或者同步旋转坐标系下对采样时刻的电压和电流进行相应的计算&#xff0c;以实现对…

深入理解并发编程:解锁现代软件性能的关键

在当今快速发展的软件开发世界中&#xff0c;并发编程已经成为一种无法回避的重要议题。它涉及到如何在同一时间内处理多个任务&#xff0c;以此来提升应用程序的性能和响应速度。互联网服务的高并发需求以及多核处理器的普及使得并发编程成为了现代软件工程的一个核心组成部分…

如何使用python处理高光谱数据004-卷积神经网络

多光谱数据是指从不同波段的传感器中收集的数据。卷积神经网络(Convolutional Neural Network,CNN)是一种深度学习模型,适用于处理图像和空间数据。 在多光谱数据中,每个波段代表了一种特定的光谱信息。卷积神经网络可以通过学习特征映射来识别不同波段之间的关系,并从中…

王道机试C++第 4 章 字符串:字符串内容详解及三个小程序 Day29

第 4 章 字符串 本章介绍一种基础数据类型——字符串&#xff0c;并且介绍一些字符串处理的方法及字符串匹配的方法。虽然字符串的内容非常基础&#xff0c;但是十分重要。希望读者能够好好学习本章的内容&#xff0c;为此后的学习打下良好的基础。 4.1 字符串内容详解 由于 …

Java的 Map以及实现一个简单的红黑树

Map是Java中的一种键值对&#xff08;Key-Value&#xff09;数据结构&#xff0c;它提供了高效的键值对的存储和访问。在Java中&#xff0c;常见的Map实现类有HashMap、LinkedHashMap和TreeMap等。这些实现类在底层使用不同的数据结构来存储键值对&#xff0c;以提供不同的性能…

STM32CubeIDE基础学习-相关工程文件介绍

STM32CubeIDE基础学习-相关工程文件介绍 前言 保存的工程要大致了解熟悉里面的文件代表的是什么意思、干什么用的&#xff0c;这样才方便后面使用或移植代码等。 当成功创建工程后&#xff0c;打开基础工程保存路径后可以看到所有文件如下图所示&#xff1a; 如果工程越复杂&a…

15. C++泛型与符号重载

【泛型编程】 若多组类型不同的数据需要使用相同的代码处理&#xff0c;在C语言中需要编写多组代码分别处理&#xff0c;这样做显然太过繁琐&#xff0c;C增加了虚拟类型&#xff0c;使用虚拟类型可以实现一组代码处理多种类型的数据。 虚拟类型是暂时不确定的数据类型&#…

CN错题1

千兆以太网的MAC子层仍然使用 CSMA/CD , 支持半双工 和 全双工通信 。 与INTERNET 连接有 局域网 和 拨号上网 两种方式。 在计算机网络中&#xff0c;服务器提供的共享资源主要是指 硬件 、软件 和 数据库 资源。 在局域网中&#xff0c;硬件地址又称为 MAC地址 或 物理地址 报…

Vue事件处理:.passive修饰符与应用场景

.passive修饰符 passive这个修饰符会执行默认方法。你们可能会问&#xff0c;明明默认执行为什么会设置这样一个修饰符。这就要说一下这个修饰符的本意了。 浏览器只有等内核线程执行到事件监听器对应的JavaScript代码时&#xff0c;才能知道内部是否会调用preventDefa…

用WSGI发布flask到centos7.9

起因 想把自己的Flask或者Django网站&#xff0c;发布到服务器上&#xff0c;让大家都可以访问。网上搜的结果&#xff0c;要么是用NginxuWSGI&#xff0c;要么是用NginxGunicorn。大名鼎鼎的Nginx我早有耳闻&#xff0c;那么两位俩玩意是啥呢。 WSGI是什么 uwsgi是Nginx和w…