原生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 相关文章推荐
JavaScript 学习初步 入门教程
Mar 25 Javascript
用js设置下拉框为只读的小技巧
Apr 10 Javascript
javascript初学者常用技巧
Sep 02 Javascript
JavaScript 表单处理实现代码
Apr 13 Javascript
js+HTML5实现视频截图的方法
Jun 16 Javascript
JavaScript中模拟实现jsonp
Jun 19 Javascript
jQuery实现的指纹扫描效果实例(附演示与demo源码下载)
Jan 26 Javascript
JQUERY表单暂存功能插件分享
Feb 23 Javascript
js+canvas实现滑动拼图验证码功能
Mar 26 Javascript
微信小程序实现签字功能
Dec 23 Javascript
vue实现购物车结算功能
Jun 18 Javascript
JavaScript eval()函数定义及使用方法详解
Jul 07 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
一贴学会PHP 新手入门教程
2009/08/03 PHP
php array_pop()数组函数将数组最后一个单元弹出(出栈)
2011/07/12 PHP
PHP中的正则表达式函数介绍
2012/02/27 PHP
使用PHP计算两个路径的相对路径
2013/06/14 PHP
php实现MD5加密16位(不要默认的32位)
2013/08/12 PHP
使用php计算排列组合的方法
2013/11/13 PHP
php中AES加密解密的例子小结
2014/02/18 PHP
解析PHP的Yii框架中cookie和session功能的相关操作
2016/03/17 PHP
基于jquery的button默认enter事件(回车事件)。
2011/05/18 Javascript
用js小类库获取浏览器的高度和宽度信息
2012/01/15 Javascript
修改file按钮的默认样式实现代码
2013/04/23 Javascript
使用PHP+JQuery+Ajax分页的实现
2013/04/23 Javascript
Jquery加载时从后台读取数据绑定到dropdownList实例
2013/06/09 Javascript
关于JavaScript作用域你想知道的一切
2016/02/04 Javascript
深入理解Javascript中的作用域链和闭包
2017/04/25 Javascript
JavaScript之Canvas_动力节点Java学院整理
2017/07/04 Javascript
前端MVVM框架解析之双向绑定
2018/01/24 Javascript
vue配置请求本地json数据的方法
2018/04/11 Javascript
React Navigation 使用中遇到的问题小结
2018/05/08 Javascript
vue.draggable实现表格拖拽排序效果
2018/12/01 Javascript
koa2 用户注册、登录校验与加盐加密的实现方法
2019/07/22 Javascript
JS浮点数运算结果不精确的Bug解决
2019/08/01 Javascript
微信小程序定义和调用全局变量globalData的实现
2019/11/01 Javascript
[03:04]DOTA2超级联赛专访ZSMJ “莫名其妙”的逆袭
2013/05/23 DOTA
[04:01]2014DOTA2国际邀请赛 TITAN告别Ohaiyo期望明年再战
2014/07/15 DOTA
记录Django开发心得
2014/07/16 Python
Python之reload流程实例代码解析
2018/01/29 Python
Python函数和模块的使用总结
2019/05/20 Python
利用python生成照片墙的示例代码
2020/04/09 Python
python语言的优势是什么
2020/06/17 Python
Tensorflow使用Anaconda、pycharm安装记录
2020/07/29 Python
viagogo法国票务平台:演唱会、体育比赛、戏剧门票
2017/03/27 全球购物
印度尼西亚最大和最全面的网络商城:Blibli.com
2017/10/04 全球购物
小溪流的歌教学反思
2014/02/13 职场文书
师德师风个人反思
2014/04/28 职场文书
MySQL EXPLAIN输出列的详细解释
2021/05/12 MySQL