HTML元素拖拽功能实现的完整实例


Posted in Javascript onDecember 04, 2020

1  需要了解的知识点

 1.1  offset(偏移量)

定义:元素在屏幕上占用的所有的可见的空间。

元素可见的大小由其高度、宽度决定,包括所有内边距、滚动条和边框大小四个属性

HTML元素拖拽功能实现的完整实例

offsetHeight:元素正在垂直方向上占用的大小空间,单位为px,不包括margin值。只读属性。

offsetWidth:元素在水平方向上占用的大小空间,单位为px,不包括margin值。只读属性。

offsetLeft:元素的左外边框至包含元素的左内边框之间的距离,单位为px。只读属性。

offsetTop:元素的上外边框至包含元素的上内边框之间的像素距离,单位为px。只读属性。

offsetParent:是一个元素最近的并且是定位过(relative || absolute)的父元素,如果没有父元素或者是父元素中没有一个是定位过的,返回值就是body元素。只读属性。

element.offsetLeft和element.offsetTop取值问题,分多种情况:

如果element是body的直接子元素,返回值则是element距离body左侧或顶部的距离;

如果element不是body的直接子元素,在父元素进行定位(relative或absolute)的情况下,各浏览器返回值都是element距离父元素左侧或者是顶部的距离(唯一的区别就是chrome没有把边框计算进去,IE、firefox都计算进去了);

如果element不是body的直接子元素,父元素也没有进行定位的情况下,各浏览器返回的直接是element元素距body的距离。

从上面可以看出offsetLeft、offsetTop返回的值就是element到offsetParent的距离,这个offsetParent是什么元素要看ele的父元素有没有进行定位(relative、absolute)。

1.2  client(客户区)

定义:元素的客户区大小(client dimension)指的是元素内容及其内边距所占距的空间大小。

HTML元素拖拽功能实现的完整实例

clientWidth:元素内容区宽度 + 左右内边距宽度,单位为px。内联元素以及没有 CSS 样式的元素的clientWidth属性值为 0。该属性包括内边距,但不包括垂直滚动条(如果有)、边框和外边距。只读属性。

clientHeight:元素内容区高度 + 上下内边距高度,单位为px。内联元素以及没有 CSS 样式的元素的clientHight属性值为 0。该属性包括内边距,但不包括水平滚动条(如果有)、边框和外边距。只读属性。

clientLeft:表示一个元素的左边框的宽度,单位为px。如果元素在左侧(右侧滚动条不算)有垂直滚动条,则该属性包括滚动条的宽度。clientLeft不包括左外边距和左内边距。只读属性。

clientTop:表示一个元素的上边框的宽度,单位为px。如果元素在顶部(底部滚动条不算)有水平滚动条,则该属性包括滚动条的宽度。clientTop不包括上外边距和上内边距。只读属性。

1.3  scroll(滚动区域)

我们一般看到的默认滚动条的宽度是17px。

滚动大小:指的是包含滚动内容的元素的大小。

HTML元素拖拽功能实现的完整实例

scrollHeight: 在没有滚动条的情况下,元素内容的总高度,单位为px。该尺寸包括元素的padding,但不包括元素的border、margin和水平滚动条宽度(如果存在)。

scrollWidth:在没有滚动条的情况下,元素内容的总宽度,单位为px。该尺寸包括元素的padding,但不包括元素的border、margin和垂直滚动条的宽度(如果存在)。

scrollLeft:被隐藏在内容区域左侧的像素值,通俗的解释就是元素水平滚动条到元素左边的距离。通过设置这个属性值可以改变元素的滚动位置。

scrollTop:被隐藏在内容区域上方的像素值,通俗的解释就是元素垂直滚动条到元素上方的距离。通过设置这个属性值可以改变元素的滚动位置。

1.4  window(窗口)

window.innerHeight:返回窗口的文档显示区的高度。

window.innerWidth:返回窗口的文档显示区的宽度。

window.outerWidth和window.outerHeight属性获取加上工具条与滚动条窗口的宽度与高度。

在Safari和Firefox中,outerWidth和outerHeight返回浏览器窗口本身的尺寸(无论是从最外层的window对象还是从某个框架访问)。在Opera中,这两个属性的值表示页面视图容器的大小。而innerWidth和innerHeight则表示该容器中页面视图区的大小(减去边框宽度)。在Chrome中,outerWidth.outerHeight与innerWidth,innerHeight返回相同的值,即视口(viewport)大小而非浏览器窗口大小。
IE没有提供取得当前浏览器窗口尺寸的属性。不过,它通过DOM提供了页面可见区域的相关信息。
在IE以及Firefox、Safari、Opera和Chrome中,document.documentElement.clientWidth和
document.documentElement.clientHeight中保存了页面视口的信息。在IE6中,这些属性必须在标准模式下才有效。如果是混杂模式,就必须通过docrunent.body.clientWidth和document.body.clientHeight取得相同信息。而对于混杂模式下的Chrome,则无论通过docurnent.documentElement还是document.body中的clientWidth和clientHeight属性,都可以取得视口的大小。

1.5  鼠标事件对象(mouseEvent)的一些属性

mEvent.clientX:返回鼠标触点相对于浏览器可见视区(或有效区域)左边沿的的X坐标,不包括任何滚动偏移,单位为px。这个值会根据用户对可见视区的缩放行为而发生变化。

mEvent.clientY:返回鼠标触点相对于浏览器可见视区(或有效区域)上边沿的的Y坐标,不包括任何滚动偏移,单位为px。这个值会根据用户对可见视区的缩放行为而发生变化。

mEvent.pageX:鼠标触点相对于HTML文档左边沿的的X坐标,单位为px。和clientX 属性不同,这个值是相对于整个html文档的坐标,和用户滚动位置无关。因此当存在水平滚动的偏移时,这个值包含了水平滚动的偏移。

mEvent.pageY:鼠标触点相对于HTML文档上边沿的的Y坐标,单位为px。和clientY 属性不同,这个值是相对于整个html文档的坐标,和用户滚动位置无关。因此当存在垂直滚动的偏移时,这个值包含了垂直滚动的偏移。

mEvent.screenX:返回鼠标触点相对于屏幕左边沿的X坐标,单位为px。不包含页面滚动的偏移量。

mEvent.screenY:返回鼠标触点相对于屏幕上边沿的Y坐标,单位为px。不包含页面滚动的偏移量。

mEvent.offsetX:当鼠标事件发生时,鼠标触点距离事件源元素左侧的X轴方向上的距离,单位为px。

mEvent.offsetY:当鼠标事件发生时,鼠标触点距离事件源元素顶部的Y轴方向上的距离,单位为px。

2  示例演示

 2.1  元素水平拖拽效果实现

<!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>
</head>
<body>
 <div id="blackSquare" style="position: absolute; width:50px; height:50px; background-color: black;cursor: pointer;"></div>
</body>
<script>
 window.onload = () => {
 //获取拖拽实验对象
 let el=document.getElementById("blackSquare");
 //在该对象上绑定鼠标点击事件
 el.onmousedown = (e) => {
 //鼠标按下,计算鼠标触点距离元素左侧的距离
 let disX = e.clientX - el.offsetLeft;
 document.onmousemove = function (e) {
 //计算需要移动的距离
 let t = e.clientX - disX;
 //移动当前元素
 if (t >= 0 && t <= window.innerWidth - el.offsetWidth) {
 el.style.left = t + 'px';
 } 
 };
 //鼠标松开时,注销鼠标事件,停止元素拖拽。
 document.onmouseup = function (e) {
 document.onmousemove = null;
 document.onmouseup = null;
 };
 } 
 }
</script>
</html>

HTML元素拖拽功能实现的完整实例

2.2  元素垂直拖拽效果实现

<!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>
</head>
<body>
 <div id="blackSquare" style="position: absolute; width:50px; height:50px; background-color: black;cursor: pointer;"></div>
</body>
<script>
 window.onload = () => {
 //获取拖拽实验对象
 let el=document.getElementById("blackSquare");
 //在该对象上绑定鼠标点击事件
 el.onmousedown = (e) => {
 //鼠标按下,计算鼠标触点距离元素左侧的距离
 let disY = e.clientY - el.offsetTop;
 document.onmousemove = function (e) {
 //计算需要移动的距离
 let t = e.clientY - disY;
 //移动当前元素
 if (t >= 0 && t <= window.innerHeight - el.offsetHeight) {
 el.style.top = t + 'px';
 } 
 };
 //鼠标松开时,注销鼠标事件,停止元素拖拽。
 document.onmouseup = function (e) {
 document.onmousemove = null;
 document.onmouseup = null;
 };
 } 
 }
</script>
</html>

HTML元素拖拽功能实现的完整实例

2.3  元素任意方向拖拽效果实现

<!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>
</head>
<body>
 <div id="blackSquare" style="position: absolute; width:50px; height:50px; background-color: black;cursor: pointer;"></div>
</body>
<script>
 window.onload = () => {
 //获取拖拽实验对象
 let el=document.getElementById("blackSquare");
 //在该对象上绑定鼠标点击事件
 el.onmousedown = (e) => {
 //鼠标按下,计算鼠标触点距离元素左侧和顶部的距离
 let disX = e.clientX - el.offsetLeft;
 let disY = e.clientY - el.offsetTop;
 document.onmousemove = function (e) {
 //计算需要移动的距离
 let tX = e.clientX - disX;
 let tY = e.clientY - disY;
 //移动当前元素
 if (tX >= 0 && tX <= window.innerWidth - el.offsetWidth) {
 el.style.left = tX + 'px';
 } 
 if (tY >= 0 && tY <= window.innerHeight - el.offsetHeight) {
 el.style.top = tY + 'px';
 } 
 };
 //鼠标松开时,注销鼠标事件,停止元素拖拽。
 document.onmouseup = function (e) {
 document.onmousemove = null;
 document.onmouseup = null;
 };
 } 
 }
</script>
</html>

HTML元素拖拽功能实现的完整实例

3  参考文献

https://developer.mozilla.org/zh-CN/docs/Web/API/Element

https://developer.mozilla.org/zh-CN/docs/Web/API/Touch

https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent

到此这篇关于HTML元素拖拽功能实现的文章就介绍到这了,更多相关HTML元素拖拽功能内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
JavaScript 基础问答三
Dec 03 Javascript
javascript最常用与实用的创建类的代码
Aug 12 Javascript
js 获取、清空input type=&quot;file&quot;的值(示例代码)
Dec 24 Javascript
javascript实现鼠标移到Image上方时显示文字效果的方法
Aug 07 Javascript
JavaScript编写检测用户所使用的浏览器的代码示例
May 05 Javascript
JavaScript跨域调用基于JSON的RESTful API
Jul 09 Javascript
Vue.js快速入门实例教程
Oct 15 Javascript
jQuery实现的简单无刷新评论功能示例
Nov 08 jQuery
微信网页授权并获取用户信息的方法
Jul 30 Javascript
使用webpack构建应用的方法步骤
Mar 04 Javascript
Echarts动态加载多条折线图的实现代码
May 24 Javascript
JavaScript原生数组函数实例汇总
Oct 14 Javascript
解决Vue-cli3没有vue.config.js文件夹及配置vue项目域名的问题
Dec 04 #Vue.js
vue基于Echarts的拖拽数据可视化功能实现
Dec 04 #Vue.js
addEventListener()和removeEventListener()追加事件和删除追加事件
Dec 04 #Javascript
vue使用echarts图表自适应的几种解决方案
Dec 04 #Vue.js
原生JS实现拖拽效果
Dec 04 #Javascript
vue-calendar-component 封装多日期选择组件的实例代码
Dec 04 #Vue.js
如何正确解决VuePress本地访问出现资源报错404的问题
Dec 03 #Vue.js
You might like
德生H-501的评价与改造
2021/03/02 无线电
php模板之Phpbean的目录结构
2008/01/10 PHP
php数组函数序列之next() - 移动数组内部指针到下一个元素的位置,并返回该元素值
2011/10/31 PHP
PHP实现添加购物车功能
2017/03/06 PHP
PHP实现的一致性Hash算法详解【分布式算法】
2018/03/31 PHP
Add a Picture to a Microsoft Word Document
2007/06/15 Javascript
jQuery 渐变下拉菜单
2009/12/15 Javascript
javascript中的undefined 与 null 的区别  补充篇
2010/03/17 Javascript
基于jquery的多功能软键盘插件
2012/07/25 Javascript
js读取配置文件自写
2014/02/11 Javascript
jQuery滚动条插件nanoscroller使用指南
2015/04/21 Javascript
jQuery侧边栏实现代码
2016/05/06 Javascript
jquery attr()设置和获取属性值实例教程
2016/09/25 Javascript
jQuery解析XML 详解及方法总结
2016/09/28 Javascript
详解JavaScript树结构
2017/01/09 Javascript
vue 解决无法对未定义的值,空值或基元值设置反应属性报错问题
2020/07/31 Javascript
原生js生成图片验证码
2020/10/11 Javascript
python二分法实现实例
2013/11/21 Python
python实现简单中文词频统计示例
2017/11/08 Python
Python 查找字符在字符串中的位置实例
2018/05/02 Python
为何人工智能(AI)首选Python?读完这篇文章你就知道了(推荐)
2019/04/06 Python
python绘制随机网络图形示例
2019/11/21 Python
python GUI库图形界面开发之PyQt5输入对话框QInputDialog详细使用方法与实例
2020/02/27 Python
python实现mask矩阵示例(根据列表所给元素)
2020/07/30 Python
HTML5 Canvas 破碎重组的视频特效的示例代码
2019/09/24 HTML / CSS
Clearly新西兰:购买眼镜、太阳镜和隐形眼镜
2018/04/26 全球购物
什么是用户模式(User Mode)与内核模式(Kernel Mode) ?
2014/07/21 面试题
医药专业推荐信
2013/11/15 职场文书
初中科学教学反思
2014/01/21 职场文书
英文求职信写作小建议
2014/02/16 职场文书
小学感恩教育活动总结
2014/07/07 职场文书
领导班子四风查摆对照检查材料思想汇报
2014/10/05 职场文书
2014年安全工作总结范文
2014/11/13 职场文书
法律意见书范文
2015/06/04 职场文书
运动会观后感
2015/06/09 职场文书
总经理年会致辞
2015/07/29 职场文书