javascript drag&drop beginning

本文介绍如何使用纯JavaScript实现拖拽效果,包括获取鼠标坐标、跟踪鼠标移动及释放等关键步骤。通过实例代码展示了如何使页面元素变得可拖动。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[b]javascript drag&drop beginning[/b]
首先我不赞成自己实现拖拽功能,因为比较麻烦,
建议用当下比较流行的一些库,用什么那就看项目需要了,
但是即便用别人的东西也只至少知道原理,所以我们先看看原理吧
如果想自己手动实现拖拽,那么我们先看看都要有哪些工作要做。
1 至少要获得鼠标的坐标吧,不然还干个屁。
2 至少要获得鼠标的动作吧,不然我怎么知道什么时候拖。什么时候停
3 在页面上拖动一个目标实际上就是,改变某个标签的坐标,当然一般也要适当改变
也些样式。所以你至少要知道一些css方面的知识。

1 鼠标坐标:look:
function mouseCoords(ev){
if (ev.pageX || ev.pageY) {
return {
x: ev.pageX,
y: ev.pageY
};
}
return {
x: ev.clientX + document.body.scrollLeft - document.body.clientLeft,
y: ev.clientY + document.body.scrollTop - document.body.clientTop
};
}
唯一要解释的就是型参ev:ev实际就是windows.even:
调用这个函数:
document.onmousemove = mouseMove;
function mouseMove(ev){
ev = ev || window.event;
var mousePos = mouseCoords(ev);
} // mousePos.x就是横坐标,mousePos.y就是纵坐标
好了,就到这吧。
2 复习一下doument下面的都鼠标动作吧(当然只列出我们用的到的)
onmousedown:当焦点停留在当前元素上并且按下鼠标键时触发
onmousemove:当光标在当前元素上并且光标在当前元素上面移动时触发
onmouseout:当光标移出某个元素时触发
onmouseover:当贯标移动到某个元素上面时触发
onmouseup:当焦点在当前元素上并松开鼠标键时触发
下一步:搞清楚流程:
拖拽的流程:
捕获鼠标按下动作,之后判断鼠标按下所在的坐标是不是你想要的DOM对象,
如果是那么让这个对象的坐标跟着鼠标移动而改变,直到鼠标松开(onmouseup)。
根据这个流程,我们第一步要先把我们想要移动的DOM对象
记录下拉,而且我们必须把这个对象的style position
设置为absolute。
//定义监听函数
document.onmousemove = mouseMove;
document.onmouseup = mouseUp;
//存放我们想要拖动的DOM对象
var dragObject = null;
var mouseOffset = null;
function mouseMove(ev){
ev = ev || window.event;
//这里用到了上面第一点写的函数(mouseCoords)
var mousePos = mouseCoords(ev);

if(dragObject){
dragObject.style.position = 'absolute';
dragObject.style.top = mousePos.y;
dragObject.style.left = mousePos.x;

return false;
}
}
function mouseUp(){
dragObject = null;
}

function makeDraggable(item){
if(!item) return;
item.onmousedown = function(ev){
dragObject = this;
mouseOffset = getMouseOffset(this, ev);
return false;
}
}
这段代码的意思就是告诉浏览器页面上的哪些元素可以被拖动。
然后如果捕获的元素是允许被拖动的(即鼠标所在的区域
是这个元素的范围内),那么这个元素的坐标就
随着鼠标变化,直到鼠标弹起。
那么为了让鼠标知道哪些元素可以被拖动,我们需要制作
一个容器,盛放这些元素,并且写一个注册函数,把可以拖动
的元素注册到容器中:

var dropTargets = [];

function addDropTarget(dropTarget){
dropTargets.push(dropTarget);
}

function mouseUp(ev){
ev = ev || window.event;
var mousePos = mouseCoords(ev);

for(var i=0; i<dropTargets.length; i++){
var curTarget = dropTargets[i];
var targPos = getPosition(curTarget);
var targWidth = parseInt(curTarget.offsetWidth);
var targHeight = parseInt(curTarget.offsetHeight);

if(
(mousePos.x > targPos.x) &&
(mousePos.x < (targPos.x + targWidth)) &&
(mousePos.y > targPos.y) &&
(mousePos.y < (targPos.y + targHeight))){
// dragObject was dropped onto curTarget!
}
}
dragObject = null;
}
所以如果你使用javascript lib,那么如果给某个元素增加拖动
属性,那么一般都可以捕获到 up 和 down事件,并可以在这些
事件中增加自己的动作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值