原生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 相关文章推荐
js 获取Listbox选择的值的代码
Apr 15 Javascript
javascript延时加载之defer测试
Dec 28 Javascript
select多选 multiple的使用示例
Jun 16 Javascript
兼容IE、firefox以及chrome的js获取时间(getFullYear)
Jul 04 Javascript
使用js实现数据格式化
Dec 03 Javascript
js实现文字跟随鼠标移动而移动的方法
Feb 28 Javascript
jQuery实现html表格动态添加新行的方法
May 28 Javascript
文本溢出插件jquery.dotdotdot.js使用方法详解
Jun 22 jQuery
基于Vue.js实现tab滑块效果
Jul 23 Javascript
LayerClose弹窗关闭刷新方法
Aug 17 Javascript
Layui 数据表格批量删除和多条件搜索的实例
Sep 04 Javascript
js实现微信聊天效果
Aug 09 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
destoon复制新模块的方法
2014/06/21 PHP
PHP中__autoload和Smarty冲突的简单解决方法
2016/04/08 PHP
基于php实现的验证码小程序
2016/12/13 PHP
Laravel6.2中用于用户登录的新密码确认流程详解
2019/10/16 PHP
Laravel框架使用技巧之使用url()全局函数返回前一个页面的地址方法详解
2020/04/06 PHP
input、button的不同type值在ajax提交表单时导致的陷阱
2009/02/24 Javascript
jQuery UI AutoComplete 自动完成使用小记
2010/08/21 Javascript
JS实现一键回顶功能示例代码
2013/10/28 Javascript
js获取元素外链样式的方法
2015/01/27 Javascript
Javascript字符串拼接小技巧(推荐)
2016/06/02 Javascript
提高Web性能的前端优化技巧总结
2017/02/27 Javascript
nodejs multer实现文件上传与下载
2017/05/10 NodeJs
AngularJS实现表格的增删改查(仅限前端)
2017/07/04 Javascript
canvas绘制爱心的几种方法总结(推荐)
2017/10/31 Javascript
利用vue和element-ui设置表格内容分页的实例
2018/03/02 Javascript
使用sessionStorage解决vuex在页面刷新后数据被清除的问题
2018/04/13 Javascript
小程序视频列表中视频的播放与停止的示例代码
2018/07/20 Javascript
记一次Vue.js混入mixin的使用(分权限管理页面)
2019/04/17 Javascript
JS原型和原型链原理与用法实例详解
2020/02/05 Javascript
在Vue中使用Echarts实例图的方法实例
2020/10/10 Javascript
JavaScript实现浏览器网页自动滚动并点击的示例代码
2020/12/05 Javascript
Python中使用select模块实现非阻塞的IO
2015/02/03 Python
Python中decorator使用实例
2015/04/14 Python
浅谈Python中带_的变量或函数命名
2017/12/04 Python
python Crypto模块的安装与使用方法
2017/12/21 Python
python频繁写入文件时提速的方法
2019/06/26 Python
Python操作多维数组输出和矩阵运算示例
2019/11/28 Python
Python如何在单元测试中给对象打补丁
2020/08/03 Python
获取CSDN文章内容并转换为markdown文本的python
2020/09/06 Python
EMPHASIS艾斐诗官网:周生生旗下原创精品珠宝品牌
2020/12/17 全球购物
表演方阵解说词
2014/02/08 职场文书
教堂婚礼主持词
2014/03/14 职场文书
英文演讲稿开场白
2014/08/25 职场文书
党员民主生活会个人整改措施材料
2014/09/16 职场文书
团支部组织委员竞选稿
2015/11/21 职场文书
java开发双人五子棋游戏
2022/05/06 Java/Android