Vue:可拖拽组件

article/2025/5/12 4:39:00

        在实际开发中,很可能会遇到开发可拖拽组件的需求,目的是应对某些弹框组件会遮盖某些重要信息/可操作面板,通过可拖拽的形式可以将上层的弹框组件移动到其他位置,从而不影响整个系统的操作。下面,我们分两步走,开发一个可拖拽的弹框组件,最终效果如下图所示,

 

Step-1:原生JS开发可拖拽弹框

        第一步,基于原生JS开发一个简陋版本的可拖拽弹框,基本效果贴在本部分最后,先看一下完整的示例代码吧,

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>可拖拽弹框</title><style>*,html,body {padding: 0;margin: 0;box-sizing: border-box;}body {background-color: #000;}.box {position: absolute;top: 15px;left: 200px;width: 400px;height: 300px;background-color: rgba(255, 255, 255, 0.3);border: 1px solid #fff;}</style>
</head><body><div class="box" id="box"></div>
</body>
<script>let boxPos = {x: null,y: null}let startPos = {x: null,y: null}let isMove = false;const box = document.getElementById("box");box.addEventListener("mousedown", (e) => {const { clientX, clientY } = e;//获取元素的当前位置boxPos = {x: box.offsetLeft,y: box.offsetTop,};startPos = {x: clientX,y: clientY}isMove = true;document.body.style.cursor = "move";document.addEventListener("mousemove", (e) => {if (!isMove) return;const { clientX, clientY } = e;const [offsetX, offsetY] = [clientX - startPos.x, clientY - startPos.y];box.style.left = `${boxPos.x + offsetX}px`box.style.top = `${boxPos.y + offsetY}px`})document.addEventListener("mouseup", () => {isMove = false;document.body.style.cursor = "default";})})</script></html>

        基本效果如下,PS:直接使用了黑色背景,弹框也没有做美化,因为我们的重点工作在后面的组件式开发。

 

Step-2:Vue可拖拽弹框组件

        完整的示例代码如下,直接引入InfoBox.vue组件即可使用,

<template><div v-if="show" ref="infoBox" class="info-box" :style="styleObject"><div class="nav" @mousedown.stop="mouseDownHandler"><span class="title">{{ title }}</span><span class="iconfont close" @click="show = false">&#xe678;</span></div><div class="body"><slot name="content"></slot></div></div>
</template>
<script>
export default {name: "InfoBox",props: {width: {type: String,required: false,default: "400px",},height: {type: String,required: false,default: "300px",},title: {type: String,required: false,default: '点位详情'}},data() {return {styleObject: {width: "400px",height: "300px"},show: true,isMove:false,}},mounted() {this.styleObject = {height: this.$props.height,width: this.$props.width,}},methods: {mouseDownHandler(e) {const currentPosition = {x:this.$refs.infoBox.offsetLeft,y:this.$refs.infoBox.offsetTop};const startPosition = {x:e.clientX,y:e.clientY};//获取当前点击位置console.log(currentPosition,startPosition);this.isMove = true;//注册鼠标移动事件document.addEventListener("mousemove",(event_move)=>{if(!this.isMove) return;const offsetX = event_move.clientX - startPosition.x,offsetY = event_move.clientY - startPosition.y;console.log(offsetX,offsetY)//修改弹框位置this.$refs.infoBox.style.left = `${currentPosition.x + offsetX}px`;this.$refs.infoBox.style.top = `${currentPosition.y + offsetY}px`;})//注册鼠标抬起事件document.addEventListener("mouseup",()=>{this.isMove = false;})},mousemoveHandler() {},mouseUpHandler() {}}
}
</script>
<style lang="less" scoped>
.info-box {// .box-size(400px,300px);position: absolute;top: 50%;left: 50%;transform: translate(-50%, -50%);background-color: @base-box-bgColor;border: 1px solid #3374ac;z-index: 999999;.nav {padding: 5px 10px;height: 35px;background: @base-bg-color;.flex-layout('row');justify-content: space-between;.title {user-select: none; //禁止选中标题文字padding: 0px 5px;font-family: "AliMaMa";font-style: italic;font-size: 18px;color: #cee9f5;background-image: linear-gradient(to top, #00C6FF, #8AFFD2);/* 线性渐变背景,方向向上 */-webkit-background-clip: text;/* 背景被裁剪成文字的前景色 */-webkit-text-fill-color: transparent;/* 文字填充颜色变透明 */}.close {font-size: 20px;cursor: pointer;&:hover {color: rgb(0, 201, 252);}}}
}
</style>

        使用示例如下,

<!--* @Description: * @Author: Xwd* @Date: 2023-02-15 22:26:06* @LastEditors: Xwd* @LastEditTime: 2023-02-18 21:08:26
-->
<template><div id="app"><InfoBox/><router-view/></div>
</template>
<script>
//导入可拖拽弹框组件
import InfoBox from '@/layout/common/InfoBox.vue'
export default {name:"App",components:{InfoBox}
}
</script>
<style lang="less">
#app {font-family: Avenir, Helvetica, Arial, sans-serif;-webkit-font-smoothing: antialiased;-moz-osx-font-smoothing: grayscale;text-align: center;color: #2c3e50;.box-size(100vw,100vh);
}
</style>


http://chatgpt.dhexx.cn/article/S8tSOmjn.shtml

相关文章

vue+ element 三元运算符设置按钮样式

效果图 代码块 <el-button-group><el-button size"small" click"notSelect()" :class"[status 1?isActive:]" autofocus"true" v-focus plain>待选</el-button><el-button size"small" click"…

vue三目运算符可以写html代码么,Vue-js之文本渲染、属性(样式)绑定、三元运算符、事件处理...

文本渲染之3种方式 1.{{}}&#xff1a;插值表达式 弊端&#xff1a;会出现页面闪烁问题 v-text&#xff1a;把vue实例中的内容当作纯文本&#xff0c;显示在浏览器 v-html&#xff1a;把vue实例中的内容进行渲染后&#xff0c;浏览器会再次执行文本渲染 {{msg}} let vm new Vu…

vue中的三元运算符

我们要做的效果如下&#xff1a; 如上图的全部分类效果&#xff0c;符号、的样式具体写法如下图&#xff1a;数据如下&#xff1a; 补充&#xff1a;我们一开始想的可能是在数据中直接加符号、&#xff0c;但是脑子想让我换个想法&#xff0c;所以想先控制显示&#xff0c;第一…

vue 在 html标签上 做三元运算

众所周知&#xff0c;在js 中 a<b?‘方法一’:‘方法二’ 这种 三元运算 是比较方便快捷&#xff0c;那么如何在html标签上直接使用呢&#xff1f; 在 标签包裹中&#xff0c;一半为内容&#xff0c;可以直接使用 例如&#xff1a; <p class"price">{{p…

抖音快手短视频去水印API,接口开发文档

开发者官网&#xff1a;http://api.lingquan166.com/ 简介&#xff1a;根据抖音、微视、小红书、皮皮搞笑等APP中复制出来的链接&#xff0c;解析获取短视频的标题、封面、无水印短视频地址等信息。 接口地址&#xff1a; https://api.lingquan166.com/dsp?token122917VU601…

【嵌入式开发】ARM 关闭中断 ( CPRS 中断控制位 | 中断使能寄存器 | 中断屏蔽寄存器 | 关闭中断 | 汇编代码编写 )

一. 中断控制 ( 基于 S3C6410 开发板 ) 1. 关闭中断的两个步骤 (1) 关闭中断步骤 2. CPRS 寄存器中的中断控制位 (1) CPRS 寄存器简介(2) CPRS 寄存器 中断控制 相关 位 3. 中断使能寄存器 (1) 中断使能寄存器简介(2) 中断屏蔽寄存器简介 二. 关闭中断 代码示例 1. 汇编代码编…

图像哈希算法

最近在回顾一些经典的图像哈希算法&#xff0c;本文大致介绍了一些常用的图像哈希算法&#xff0c;暂时先列一个框架&#xff0c;待日后补充。 参考链接&#xff1a; 【1】基于内容的图像哈希算法研究 【2】图像聚类-谱聚类 【3】球哈希Spherical Hashing 部分哈希源码及大牛…

消息机制(Handle机制)

消息机制简介- Handler是Android消息机制的上层接口。Handle的使用过程简单&#xff0c;通过它可以轻松将一个任务切换到Handle所在的线程中去执行。通常情况下&#xff0c;Handle的使用场景是更新UI。 在子线程中进行耗时操作&#xff0c;执行完操作后&#xff0c;发送消息&…

魔百盒九联UNT402A_S905L3_线刷固件包_语音蓝牙正常

魔百盒九联UNT402A_S905L3_线刷固件包_语音蓝牙正常 固件特点&#xff1a; 1、适用于九联UNT402A&#xff1b; 2、开放原厂固件屏蔽的市场安装和u盘安装apk&#xff1b; 3、修改dns&#xff0c;三网通用&#xff1b; 4、大量精简内置的没用的软件&#xff0c;运行速度提升…

大规模特征向量检索算法总结 (LSH PQ HNSW)

大规模特征向量检索算法总结 (LSH PQ HNSW) 转自&#xff1a;https://www.6aiq.com/article/1587522027341 向量检索基本概念 向量从表现形式上就是一个一维数组。我们需要解决的问题是使用下面的公式度量距离寻找最相似的 K 个向量。 欧式距离&#xff1a; 两点间的真实距…

面向高光谱图像的多特征融合哈希

原文&#xff1a;Efficient Multiple Feature Fusion With Hashing for Hyperspectral Imagery Classification: A Comparative Study 面向高光谱图像的多特征融合哈希 I. IntroductionII. MFH FrameworkIII. Feature HashingIV. Experiment SettingA. Data SetsB. Multiple Fe…

论文笔记-迭代量化哈希ITQ

推荐一个大牛的博客&#xff1a;http://yongyuan.name/【这篇博文也借鉴了他的博客&#xff0c;建议直接看他的博文加上论文】 自己的这个就是一个论文笔记&#xff0c;为了自己日后复习&#xff1b; 【待补充...因为笔记太乱了 懒得整理 】

ITQ(Iterative Quantization)迭代量化方法详解 hash 哈希算法

看过的文章&#xff0c;不做记录&#xff0c;即便当时理解透了&#xff0c;过一段时间后&#xff0c;知识总会模糊不清。所以从现在开始&#xff0c;对一些自己阅读过的一些精彩的文章&#xff0c;悉心记录&#xff0c;方便自己查阅温故&#xff0c;当然如果对同行有所裨益的话…

time svd java代码_ITQ算法理解 - 漫长当下TIME的个人空间 - OSCHINA - 中文开源技术交流社区...

IterativeQuantization: A Procrustean Approach to Learning Binary Codes 论文理解及代码讲解 这篇文章发表在2011年CVRP上&#xff0c;一作是Yunchao Gong&#xff0c;师从Sanjiv Kumar&#xff0c;关于Sanjiv Kumar可以到她的HomePage上了解。 文章目的&#xff1a;学习保留…

Iterative Quantization,ITQ

Abstract 针对大规模的图像检索问题&#xff0c;论文提出了一个高效的ITQ算法。该算法先将中心化后的数据映射到超立方体的顶点上&#xff0c;再通过优化过程寻找一个旋转矩阵&#xff0c;使得数据点经过旋转后&#xff0c;与超立方体的顶点数据具有最小的量化误差。ITQ算法涉及…

ITQ算法理解

开发十年&#xff0c;就只剩下这套Java开发体系了 >>> IterativeQuantization: A Procrustean Approach to Learning Binary Codes 论文理解及代码讲解 这篇文章发表在2011年CVRP上&#xff0c;一作是Yunchao Gong&#xff0c;师从Sanjiv Kumar&#xff0c;关于San…

ITQ(Iterative Quantization)图像检索算法

开发十年&#xff0c;就只剩下这套Java开发体系了 >>> 1、文章简介 名称&#xff1a;Iterative Quantization:A Procrustean Approach to Learning Binary Codes 这篇文章发表与2011年CVRP(Computer Vision & Pattern Recognition)&#xff0c;作者:Yunchao Go…

ITQ(Iterative Quantization)迭代量化方法详解

转载&#xff1a;http://www.yuanyong.org/cv/itq-hashing.html CVPR 2011《Iterative Quantization: A Procrustean Approach to Learning Binary Codes》论文阅读笔记。 看过的文章&#xff0c;不做记录&#xff0c;即便当时理解透了&#xff0c;过一段时间后&#xff0c;知识…

怎么查看mysql是否锁表_MySQL查看是否锁表

MySQL查看是否锁表的方法:首先进入命令窗口;然后通过执行命令“show engine innodb status\G;”查看造成死锁的sql语句,并分析索引情况即可。 可直接在mysql命令行执行:show engine innodb status\G; 查看造成死锁的sql语句,分析索引情况,然后优化sql然后show processlis…

mysql 查询 锁表_怎么查找mysql中的锁表语句?

查看sql server数据库被锁表可以用用如下语句&#xff1a; 也可以用如下语句: 拓展资料: 锁定数据库的一个表的区别SELECT * FROM table WITH (HOLDLOCK) 其他事务可以读取表&#xff0c;但不能更新删除SELECT * FROM table WITH (TABLOCKX) 其他事务不能读取表,更新和删除 SEL…