鼠标拖拽盒子移动

目录

  • 需求
  • 思路
  • 代码
  • 页面展示
  • 【补充】纯js实现

需求

浮动的盒子添加鼠标拖拽功能

思路

  1. 给需要拖动的盒子添加鼠标按下事件
  2. 鼠标按下后获取鼠标点击位置与盒子边缘的距离
  3. 给 document 添加鼠标移动事件
  4. 鼠标移动过程中,将盒子的位置进行重新定位
  5. 侦听 document 鼠标弹起,移除鼠标移动事件

代码

<!-- 鼠标拖拽盒子 -->
<template>
  <div>
    <!-- 【1】给需要拖动的盒子添加鼠标按下事件 -->
    <div ref="btns" class="btns" @mousedown="mousedownHandler">试试拖动我</div>
  </div>
</template>

<script>
export default {
  name: 'Drag',
  components: {},

  data() {
    return {
      mouseToBoxRangeX: 0, // 鼠标点击位置与盒子边缘的距离
      mouseToBoxRangeY: 0 // 鼠标点击位置与盒子边缘的距离
    }
  },

  computed: {},

  watch: {},

  mounted() {
    // 【5】侦听 document 鼠标弹起,移除鼠标移动事件
    document.addEventListener('mouseup', () => {
      document.removeEventListener('mousemove', this.mousemoveHandler)
    })
  },

  methods: {
    mousedownHandler($event) {
      // 【2】鼠标按下后获取鼠标点击位置与盒子边缘的距离
      //  鼠标点击位置与盒子边缘的距离 = 鼠标点击位置 - 盒子当前位置
      this.mouseToBoxRangeX = $event.pageX - this.$refs.btns.offsetLeft
      this.mouseToBoxRangeY = $event.pageY - this.$refs.btns.offsetTop
      // 【3】给 document 添加鼠标移动事件
      document.addEventListener('mousemove', this.mousemoveHandler)
    },
    mousemoveHandler($event) {
      // 【4】鼠标移动过程中,将盒子的位置进行重新定位
      // 盒子当前位置 = 鼠标点击位置 - 鼠标点击位置与盒子边缘的距离 - 盒子自身设定的边距(此处没有)
      // 【注意】设置盒子最新位置时需加上单位 'px'
      this.$refs.btns.style.left = $event.pageX - this.mouseToBoxRangeX + 'px'
      this.$refs.btns.style.top = $event.pageY - this.mouseToBoxRangeY + 'px'
    }
  }
}
</script>

<style lang='scss' scoped>
.btns {
  width: 70px;
  height: 147px;
  position: absolute;
  bottom: 10px;
  right: 10px;
  z-index: 2000;
  cursor: move;
  background-color: red;
}
</style>

页面展示

在这里插入图片描述

【补充】纯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>Document</title>
		<style>
			* {
				margin: 0;
				padding: 0;
			}

			.box {
				position: relative;
				width: 100px;
				height: 100px;
				background-color: tomato;
				margin: 100px;
			}
		</style>
	</head>

	<body>
		<div class="box"></div>
		<script>
			/* 
		        效果:鼠标拖着盒子移动
		        拖着:
		            鼠标左键按着不松手(mousedown),然后鼠标移动(mousemove)
		        注意:鼠标左键按下,才注册上了鼠标移动事件
	        */
			var box = document.querySelector('.box')

			// 添加鼠标点击事件
			box.addEventListener('mousedown', function (e) {
				console.log('this----', this)
				console.log('this.offsetLeft----', this.offsetLeft)
				console.log('this.offsetTop----', this.offsetTop)
				// 【1】获取鼠标在盒子里的位置
				// 鼠标的坐标 - 盒子的坐标
				var x = e.pageX - this.offsetLeft
				var y = e.pageY - this.offsetTop
				console.log(x, y)

				// 注册鼠标移动事件(给整个document添加 事件)
				document.addEventListener('mousemove', move)

				function move(e) {
					// 【2】设置盒子的位置(注意 给盒子添加定位)
					// 鼠标的坐标 - 鼠标在盒子里的坐标
					// 【2.1】盒子没有外边距
					// box.style.left = (e.pageX - x) + 'px';
					// box.style.top = (e.pageY - y) + 'px';

					// 【2.2】盒子有外边距
					box.style.left = e.pageX - x - 100 + 'px'
					box.style.top = e.pageY - y - 100 + 'px'
				}
				// 【3】鼠标弹起,删除移动事件
				document.addEventListener('mouseup', function () {
					// 删除鼠标移动事件
					document.removeEventListener('mousemove', move)
				})
			})
		</script>
	</body>
</html>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

c#设计模式-创建型模式 之 原型模式

概述 原型模式是一种创建型设计模式&#xff0c;它允许你复制已有对象&#xff0c;而无需使代码依赖它们所属的类。新的对象可以通过原型模式对已有对象进行复制来获得&#xff0c;而不是每次都重新创建。 原型模式包含如下角色&#xff1a; 抽象原型类&#xff1a;规定了具…

Flink流批一体计算(16):PyFlink DataStream API

目录 概述 Pipeline Dataflow 代码示例WorldCount.py 执行脚本WorldCount.py 概述 Apache Flink 提供了 DataStream API&#xff0c;用于构建健壮的、有状态的流式应用程序。它提供了对状态和时间细粒度控制&#xff0c;从而允许实现高级事件驱动系统。 用户实现的Flink程…

Docker微服务实战

文章目录 业务需求IDEA编写代码编写Dockerfile构建镜像运行容器网页端访问测试 业务需求 利用Docker部署应用服务&#xff0c;实现在网页端通过输入地址 ip:端口/hello/docker&#xff0c;页面显示hello docker ! IDEA编写代码 创建springboot项目 网上很多教程,此步骤省略……

校园跑腿小程序开发方案详解

校园跑腿小程序App的功能有哪些&#xff1f; 1、用户注册与登录 用户可以通过手机号、社交账号等方式进行注册和登录&#xff0c;以便使用跑腿服务。 2、下单与发布任务 用户可以发布各类跑腿任务&#xff0c;包括食品外卖、快递代收、文件送达、帮我买、帮我取、帮我送等等…

运放的分类、运放的参数

一、运放的分类 运放按功能分为通用运放与专用运放&#xff08;高速运放、精密运放、低IB运放等&#xff09;。 1.1通用运放 除廉价外&#xff0c;没有任何最优指标的运放。 例&#xff1a;uA741&#xff0c;LM324&#xff0c;TL06X&#xff0c;TL07X、TL08X等 国外知名运放…

Docker搭建elasticsearch+kibana测试

最近需要做大数据画像&#xff0c;所以先简单搭建一个eskibana学习使用&#xff0c;记录一下搭建过程和遇到的问题以及解决办法 1.拉取es和kibana镜像 在拉取镜像之前先搜索一下 elasticsearch发现是存在elasticsearch镜像的&#xff0c;我一般习惯性拉取最新镜像&#xff0c…

C#__自定义类传输数据和前台线程和后台线程

// 前台线程和后台线程 // 默认情况下&#xff0c;用Thread类创建的线程是前台线程。线程池中的线程总是后台线程。 // 用Thread类创建线程的时候&#xff0c;可以设置IsBackground属性&#xff0c;表示一个后台线程。 // 前台线程在主函数运行结束后依旧执行&#xff0c;后台线…

b树/b+树、时间轮、跳表、LSM-Tree

b树、b树&#xff1a;关系型数据库核心存储结构 1、为什么磁盘数据存储结构用B树、而不用红黑树 磁盘每次读取不是读一个节点、是返回一页数据。 红黑树每次遍历一个节点排除一半数据。 B树通常映射相邻的磁盘页数据。4K mysql索引一个节点隐射16k故而映射4倍&#xff0c;故…

【C语言】扫雷游戏(可展开)——超细教学

&#x1f6a9;纸上得来终觉浅&#xff0c; 绝知此事要躬行。 &#x1f31f;主页&#xff1a;June-Frost &#x1f680;专栏&#xff1a;C语言 &#x1f525;该篇将运用数组来实现 扫雷游戏。 目录&#xff1a; &#x1f31f;思路框架测试游戏 &#x1f31f;测试部分函数实现&am…

云计算在线实训系统建设方案

一、 人工智能与云计算系统概述 人工智能&#xff08;Artificial Intelligence&#xff0c;简称AI&#xff09;是一种模拟人类智能的科学和工程&#xff0c;通过使用计算机系统来模拟、扩展和增强人类的智能能力。人工智能涉及多个领域&#xff0c;包括机器学习、深度学习、自然…

Web 开发 Django 管理工具

上次为大家介绍了 Django 的模型&#xff0c;通过模型就可以操作数据库&#xff0c;从而就可以改变页面的展示内容&#xff0c;那问题来了&#xff0c;我们只能通过手动编辑模型文件来配置模型吗&#xff1f;当然不是&#xff0c;Django 为我们提供了强大的工具&#xff0c;可以…

优化Python代理爬虫的应用

当我们在资源受限的环境中使用Python代理爬虫时&#xff0c;我们需要采取一些优化措施&#xff0c;以确保程序的高效性和稳定性。在本文中&#xff0c;我将分享一些关于如何优化Python代理爬虫在资源受限环境下的应用的实用技巧。 首先我们来了解&#xff0c;哪些情况算是资源…

GNU make系列之介绍Makefile

一.欢迎来到我的酒馆 在本章节介绍Makefile。 目录 一.欢迎来到我的酒馆二.GNU make 预览三.一个简单的Makefile四.make程序如何处理Makefile文件 二.GNU make 预览 2.1 GNU make工具会自动决定哪些程序需要被重新编译&#xff0c;并且执行相应的命令来重新编译程序。在本系列博…

[MyBatis系列④]核心配置文件

目录 1、简介 2、DTD 3、typeHandlers 3.1、默认类型处理器 3.2、自定义类型处理器 4、plugins ⭐MyBatis系列①&#xff1a;增删改查 ⭐MyBatis系列②&#xff1a;两种Dao开发方式 ⭐MyBatis系列③&#xff1a;动态SQL 1、简介 MyBatis的核心配置文件&#xff08;通常命…

whisper 语音识别项目部署

1.安装anaconda软件 在如下网盘免费获取软件&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1zOZCQOeiDhx6ebHh5zNasA 提取码&#xff1a;hfnd 2.使用conda命令创建python3.8环境 conda create -n whisper python3.83.进入whisper虚拟环境 conda activate whisper4.…

HQL解决连续三天登陆问题

1.背景 统计连续登录天数超过3天的用户&#xff0c;输出信息包括&#xff1a;用户id&#xff0c;登录天数&#xff0c;起始时间&#xff0c;结束时间&#xff1b; 2.准备数据 -- 建表 create table if not exists user_login_3days(user_id STRING,login_date date );--插入…

01.Django入门

1.创建项目 1.1基于终端创建Django项目 打开终端进入文件路径&#xff08;打算将项目放在哪个目录&#xff0c;就进入哪个目录&#xff09; E:\learning\python\Django 执行命令创建项目 F:\Anaconda3\envs\pythonWeb\Scripts\django-admin.exe&#xff08;Django-admin.exe所…

手写模拟SpringBoot核心流程(二):实现Tomcat和Jetty的切换

实现Tomcat和Jetty的切换 前言 上一篇文章我们聊到&#xff0c;SpringBoot中内置了web服务器&#xff0c;包括Tomcat、Jetty&#xff0c;并且实现了SpringBoot启动Tomcat的流程。 那么SpringBoot怎样自动切换成Jetty服务器呢&#xff1f; 接下来我们继续学习如何实现Tomcat…

Python代理池健壮性测试 - 压力测试和异常处理

大家好&#xff01;在构建一个可靠的Python代理池时&#xff0c;除了实现基本功能外&#xff0c;我们还需要进行一系列健壮性测试来确保其能够稳定运行&#xff0c;并具备应对各种异常情况的能力。本文将介绍如何使用压力测试工具以及合适的异常处理机制来提升Python代理池的可…