原生JS实现拖拽功能


Posted in Javascript onDecember 16, 2020

本文实例为大家分享了JS实现拖拽功能的具体代码,供大家参考,具体内容如下

拖拽的原理:三个事件 onmousedownonmousemoveonmousemove

1、鼠标按下,触发onmousedown,获取鼠标坐标x,y,获取元素坐标x,y

通过event.clientX、event.clientY获取鼠标位置的坐标

let x = e.clientX - box.offsetLeft; //鼠标点击坐标距离盒子左边缘的距离
let y = e.clientY - box.offsetTop; //鼠标点击坐标距离盒子上边缘的距离

2、设置元素left、top值,(元素要设置position:absolute)

box.style.left = ev.clientX - x + 'px';
box.style.top = ev.clientY - y + 'px';

3、放开鼠标取消dom事件

下面是详细代码:我只开了横向移动

<!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>
 #box {
 width: 100px;
 height: 100px;
 background: red;
 position: absolute
 }
 
 </style>
</head>
 
<body style="position: relative;overflow: hidden;">
 <div id="box">
 
 </div>
 
 <script>
 window.onload = function () {
 let box = document.getElementById('box')
 box.onmousedown = function (ev) {
 let e = ev || event;
 let x = e.clientX - box.offsetLeft; //鼠标点击坐标距离盒子左边缘的距离
 let y = e.clientY - box.offsetTop; //鼠标点击坐标距离盒子上边缘的距离
 document.onmousemove = function (ev) {
  let e = ev || event;
  box.style.left = ev.clientX - x + 'px';
  box.style.top = ev.clientY - y + 'px';
  
  let bodyScreenX = ev.screenX
  let bodyClientWidth = document.body.clientWidth
  
  document.onmouseup = function (ev) {
  if (ev.clientX - x < 0) {
  box.style.left = 0
  } else if (bodyScreenX > bodyClientWidth) {
  box.style.right = 0
  box.style.left = bodyClientWidth - 100 + 'px'
  }
  document.onmousemove = null;
  document.onmouseup = null;
  }
 }
 }
 }
 
 </script>
</body>
 
</html>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
网页中的图片的处理方法与代码
Nov 26 Javascript
JQuery UI DatePicker中z-index默认为1的解决办法
Sep 28 Javascript
javascript学习笔记(二) js一些基本概念
Jun 18 Javascript
使用Post提交时须将空格转换成加号的解释
Jan 14 Javascript
javascript获取隐藏dom的宽高 具体实现
Jul 14 Javascript
详解JavaScript基于面向对象之继承实例
Dec 16 Javascript
简述Matlab中size()函数的用法
Mar 20 Javascript
基于JS实现弹出一个隐藏的div窗口body页面变成灰色并且不可被编辑
Dec 14 Javascript
基于Axios 常用的请求方法别名(详解)
Mar 13 Javascript
jQuery each和js forEach用法比较
Feb 27 jQuery
Node.js爬虫如何获取天气和每日问候详解
Aug 26 Javascript
layer提示框添加多个按钮选择的实例
Sep 12 Javascript
vue图片裁剪插件vue-cropper使用方法详解
Dec 16 #Vue.js
vue实现图片裁剪后上传
Dec 16 #Vue.js
Vue-router中hash模式与history模式的区别详解
Dec 15 #Vue.js
JS创建自定义对象的六种方法总结
Dec 15 #Javascript
npm全局环境变量配置详解
Dec 15 #Javascript
vue项目中企业微信使用js-sdk时config和agentConfig配置方式详解
Dec 15 #Vue.js
angular *Ngif else用法详解
Dec 15 #Javascript
You might like
浅析ThinkPHP的模板输出功能
2014/07/01 PHP
php用户登录之cookie信息安全分析
2016/05/13 PHP
thinkphp 中的volist标签在ajax操作中的特殊性(推荐)
2018/01/15 PHP
PHP设计模式之建造者模式定义与用法简单示例
2018/08/13 PHP
jQuery性能优化28条建议你值得借鉴
2013/02/16 Javascript
js实现广告漂浮效果的小例子
2013/07/02 Javascript
js给页面加style无效果的解决方法
2014/01/20 Javascript
JavaScript中的值是按值传递还是按引用传递问题探讨
2015/01/30 Javascript
jQuery插件EasyUI校验规则 validatebox验证框
2015/11/29 Javascript
使用jQuery判断Div是否在可视区域的方法 判断div是否可见
2016/02/17 Javascript
AngularJS利用Controller完成URL跳转
2016/08/09 Javascript
JavaScript实现经典排序算法之选择排序
2016/12/28 Javascript
jQuery和CSS仿京东仿淘宝列表导航菜单
2017/01/04 Javascript
ionic中列表项增加和删除的实现方法
2017/01/22 Javascript
JS传参及动态修改页面布局
2017/04/13 Javascript
Kindeditor单独调用多图上传实例
2017/07/31 Javascript
vue地址栏直接输入路由无效问题的解决
2018/11/15 Javascript
JavaScript array常用方法代码实例详解
2020/09/02 Javascript
JavaScript读取本地文件常用方法流程解析
2020/10/12 Javascript
[05:20]2018DOTA2亚洲邀请赛主赛事第三日战况回顾 LGD率先挺进胜者组决赛
2018/04/06 DOTA
pymongo实现控制mongodb中数字字段做加法的方法
2015/03/26 Python
理解Python中的类与实例
2015/04/27 Python
Python中Django框架利用url来控制登录的方法
2015/07/25 Python
Python常用的爬虫技巧总结
2016/03/28 Python
python 从csv读数据到mysql的实例
2018/06/21 Python
Python实现插入排序和选择排序的方法
2019/05/12 Python
django+tornado实现实时查看远程日志的方法
2019/08/12 Python
python multiprocessing多进程变量共享与加锁的实现
2019/10/02 Python
canvas学习笔记之2d画布基础的实现
2019/02/21 HTML / CSS
澳大利亚便宜的家庭购物网站:CrazySales
2018/02/06 全球购物
巴西最大的巴士票务门户:Quero Passagem
2020/11/21 全球购物
整脏治乱工作简报
2015/07/21 职场文书
幼儿园保育员随笔
2015/08/14 职场文书
2016年情人节广告语
2016/01/28 职场文书
Vue的列表之渲染,排序,过滤详解
2022/02/24 Vue.js
Win11黑色桌面背景怎么办?Win11黑色壁纸解决方法汇总
2022/04/05 数码科技