博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JavaScript中随着鼠标拖拽而移动的块
阅读量:5274 次
发布时间:2019-06-14

本文共 2308 字,大约阅读时间需要 7 分钟。

这里要设置一个div块,你按住它拖拽,它会随着你的鼠标走,比如常见的登录框。

给这个div设置简单的样式:

由于div是要跟着鼠标活动的,所以必须把position设置为绝对定位,也就是位置可以改变才行:

<style type="text/css">

#div1{width: 100px; height: 100px; background: red; position: absolute;}
</style>

HTML部分:

<body>

<div id="div1">被拖拽的块</div>
</body>

 

对这个div进行操作:

由于按下鼠标点在div的那一刻,它里面的某一点的位置与div的距离就是恒定的,才能拖拽。所以,我们可以先求出这个点距离div的两边的距离disX和disY。

var disX=0;//鼠标距离div的边的横向距离

var disY=0;//鼠标距离div的边的纵向距离

div移动后:

div的位置变成了鼠标点的位置与点距离div的边距的差值

也就是left为oEvent.clientX-disX,

top为oEvent.clientY-disY;

设置变量存储div的坐标:

var l=oEvent.clientX-disX;//div的左坐标

var t=oEvent.clientY-disY;//右坐标

 

当鼠标要把这个div拖拽出可视区之时,我们要阻止:

 

左侧要拖拽出去时,也就是div的左边距要<0了,设置这左边距为0,就不能跑出左侧了。

上边要出去时,也就是div的top要<0了,设置这上边距为0,就不能跑出上侧了。

右侧要出去时,也就是div的左边距要大于可视区的宽度与div宽度的差了,那设置两者相等,就无法超出范围了;超出下端也是同理。

//div要拖出可视区左侧时:

if(l<0)
{
l=0;
}
//div要拖出可视区右侧时:
//document.documentElement.clientWidth 可视区的宽度
else if(l>document.documentElement.clientWidth-oDiv.offsetWidth)
{
l=document.documentElement.clientWidth-oDiv.offsetWidth;
}
//div要拖出可视区上边时:
if(t<0)
{
t=0;
}
//div要拖出可视区下边时:
if(t>document.documentElement.clientHeight-oDiv.offsetHeight)
{
t=document.documentElement.clientHeight-oDiv.offsetHeight;
}

最终得到div的位置:

oDiv.style.left=l+'px';

oDiv.style.top=t+'px';

当鼠标松开的时候,div不再跟着跑,也就是设置onmousemove没有了,才可以。

整个程序如下:

<script type="text/javascript">

window.οnlοad=function(){
  var oDiv=document.getElementById('div1');//获取这个div
  var disX=0;//鼠标距离div的边的横向距离
  var disY=0;//鼠标距离div的边的纵向距离
oDiv.οnmοusedοwn=function(ev)
{
  var oEvent=ev||event;
  disX=oEvent.clientX-oDiv.offsetLeft;
  disY=oEvent.clientY-oDiv.offsetTop;
document.οnmοusemοve=function(ev)
{
var oEvent=ev||event;
var l=oEvent.clientX-disX;//div的左坐标
var t=oEvent.clientY-disY;//右坐标
//div要拖出可视区左侧时:
if(l<0)
{
l=0;
}
//div要拖出可视区右侧时:
//document.documentElement.clientWidth 可视区的宽度
else if(l>document.documentElement.clientWidth-oDiv.offsetWidth)
{
l=document.documentElement.clientWidth-oDiv.offsetWidth;
}
//div要拖出可视区上边时:
if(t<0)
{
t=0;
}
//div要拖出可视区下边时:
if(t>document.documentElement.clientHeight-oDiv.offsetHeight)
{
t=document.documentElement.clientHeight-oDiv.offsetHeight;
}
oDiv.style.left=l+'px';
oDiv.style.top=t+'px';
};
document.οnmοuseup=function()
{
document.οnmοusemοve=null;
document.οnmοuseup=null;
}
return false;//阻止默认事件 
};
};
</script>

转载于:https://www.cnblogs.com/believerp/p/6875344.html

你可能感兴趣的文章
【雷电】源代码分析(二)-- 进入游戏攻击
查看>>
Linux中防火墙centos
查看>>
如何设置映射网络驱动器的具体步骤和方法
查看>>
centos下同时启动多个tomcat
查看>>
Leetcode Balanced Binary Tree
查看>>
[JS]递归对象或数组
查看>>
linux sed命令
查看>>
湖南多校对抗赛(2015.03.28) H SG Value
查看>>
hdu1255扫描线计算覆盖两次面积
查看>>
hdu1565 用搜索代替枚举找可能状态或者轮廓线解(较优),参考poj2411
查看>>
程序存储问题
查看>>
优雅地书写回调——Promise
查看>>
AX 2009 Grid控件下多选行
查看>>
PHP的配置
查看>>
Struts框架----进度1
查看>>
Round B APAC Test 2017
查看>>
MySQL 字符编码问题详细解释
查看>>
Windows 2003全面优化
查看>>
格而知之2:UIView的autoresizingMask属性探究
查看>>
我的Hook学习笔记
查看>>