[精彩网文] 用JavaScript实现div的鼠标拖拽效果
作者:精品下载站 日期:2020-11-14 17:47:27 浏览:84 分类:网文网语
一个简单的可拖动div,随着鼠标的移动,实现原理鼠标按下时根据onmousemove事件来动态获取鼠标坐标位置以此来更新div的位置,实现的前提时div要有一个定位效果,不然的话是移动不了它的。
演示(鼠标按住拖动)
.box { position: absolute; width: 40px; height: 40px; background: red; } .boxXXXXC { height: 100px; }CSS样式
.box { position: absolute; width: 200px; height: 200px; background: red; }
HTML
<div class="box"></div>
首先先分析一下需求,这个需求就是点击时鼠标按下你才能移动并改变div在页面中的位置。鼠标松开你就不能在移动了。所以这里鼠标的状态有三个,分别是
点击时鼠标按下(mousedown事件) 移动时(mousemove事件) 松开时(mouseup事件)
所以js部分有三个事件。
JS部分
var box = document.getElementsByClassName("box")[0];//获取元素 var x, y;//存储div的坐标 var isDrop = false;//移动状态的判断鼠标按下才能移动
e.clientX鼠标x轴的位置,
e.clientY鼠标Y轴的位置,
box.offsetLeft获取div距离左边的距离,
box.offsetTop获取div距离上边的距离。
如下图所示 e.clientX - box.offsetLeft
我们可以得到坐标点x与 box.offsetLeft之间的偏差值,我们要再用坐标点x减去这个偏差值才是div真实相对于左边移动的距离。
![[精彩网文] 用JavaScript实现div的鼠标拖拽效果](https://www.cdz432.com/zb_users/upload/2022/11/20221115011119166844587994895.png)
鼠标移动时
为了防止鼠标移动过快事件无法正确处理所以事件绑定到document上
document.onmousemove = function(e) { //是否为可移动状态 if(isDrop) { var e = e || window.event; var moveX = e.clientX - x;//得到距离左边移动距离 var moveY = e.clientY - y;//得到距离上边移动距离 box.style.left = moveX + "px"; box.style.top = moveY + "px"; }else{ return ; } }
e.clientX - x 鼠标点坐标减去偏差得到div距离左边的距离, e.clientY - y 鼠标点坐标减去偏差得到div距离上边的距离。
给div的left,top重新赋值
鼠标松开时
为了放置鼠标移动过快时间无法正确处理所以事件绑定到document上
document.onmouseup = function() { isDrop = false;//设置为false不可移动 }
现在div已经可以拖拽了,目前还需要添加一个范围限定,不然div会拖到页面外面去,这样不行的所以得添加范围限定。div最大移动宽度为页面宽减去div的宽,最小为零,最大高为页面高减去div的高,最小为零。所以范围限定要这样写
document.onmousemove = function(e) { var e = e || window.event; if(is) { var moveX = e.clientX - x; var moveY = e.clientY - y; var maxX = document.documentElement.clientWidth - box.offsetWidth;//X轴可移动最大距离 var maxY = document.documentElement.clientHeight - box.offsetHeight;//Y轴可移动最大距离 //范围限定 最小时取最大 最大时取最小 if(moveX < 0) { moveX=0 }else if(moveX>maxX){ moveX=maxX; } if(moveY < 0) { moveY=0; }else if(moveY>maxY){ moveY=maxY; } box.style.left = moveX + "px"; box.style.top = moveY + "px"; } else { return; } }
这样效果就完美实现了,但是范围限定我们还可以这样做。
可以这样表示范围限定
//范围限定 最小取最大 最大取最小 if(moveX < 0) { moveX= Math.max(0,moveX)//0 }else if(moveX>maxX){ moveX=Math.min(moveX,maxX);//maxX } if(moveY < 0) { moveY= Math.max(0,moveY) //0 }else if(moveY>maxY){ moveY=Math.min(moveY,maxY); //maxY }
所以我们可以这样写
moveX=Math.min(maxX, Math.max(0,moveX)); moveY=Math.min(maxY, Math.max(0,moveY));
然后完整代码
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <style> .box { position: absolute; width: 200px; height: 200px; background: red; } </style> </head> <body> <div class="box"></div> <script> var box = document.getElementsByClassName("box")[0]; //获取元素 var x, y; //鼠标相对与div左边,上边的偏移 var isDrop = false; //移动状态的判断鼠标按下才能移动 box.onmousedown = function(e) { var e = e || window.event; //要用event这个对象来获取鼠标的位置 x = e.clientX - box.offsetLeft; y = e.clientY - box.offsetTop; isDrop = true; //设为true表示可以移动 } document.onmousemove = function(e) { //是否为可移动状态 if(isDrop) { var e = e || window.event; var moveX = e.clientX - x; //得到距离左边移动距离 var moveY = e.clientY - y; //得到距离上边移动距离 //可移动最大距离 var maxX = document.documentElement.clientWidth - box.offsetWidth; var maxY = document.documentElement.clientHeight - box.offsetHeight; //范围限定 当移动的距离最小时取最大 移动的距离最大时取最小 //范围限定方法一 /*if(moveX < 0) { moveX = 0 } else if(moveX > maxX) { moveX = maxX; } if(moveY < 0) { moveY = 0; } else if(moveY > maxY) { moveY = maxY; } */ //范围限定方法二 moveX=Math.min(maxX, Math.max(0,moveX)); moveY=Math.min(maxY, Math.max(0,moveY)); box.style.left = moveX + "px"; box.style.top = moveY + "px"; } else { return; } } document.onmouseup = function() { isDrop = false; //设置为false不可移动 } </script> </body> </html>
猜你还喜欢
- 05-21 [影视资讯] 《最后生还者》游戏 vs 电视剧:第二季第三集与游戏的 6 大不同之处
- 05-21 [影视资讯] 海军罪案调查处:起源 结局解析——第一季最大爆料和第二季预测
- 05-21 [影视资讯] 《最后生还者:赛拉菲特》教派解析——符号含义、面部标记、先知与游戏关联
- 05-21 [影视资讯] 《你》第五季主演是谁?最终季完整角色及演员阵容解析
- 05-21 [影视资讯] 《你》第五季结局解析:乔·戈德堡最终得到了应有的惩罚吗?
- 05-21 [影视资讯] 《最后生还者》中每个令人毛骨悚然的感染阶段详解:从跑步者到鼠王
- 05-21 [影视资讯] 《心脏骤停》大结局:第四季即将上映?为何要拍电影?
- 05-21 [影视资讯] 《夜魔侠:重生》第一季结局解析——黑暗时代开始
- 05-21 [影视资讯] 《最后生还者》第二季第二集:剧集与游戏的差异揭晓
- 05-21 [影视资讯] 《最后生还者》第二季原声带:每集歌曲解析
- 05-21 [影视资讯] 哈利·波特电视剧:上映日期、演员阵容、剧情、时间线以及我们所知道的一切
- 05-21 [影视资讯] 超人预告片终于来了:您可能会错过的隐藏细节!
取消回复欢迎 你 发表评论:
- 精品推荐!
-
- 最新文章
- 热门文章
- 热评文章
[影视] 黑道中人 Alto Knights(2025)剧情 犯罪 历史 电影
[古装剧] [七侠五义][全75集][WEB-MP4/76G][国语无字][1080P][焦恩俊经典]
[实用软件] 虚拟手机号 电话 验证码 注册
[电视剧] 安眠书店/你 第五季 You Season 5 (2025) 【全10集】
[电视剧] 棋士(2025) 4K 1080P【全22集】悬疑 犯罪 王宝强 陈明昊
[软件合集] 25年6月5日 精选软件22个
[软件合集] 25年6月4日 精选软件36个
[短剧] 2025年06月04日 精选+付费短剧推荐33部
[短剧] 2025年06月03日 精选+付费短剧推荐25部
[软件合集] 25年6月3日 精选软件44个
[剧集] [央视][笑傲江湖][2001][DVD-RMVB][高清][40集全]李亚鹏、许晴、苗乙乙
[电视剧] 欢乐颂.5部全 (2016-2024)
[电视剧] [突围] [45集全] [WEB-MP4/每集1.5GB] [国语/内嵌中文字幕] [4K-2160P] [无水印]
[影视] 【稀有资源】香港老片 艺坛照妖镜之96应召名册 (1996)
[剧集] 神经风云(2023)(完结).4K
[剧集] [BT] [TVB] [黑夜彩虹(2003)] [全21集] [粤语中字] [TV-RMVB]
[实用软件] 虚拟手机号 电话 验证码 注册
[资源] B站充电视频合集,包含多位重量级up主,全是大佬真金白银买来的~【99GB】
[影视] 内地绝版高清录像带 [mpg]
[书籍] 古今奇书禁书三教九流资料大合集 猎奇必备珍藏资源PDF版 1.14G
[电视剧] [突围] [45集全] [WEB-MP4/每集1.5GB] [国语/内嵌中文字幕] [4K-2160P] [无水印]
[剧集] [央视][笑傲江湖][2001][DVD-RMVB][高清][40集全]李亚鹏、许晴、苗乙乙
[电影] 美国队长4 4K原盘REMUX 杜比视界 内封简繁英双语字幕 49G
[电影] 死神来了(1-6)大合集!
[软件合集] 25年05月13日 精选软件16个
[精品软件] 25年05月15日 精选软件18个
[绝版资源] 南与北 第1-2季 合集 North and South (1985) /美国/豆瓣: 8.8[1080P][中文字幕]
[软件] 25年05月14日 精选软件57个
[短剧] 2025年05月14日 精选+付费短剧推荐39部
[短剧] 2025年05月15日 精选+付费短剧推荐36部
- 最新评论
-
- 热门tag