vue2实现拖拽悬浮按钮

 <div ref="floatDrag" class="float-position" :style="{ left: left + 'px', top: top + 'px', right: right + 'px !important', zIndex: zIndex }" @touchmove.prevent@mousemove.prevent><div class="content">// 可写具体要悬浮的内容</div></div>

js

data(){
return{clientWidth: null,clientHeight: null,left: null,top: null,right: null,timer: null,currentTop: 0,
}
}
props: {distanceRight: {type: Number,default: 36,},distanceBottom: {type: Number,default: 200,},isScrollHidden: {type: Boolean,default: false,},isCanDraggable: {type: Boolean,default: true,},zIndex: {type: Number,default: 50,},value: {type: String,default: '悬浮按钮',},},mounted() {this.isCanDraggable &&this.$nextTick(() => {this.floatDrag = this.$refs.floatDrag;// 获取元素位置属性this.floatDragDom = this.floatDrag.getBoundingClientRect();// 设置初始位置// this.left = this.clientWidth - this.floatDragDom.width - this.distanceRight;this.right = 0;this.top = this.clientHeight - this.floatDragDom.height - this.distanceBottom;this.initDraggable();});// this.isScrollHidden && window.addEventListener('scroll', this.handleScroll);window.addEventListener('resize', this.handleResize);},created(){this.clientWidth = document.documentElement.clientWidth;this.clientHeight = document.documentElement.clientHeight;
}BeforeDestroy() {window.removeEventListener('resize', this.handleResize);},methods:{
/*** 窗口resize监听*/handleResize() {this.checkDraggablePosition();},/*** 初始化draggable*/initDraggable() {this.floatDrag.addEventListener('touchstart', this.toucheStart);this.floatDrag.addEventListener('touchmove', (e) => this.touchMove(e));this.floatDrag.addEventListener('touchend', this.touchEnd);},toucheStart() {this.canClick = false;this.floatDrag.style.transition = 'none';},touchMove(e) {this.canClick = true;if (e.targetTouches.length === 1) {// 单指拖动let touch = event.targetTouches[0];this.left = touch.clientX - this.floatDragDom.width / 2;this.top = touch.clientY - this.floatDragDom.height / 2;}},touchEnd() {if (!this.canClick) return; // 解决点击事件和touch事件冲突的问题this.floatDrag.style.transition = 'all 0.3s';this.checkDraggablePosition();},/*** 判断元素显示位置* 在窗口改变和move end时调用*/checkDraggablePosition() {this.clientWidth = document.documentElement.clientWidth;this.clientHeight = document.documentElement.clientHeight;if (this.left + this.floatDragDom.width / 2 >= this.clientWidth / 2) {// 判断位置是往左往右滑动this.left = this.clientWidth - this.floatDragDom.width;} else {this.left = 0;}if (this.top < 0) {// 判断是否超出屏幕上沿this.top = 0;}if (this.top + this.floatDragDom.height >= this.clientHeight) {// 判断是否超出屏幕下沿this.top = this.clientHeight - this.floatDragDom.height;}},
}

css

.float-position {position: fixed;right: 0;top: 60%;width: 170px;height: 180px;display: flex;align-items: center;justify-content: center;user-select: none;.content {border-radius: 50%;position: relative;padding: 0.8em;display: flex;align-content: center;justify-content: center;}.close {width: 20px;height: 20px;border-radius: 50%;display: flex;align-items: center;justify-content: center;color: #fff;position: absolute;right: 30px;top: -12px;cursor: pointer;}
}.cart {border-radius: 50%;width: 5em;height: 5em;display: flex;align-items: center;justify-content: center;
}.header-notice {display: inline-block;transition: all 0.3s;span {vertical-align: initial;}.notice-badge {color: inherit;.header-notice-icon {font-size: 16px;padding: 4px;}}
}.drag-ball .drag-content {overflow-wrap: break-word;font-size: 14px;color: #fff;letter-spacing: 2px;
}

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

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

相关文章

Golang 并发 Mutex 互斥锁的使用

Golang 并发 Mutex 互斥锁的使用 1. 初始化 func TestMutex(t *testing.T) {mu01 : sync.Mutex{}var mu02 sync.Mutex }两种方式都ok 2. Mutex使用 计数器统计&#xff0c;多个协程同时对同一个变量进行 代码示例 var mu sync.Mutex var counter intfunc TestMutexAdd(t…

判断字符是否唯一——力扣

面试题 01.01. 判定字符是否唯一 已解答 简单 相关标签 相关企业 提示 实现一个算法&#xff0c;确定一个字符串 s 的所有字符是否全都不同。 示例 1&#xff1a; 输入: s "leetcode" 输出: false 示例 2&#xff1a; 输入: s "abc" 输出: true…

在k8s中部署Prometheus并实现对k8s集群的监控

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《Prometheus&#xff1a;监控的神》 &#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、k8s简介 2、 Prometheus概述 二、准备k8s环境 1、…

MySOL变量的声明与应用

ddldml CREATE TABLE student (id int(11) NOT NULL AUTO_INCREMENT COMMENT 学号,createDate datetime DEFAULT NULL,userName varchar(20) DEFAULT NULL,pwd varchar(36) DEFAULT NULL,phone varchar(11) DEFAULT NULL,age tinyint(3) unsigned DEFAULT NULL,sex char(2) DE…

2024年生物医学、医学图像与信号处理国际会议(ICBMISP2024)

2024年生物医学、医学图像与信号处理国际会议(ICBMISP2024) 会议简介 2024年国际生物医学、医学成像和信号处理会议&#xff08;ICBMISP2024&#xff09;很高兴邀请您提交主题为“生物医学、医学图像和信号处理的当前挑战和未来前景”的原稿。通过ICBMISP2024&#xff0c;生物…

Spring WebFlux实现获取验证码请求接口?

如果你想让请求处理器返回验证码信息&#xff0c;你可以在处理器函数中生成验证码&#xff0c;并将其作为响应返回给客户端。以下是一个简单的示例&#xff0c;使用 Spring WebFlux 框架生成一个包含随机生成的验证码的图片&#xff0c;并将其作为响应返回给客户端&#xff0c;…

idea-自我常见配置

1. 主题配置 2. 显示方法分隔符 Editor->General->Appearance 3. 忽略大小写提示 Editor->General->Code Completion 4. 自动导包 Editor->general->Auto Import 5. 取消单行显示Tabs Editor->General->Editor Tabs 效果如下图&#xff1a; 6. 设置…

HarmonyOS NEXT星河版之美团外卖点餐功能实战(下)

文章目录 一、购物车逻辑1.1 购物车及加减菜1.2 菜品的加减---方案一1.3 菜品的加减---方案二1.4 购物车View完善1.5 清空购物车1.5 购物车数量和价格 二、小结 一、购物车逻辑 1.1 购物车及加减菜 在utils目录下新建CartStore.ets文件&#xff0c;如下&#xff1a; import …

Vue3的CRUD模版(附Demo)

目录 前言模版 前言 用惯Vue2之后&#xff0c;在碰Vue3后&#xff0c;整体还是有所区别 此文主要做一个回顾总结 假设界面如下&#xff1a; 可CRUD&#xff0c;对应的新增 添加一些必选项&#xff1a; 其中数据库的设计如下&#xff1a; 模版 对应需要注意参数位置、初始…

(41)5.6-5.8数据结构(栈和队列的应用和数组)

1.栈在括号匹配中的应用 #define _CRT_SECURE_NO_WARNINGS #define MaxSize 10 typedef struct { char data[MaxSize];//静态数组存放栈中元素 int top; //栈顶指针 }SqStack;//初始化栈 void InitStack(SqStack& S);//判断栈是否为空 bool StackEmpty(SqStack S…

Feign 第一次调用为什么会很慢?

feign调用的大致过程&#xff1f; Feign进行远程调用的&#xff0c;这里面包括&#xff0c;注册中心、负载均衡、FeignClient之间的关系&#xff0c;微服务通过不论是eureka、nacos也好注册到服务端&#xff0c;Feign是靠Ribbon做负载的&#xff0c;而Ribbon需要拿到注册中心的…

从零开始构建现代深度学习框架:数据支持、网站链接与代码步骤

文章目录 一、数据支持二、网站链接三、代码步骤1. 导入必要的库和模块2. 加载和预处理数据&#xff08;以MNIST为例&#xff09;3. 定义模型结构4. 编译模型5. 训练模型6. 评估模型 一、数据支持 在构建深度学习框架的过程中&#xff0c;数据是不可或缺的。以下是一些可能用到…

android进阶-Binder

参考&#xff1a;Android——Binder机制-CSDN博客 机制&#xff1a;Binder是一种进程间通信的机制 驱动&#xff1a;Binder是一个虚拟物理设备驱动 应用层&#xff1a;Binder是一个能发起进程间通信的JAVA类 Binder相对于传统的Socket方式&#xff0c;更加高效Binder数据拷贝…

JavaScript的未来发展趋势,探索JavaScript中最新技术(JavaScript可视化编程到服务端渲染)

简介&#xff1a;JavaScript生态系统是一个充满机遇的领域&#xff0c;它从创造性的可视化编程到高效的服务端渲染&#xff0c;它的的技术生态系统正在迅速演变&#xff0c;相关技术一直处于不断发展的前沿。这里将带您深入探索目前 JavaScript 中最近最火的技术趋势&#xff0…

类(Classes)在TypeScript中的使用:面向对象编程的基石

类&#xff08;Classes&#xff09;在TypeScript中的使用&#xff1a;面向对象编程的基石 引言 类&#xff08;Classes&#xff09;是TypeScript中实现面向对象编程&#xff08;OOP&#xff09;的核心概念之一。它们允许你通过封装、继承和多态性来构建复杂的应用。本文将深入…

为什么人力资源(HR)工资低?原因在这

为什么做人力资源的&#xff0c;工资都很低&#xff1f; 对于HR工资低的问题&#xff0c;最需要讨论的部分是——HR 究竟有什么价值&#xff1f; 有很多人没想过但会遇到的困惑&#xff1a; 一、为什么人事工资那么低&#xff1f; 同理&#xff0c;也有很多人不明白自己为什…

MyBatis 一对多查询(联合查询 ResultMap 映射 和 子查询映射)

前言&#xff1a; 在数据库操作中&#xff0c;我们可能习惯了单表、连表操作&#xff0c;突然然你来进行一对多操作&#xff0c;你还会吗&#xff1f; 什么是一对多&#xff1f; 一对多是最基础的表关系&#xff0c;简单来说就是 A 表中的一条数据对应 B 表中的多条数据&…

豆芽机置入语音芯片WTN6040-8S:开启智能生活新篇章,让豆芽制作更便捷有趣

豆芽机的开发背景&#xff1a; 豆芽作为一种营养丰富、味道鲜美的食品&#xff0c;深受广大消费者的喜爱。然而&#xff0c;传统的豆芽生产过程繁琐&#xff0c;需要耗费大量的时间和人力&#xff0c;且存在生产效率低、质量不稳定等问题。随着人们生活节奏的加快和对健康饮食的…

DataLab-数据分析的Ai辅助工具

添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09;DataLab是一个由DataCamp提供的强大在线数据分析平台&#xff0c;它通过AI技术简化了数据处理流程&#xff0c;使得用户无需编程或数据分析的高级技能即可快速获取数据洞察。它支持多种数据源&#xff0c;包…

C++多态实现原理详解

阅读引言&#xff1a; 我想象了一下&#xff0c; 假如人有突然问我什么是多态&#xff0c; 我该如何给别人说清楚呢&#xff1f;所以写下这篇文章&#xff0c; 希望大家看完有所收获。 ①. 开胃小菜 先看这样一个开胃小菜 这里我有点小小的疑惑&#xff0c; 大小为啥是1。 在C…