原生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 相关文章推荐
IE7提供XMLHttpRequest对象为兼容
Mar 08 Javascript
javascript 写类方式之三
Jul 05 Javascript
用js模拟JQuery的show与hide动画函数代码
Sep 20 Javascript
jquery实现在光标位置插入内容的方法
Feb 05 Javascript
JS实现的简单图片切换功能示例【测试可用】
Feb 14 Javascript
一个可复用的vue分页组件
May 15 Javascript
详解vue项目构建与实战
Jun 27 Javascript
Node.JS更改Windows注册表Regedit的方法小结
Aug 18 Javascript
使用淘宝镜像cnpm安装Vue.js的图文教程
May 17 Javascript
angular6.0使用教程之父组件通过url传递id给子组件的方法
Jun 30 Javascript
jQuery-ui插件sortable实现自由拖动排序
Dec 01 jQuery
微信小程序实现的点击按钮 弹出底部上拉菜单功能示例
Dec 20 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新手上路(四)
2006/10/09 PHP
PHP5.3与5.5废弃与过期函数整理汇总
2014/07/10 PHP
如何让thinkphp在模型中自动完成session赋值小教程
2014/09/05 PHP
php 时间time与日期date之间的使用详解及区别
2016/11/07 PHP
PHP实现的迪科斯彻(Dijkstra)最短路径算法实例
2017/09/16 PHP
PHP 实现重载
2021/03/09 PHP
Wordpress ThickBox 添加“查看原图”效果代码
2010/12/11 Javascript
jQuery News Ticker 基于jQuery的即时新闻行情展示插件
2011/11/05 Javascript
js输出阴历、阳历、年份、月份、周示例代码
2014/01/29 Javascript
javascript内置对象arguments详解
2014/03/16 Javascript
JavaScript事件委托的技术原理探讨示例
2014/04/17 Javascript
js仿黑客帝国字母掉落效果代码分享
2020/11/08 Javascript
详解JavaScript中的4种类型识别方法
2015/09/14 Javascript
Node.js巧妙实现Web应用代码热更新
2015/10/22 Javascript
适用于javascript开发者的Processing.js入门教程
2016/02/24 Javascript
JavaScript数据结构链表知识详解
2016/11/21 Javascript
浅析location.href跨窗口调用函数
2016/11/22 Javascript
js中DOM三级列表(代码分享)
2017/03/20 Javascript
修改vue+webpack run build的路径方法
2018/09/01 Javascript
javascript数组去重方法总结(推荐)
2019/03/20 Javascript
layui时间控件选择时间范围的实现方法
2019/09/28 Javascript
CountUp.js数字滚动插件使用方法详解
2019/10/17 Javascript
在vue中使用axios实现post方式获取二进制流下载文件(实例代码)
2019/12/16 Javascript
keep-alive保持组件状态的方法
2020/12/02 Javascript
[13:40]TI3青蛙君全程回顾 DOTA2我们为梦想再战
2013/09/13 DOTA
[36:45]TNC vs VGJ.S 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
Django实现图片文字同时提交的方法
2015/05/26 Python
Python实现文件按照日期命名的方法
2015/07/09 Python
python输入整条数据分割存入数组的方法
2018/11/13 Python
Python 进程之间共享数据(全局变量)的方法
2019/07/16 Python
基于Python和C++实现删除链表的节点
2020/07/06 Python
html5的canvas实现3d雪花飘舞效果
2013/12/27 HTML / CSS
葡萄牙鞋子品牌:Fair
2016/12/10 全球购物
法人授权委托书范本
2014/04/04 职场文书
创业计划书之DIY自助厨房
2019/09/06 职场文书
《自然之道》读后感3篇
2019/12/17 职场文书