vue实现移动端悬浮可拖拽按钮

需求:

  1. 按钮在页面侧边悬浮显示;
  2. 点击按钮可展开多个快捷方式按钮,从下向上展开。
  3. 长按按钮,则允许拖拽来改变按钮位置,按钮为非展开状态;
  4. 按钮移动结束,手指松开,计算距离左右两侧距离并自动移动至侧边显示;
  5. 移动至侧边后,根据具体左右两次位置判断改变展开样式;
  6. 处理移动到非可视区域时特殊情况。

效果展示:
在这里插入图片描述

具体实现:

<template><div class="shortcut" @touchstart="touchstart($event)" @touchmove="touchMove($event)" @touchend="touchEnd($event)" v-if="isMobile"><div class="shortcut__container"><transition name="fade"><div class="shadow" v-if="showPopover" @click.stop="showPopover = false"></div></transition><transition name="sub-fade"><div :class="['shortcut__list', `${type}`]" v-if="showPopover"><div class="shortcut__list_item"><div class="icon-box"><img src="@/images/common/ic_question.png" alt=""></div>投资理财</div><div class="shortcut__list_item"><div class="icon-box"><img src="@/images/common/ic_question.png" alt=""></div>我的资产</div><div class="shortcut__list_item"><div class="icon-box"><img src="@/images/common/ic_question.png" alt=""></div>咨询我们</div></div></transition><div class="shortcut__btn" :class="{ anim: showPopover }" @click.stop="handleBtn()">+</div></div></div>
</template><script>
const TIME = 50
export default {data () {return {isMobile: /Mobi|Android|iPhone/i.test(navigator.userAgent),showPopover: false,timeOutEvent: 0,longClick: 0,// 手指原始位置oldMousePos: {},// 元素原始位置oldNodePos: {},type: 'right',}},methods: {touchstart (ev) {// 定时器控制长按时间,超过{TIME}毫秒开始进行拖拽this.timeOutEvent = setTimeout(() => {this.longClick = 1}, TIME)const selectDom = ev.currentTargetconst { pageX, pageY } = ev.touches[0] // 手指位置const { offsetLeft, offsetTop } = selectDom // 元素位置// 手指原始位置this.oldMousePos = {x: pageX,y: pageY,}// 元素原始位置this.oldNodePos = {x: offsetLeft,y: offsetTop,}this.handleMoving()selectDom.style.left = `${offsetLeft}px`selectDom.style.top = `${offsetTop}px`},touchMove (ev) {// 未达到{TIME}毫秒就移动则不触发长按,清空定时器clearTimeout(this.timeOutEvent)if (this.longClick === 1) {this.handleMoving()this.showPopover = falseconst selectDom = ev.currentTarget// x轴偏移量const lefts = this.oldMousePos.x - this.oldNodePos.x// y轴偏移量const tops = this.oldMousePos.y - this.oldNodePos.yconst { pageX, pageY } = ev.touches[0] // 手指位置selectDom.style.left = `${pageX - lefts}px`selectDom.style.top = `${pageY - tops}px`}},touchEnd (ev) {// 清空定时器clearTimeout(this.timeOutEvent)if (this.longClick === 1) {this.longClick = 0const selectDom = ev.currentTargetconst { innerWidth, innerHeight } = windowconst { offsetLeft, offsetTop } = selectDomselectDom.style.left = offsetLeft + 50 > innerWidth / 2 ? 'calc(100% - 55px)' : '15px'if (offsetTop < 150) {selectDom.style.top = '150px'} else if (offsetTop + 150 > innerHeight) {selectDom.style.top = `${innerHeight - 150}px`}this.type = offsetLeft + 50 > innerWidth / 2 ? 'right' : 'left'setTimeout(() => {document.body.style.overflow = 'auto'document.body.style.userSelect = 'auto'}, 1000)}},handleMoving () {// 禁止body滚动document.body.style.overflow = 'hidden'// 禁止body文本选中document.body.style.userSelect = 'none'},handleBtn () {this.showPopover = !this.showPopover}},
}
</script><style scoped lang="less">
.icon-box {background: #fff;width: .8rem;height: .8rem;border-radius: 50%;display: flex;align-items: center;justify-content: center;
}.shortcut {position: fixed;z-index: 9999;left: calc(100% - 55px);top: calc(100% - 150px);user-select: none;&__container {position: relative;}&__list {position: absolute;bottom: .8rem;z-index: 8;&_item {color: #fff;display: flex;flex-direction: row;align-items: center;white-space: nowrap;margin-bottom: .15rem;.icon-box {margin: 0 .1rem 0 0;img {width: 0.36rem;height: 0.36rem;}}}&.left {left: 0;}&.right {right: 0;.shortcut__list_item {flex-direction: row-reverse;.icon-box {margin: 0 0 0 .1rem;}}}}&__btn {background: #fff;width: .8rem;height: .8rem;border-radius: 50%;text-align: center;line-height: .7rem;color: #3356D9;font-size: .5rem;position: relative;z-index: 8;border: 1px solid #3356D9;transition: all .3s linear;&.anim {transform: rotate(135deg);}}
}
.shadow {width: 100%;max-width: 1024px;position: fixed;top: 0;left: 0;right: 0;bottom: 0;background-color: rgba(0, 0, 0, 0.5);z-index: 1;margin: 0 auto;
}
.sub-fade-leave-active,.sub-fade-enter-active {transition: max-height 0.3s linear;
}
.sub-fade-enter,.sub-fade-leave-to {max-height: 0;overflow: hidden;
}
.sub-fade-enter-to,.sub-fade-leave {max-height: 2.56rem;overflow: hidden;
}
</style>

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

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

相关文章

DKD蒸馏复现

知识蒸馏主要分两类&#xff1a; 1&#xff1a;基于logits 2&#xff1a;基于feature logits蒸馏主要是在早期&#xff0c;后期效果逐步被基于feature蒸馏超越。 cvpr2022的DKD基于传统的KD进行改进&#xff0c;重铸logits蒸馏的荣光。目前很多蒸馏都采用DKD方案&#xff0…

云原生Kubernetes:K8S安全机制

目录 一、理论 1.K8S安全机制 2.Authentication认证 3.Authorization授权 4.Admission Control准入控制 5.User访问案例 6.ServiceAccount访问案例 二、实验 1.Admission Control准入控制 2.User访问案例 3.ServiceAccount访问案例 三、问题 1.生成资源报错 2.镜…

CSS之伪类和伪元素 | :before和::before

例子&#xff1a; & 表示嵌套的上一级。如 &:hover 相当于 上一级元素:hover :hover 伪类 :before 伪元素&#xff0c;在元素之前加入某内容&#xff08;一定要写 content &#xff09; display:none&#xff1b; 隐藏对象。display隐藏元素后&#xff0c;不占原先位置…

NSSSCTF做题(2)

1.[BJDCTF 2020]easy_md5 打开页面发现没什么东西&#xff0c;只有一个提交表单&#xff0c;然后url会显示你提交的信息 源代码里也看不到什么 &#xff0c;用dirsearch扫一下&#xff0c;这些是扫出来的数据 抓包看到了提示 hint: select * from admin where passwordmd5($pas…

新手必看:Android studio 侧边栏实现,带源码

文章目录 前言效果图正文toolbar 用于定义应用程序的导航栏app_bardrawer_layout 用于创建侧边栏导航nav_header_draw app:menu"menu/activity_main_drawer" 前言 本篇内容主要是自己实现侧边栏后的一些总结&#xff0c;部分理论来着网络和ai助手&#xff0c;如有错…

一台电脑远程内网的另外一台电脑,禁止远程的电脑连接外网,只允许内网连接

一台电脑远程内网的另外一台电脑&#xff0c;禁止远程的电脑连接外网&#xff0c;只允许内网连接 1.找到右下角网卡图标&#xff0c;右键图标选择“打开网络和共享中心”。 3、点击“更改适配器设置”。 4、右键正在使用的网卡“本地连接”打开属性 5、找到“internet协…

DAZ To UMA⭐三.导入Blender的配置, 及Blender快捷键

文章目录 🟥 Blender快捷键1️⃣ 3D视图快捷键2️⃣ 视角快捷键3️⃣ 编辑快捷键4️⃣ 对物体的操作🟧 Blender导入FBX的配置🟩 设置脸部骨骼大小1️⃣ 切换视角2️⃣ 缩小脸部骨骼3️⃣ 本节效果预览🟦 设置眼角膜透明度🟥 Blender快捷键 1️⃣ 3D视图快捷键 快捷键…

UML基础与应用之面向对象

UML&#xff08;Unified Modeling Language&#xff09;是一种用于软件系统建模的标准化语言&#xff0c;它使用图形符号和文本来描述软件系统的结构、行为和交互。在面向对象编程中&#xff0c;UML被广泛应用于软件系统的设计和分析阶段。本文将总结UML基础与应用之面向对象的…

UG NX二次开发(C#)-计算直线到各个坐标系轴向的投影角度

文章目录 1、前言2、需求分析3、NXOpen方法实现3.1 创建基准坐标系3.2 然后计算直线到基准坐标系的轴向角度3.3 代码调用4、测试效果为:1、前言 最近有个粉丝问我如何计算直线到坐标系各个轴向的角度,这里用UG NX二次开发(C#)实现。当然,这里的内容是经验之谈,如果有更好的…

2、AWT介绍

2、AWT介绍 AWT是Swing的前身&#xff0c;我们使用AWT学习底层的实现而用Swing来画一些界面 2.1 AWT 介绍 AWT&#xff1a;抽象的窗口工具&#xff08;Abstract Windows Tools&#xff09;&#xff0c;包含了很多的类和接口&#xff01;用于GUI编程&#xff0c;GUI&#xff…

秦时明月沧海手游阵容推荐,秦时明月沧海角色强度

秦时明月沧海角色强度如何&#xff1f;在秦时明月沧海手游中&#xff0c;您可以从大量的角色卡牌中选择并发展&#xff0c;为了顺利通过各种副本&#xff0c;玩家们需要精心搭配阵容。那么&#xff0c;具体该如何配置最强的角色呢&#xff1f; 下面&#xff0c;小编将带各位玩家…

GeoServer运行报错503,……Unmapped relationship: 7

Windows11运行GeoServer-2.19.0报错[org.geoserver.system.status.OSHISystemInfoCollector]……Unmapped relationship: 7 问题说明解决方法 问题说明 最近换了新电脑&#xff0c;在电脑上安装了一个geoserver2.19.0版本&#xff0c;但是运行就是报错&#xff0c;虽然最后提示…

SVN_SERVER的搭建

一、目前svnserver仅支持windows下安装&#xff0c;所以前提需要一台windows服务器或者windows主机 1. 下载最新版本的包 当前最新版visualsvn server最新版5.3.0 visualsvn server下载地址Downloads | VisualSVN 当前tortoiseSVn最新版1.14.5 tortoise SVN下载地址 h…

高等数学应试考点速览(下)

函数项级数 【收敛域】上&#xff0c;收敛于&#xff1a;【和函数】&#xff1b; 幂级数&#xff1a;绝对收敛区间 ( − R , R ) (-R,R) (−R,R)&#xff0c;&#xff08;端点是否属于收敛域&#xff0c;需要再探讨&#xff09; R lim ⁡ n → ∞ ∣ a n a n 1 ∣ R\lim_{n…

Spring整合RabbitMQ——消费者

1.配置consumer xml配置文件 2. 实现MessageListener接口 并重写onMessage方法

数组01-二分查找算法

目录 数组如何实现随机访问 两个关键词 数组的特点 根据下标随机访问数组元素 为什么数组要从0开始编号&#xff0c;而不是从1开始 LeetCode之路——704. 二分查找 Code 二分查找算法 数组如何实现随机访问 数组&#xff08;Array&#xff09;是一种线性表数据结构。它…

Docker部署ActiveMQ消息中间件

1、准备工作 docker pull webcenter/activemq:5.14.3 Pwd"/data/software/activemq" mkdir ${Pwd}/data -p2、运行容器 docker run -d --name activemq \-p 61616:61616 \-p 8161:8161 \-v ${Pwd}/data:/opt/activemq/data \-v /etc/localtime:/etc/localtime \--r…

活动预告|蚂蚁集团 2023 KubeCon Shanghai 议题揭秘

9 月 26日-28 日&#xff0c;由 Linux 基金会、CNCF 主办的 KubeCon CloudNativeCon Open Source Summit China 2023 将在上海跨国采购会展中心隆重召开。本次峰会将聚集全球社区&#xff0c;共同探讨云原生和开源领域的前沿洞察、核心技术与最佳实践&#xff0c;会议主题囊括…

深拷贝与浅拷贝

首先深拷贝与浅拷贝 只针对Object 和Array这样的引用数据类型 所以基本数据类型不用考虑了 等号赋值 基本数据类型 对于基本数据类型&#xff0c;就会创建一个新的变量&#xff0c;并将原变量的值复制给新变量。 这是基于变量是存储在栈内存中的特点。简单来说&#xff0c;等…

Linux学习第20天:Linux按键输入驱动开发: 大道至简 量入为出

Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 中国文化博大精深&#xff0c;太极八卦&#xff0c;阴阳交合&#xff0c;变化无穷。在程序的开发中也是这样&#xff0c;数字0和1也是同样的道理。就本节来说&am…