每日分享!~ 使用js原生方式对拖拉元素(鼠标的事件)
一个元素放置页面上。如何进行拖拉,实现想放哪里就放哪里的效果呢?
效果如下:

如果让你写这个效果,你会如何写呢?
--- 思路分析:我首先想到的是,对这个元素先绑定一个事件。(什么事件? 那当然是鼠标按下时的事件啦? ) 那么绑定这个事件具体做啥子呢? 在绑定这个事件之前。我们需要先了解如下几个事情--
1. 元素如何才能在页面上移动? (是不是要脱离文档流呢? OK / 这时我们给设置一个position:absolute / 让其绝对定位。
2. 获取元素当前距离页面两边的位置
3. 获取鼠标距离页面两边的位置
4.求得鼠标距离元素边框的距离
5.在鼠标移动事件中。设置元素的left , top 值 。 便可以使元素动起来啦 。
6. 在鼠标抬起的时候,清掉鼠标移动和鼠标抬起事件。
--- 下面是具体的代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
*{
margin: 0;
padding: 0;
}
div{
position: absolute;
width: 100px;
height: 100px;
background-color: red;
top:100px ;
left:100px;
}
</style>
</head>
<body>
<button id="btn">test</button>
<div id="dv"></div> <script>
// 鼠标点击元素开启监听事件
dv.addEventListener('mousedown',(e)=>{
// 计算鼠标箭头和元素的左边缘和上边缘的距离
var disX = e.pageX - dv.offsetLeft
var disY = e.pageY - dv.offsetTop
// console.log(dv.offsetLeft)
// 当点击时,会一直触发监听鼠标的移动事件(监听document
// document.addEventListener('mousemove', (e) =>{
// // console.log(e)
// // 设置元素的移动距离
// dv.style.left = e.pageX - disX + 'px'
// dv.style.top = e.pageY - disY + 'px'
// })
// document.addEventListener('mouseup',(e) =>{
// // 移除两个事件
// document.removeEventListener('mosedown',(e) =>{
// // console.log(e)
// // 设置元素的移动距离
// dv.style.left = e.pageX - disX + 'px'
// dv.style.top = e.pageY - disY + 'px'
// })
// document.removeEventListener('mosueup',() =>{})
// })
// // 阻止默认事件
// console.log(e.preventDefault())
document.onmousemove = function(e){
dv.style.left = e.pageX - disX + 'px'
dv.style.top = e.pageY - disY + 'px'
}
document.onmouseup = function(){
document.onmousemove = document.onmouseup = null
}
e.preventDefault()
// 总结: 使用addEventLister() 在移除事件的实际不方便!! 还是采用普通的事件监听函数~~
}) </script>
</body>
</html>
好了~~~今天的分享就先到这里啦! 还有一点其他的知识留着明天分享吧!~~~每天分享一点~ 2019-04-25 23:15:39
值得注意的是:获取距离的几个方法: 如:target.offsetTop / e.pageY / 等
每日分享!~ 使用js原生方式对拖拉元素(鼠标的事件)的更多相关文章
- js原生方式实现bind方法
1.思路 (1)因为bind方法不会立即执行函数,需要返回一个待执行的函数(这里用到闭包,可以返回一个函数)return function(){} (2)作用域绑定,这里可以使用apply或者call ...
- js 原生_拖动页面元素,松开释放
嗯哼.不多说,直接上代码了. // 为元素 绑定拖动事件 function bindDragEvent(obj){ obj.onmousedown = function(e){ e = e || wi ...
- js原生选择class DOM元素
document.querySelector(".demo"); querySelector() 方法返回匹配指定选择器的第一个元素.如果需要返回所有的元素,使用 querySel ...
- JS/jQuery点击某元素之外触发事件
JQuery // 第一步:点击任何地方都触发事件 $(document).click(function(){ alert("点击当前页面的任何地方都触发此点击事件:"); }); ...
- JS基础内容小结(event 鼠标键盘事件)(三)
var ev=ev||event 兼容性处理 得到焦点为 onfocus 失去焦点 onblur return false能阻止部分函数的执行 obj.select 选择指定元素里的文本内容 ———— ...
- JS原生对象实现异步请求以及JQ的ajax请求四种方式
一.JS原生方式异步请求 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="A ...
- 图片轮播(淡入淡出)--JS原生和jQuery实现
图片轮播(淡入淡出)--js原生和jquery实现 图片轮播有很多种方式,这里采用其中的 淡入淡出形式 js原生和jQuery都可以实现,jquery因为封装了很多用法,所以用起来就简单许多,转换成j ...
- js/jq 动态添加的元素不能触发绑定事件解决方案
<!-- Copyright 2017-10-27, Jachin QQ: 381558301 Email: 381558301@qq.com 请看看你们的版本并对号入座: jquery1.6版 ...
- JS(原生js和jq方式)获取元素属性(自定义属性),删除属性(自定义属性)
JS(原生js和jq方式)获取元素属性(自定义属性),删除属性(自定义属性) 以下内容: 一.获取元素的属性 二.设置元素的属性 三.删除元素的属性 一.获取元素的属性 1-原生JS 获取属性 .ge ...
随机推荐
- python3中用HTMLTestRunner.py报ImportError: No module named 'StringIO'解决办法
.原因是官网的是python2语法写的,看官手动把官网的HTMLTestRunner.py改成python3的语法: 参考:http://bbs.chinaunix.net/thread-415474 ...
- 一起来读Netty In Action(一)
Netty是一款异步事件驱动的网络应用程序框架,支持快速的开发可维护的高性能的面向协议的服务器和客户端.在网络编程中,阻塞.非阻塞.同步.异步经常被提到.同步(synchronous) IO和异步(a ...
- Bootstrap3 多个模态对话框无法显示的问题
http://blog.csdn.net/oarsman/article/details/51387426
- vue简介
vue的介绍 vue官网说:Vue.js(读音 /vjuː/,类似于 view) 是一套构建用户界面的渐进式框架.与其他重量级框架不同的是,Vue 采用自底向上增量开发的设计. vue的优点 1.易用 ...
- SpringBoot JMS(ActiveMQ) 使用实践
ActiveMQ 1. 下载windows办的activeMQ后,在以下目录可以启动: 2. 启动后会有以下提示 3. 所以我们可以通过http://localhost:8161访问管理页面,通过tc ...
- CopyOnWriteArrayList简介
CopyOnWriteArrayList,写数组的拷贝,支持高效率并发且是线程安全的,读操作无锁的ArrayList.所有可变操作都是通过对底层数组进行一次新的复制来实现. CopyOnWriteAr ...
- orcl数据库命令行怎么导入dmp格式的文件
2018-05-23 1.创建空间 以system的身份登陆orcl 打开SQL Window界面,输入以下命令create tablespace SGXC(表空间的名字)datafile 'D:/S ...
- docker开机自动重启参数
docker run -ti -d --privileged --restart=always -p : -p : -v /apps/qkaoauth:/apps/qkaoauth docker.qk ...
- #利用openCV裁脸
#利用openCV裁脸import cv2 def draw_rects(img, rects): for x, y, w, h in rects: cv2.rectangle(img, (x, y) ...
- 在后台主机中托管SignalR服务并广播心跳包
什么是后台主机 在之前的 Asp.NETCore 轻松学系列中,曾经介绍过一个轻量级服务主机 IHostedService ,利用 IHostedService 可以轻松的实现一个系统级别的后台服务, ...