个人主页:《爱蹦跶的大A阿》
当前正在更新专栏:《VUE》、《JavaScript保姆级教程》、《krpano》、《krpano中文文档》
✨ 前言
拖放是现代界面不可或缺的交互方式之一。本文将介绍如何用JavaScript来实现元素的拖放功能。
我们首先需要准备拖放事件,之后跟踪拖动过程中鼠标位置,计算元素的新坐标。我们也可以实现拖放目标,在元素ENTER和LEAVE 时做出响应。最后,可以在放置时传递数据。
掌握拖放接口不仅可以优化交互,也可以大展创意,制作游戏等应用。让我们开始学习拖放之旅吧!
✨ 正文
本文介绍 JavaScript 实现元素的拖放功能。
开始拖放
用于启动拖动的事件是 ondragstart
:
ball.ondragstart = function() {return false; // 允许拖放};
我们还需要 ondrag
事件来实现拖放过程中元素的移动。
在拖动过程中
ball.ondrag = function(event) { // 移动 ball 到新的坐标 ball.style.left = event.clientX + 'px'; ball.style.top = event.clientY + 'px'; };
通过事件对象的 clientX/clientY 属性获取鼠标坐标来移动被拖动元素。
实现目标放置
当拖动的元素进入目标元素时候,会触发目标元素的 ondragenter
事件:
target.ondragenter = function(event) {// 高亮目标元素 (change bg color)event.target.style.background = 'pink';};
当拖动退出目标元素时,ondragleave
事件被触发。
最后元素松开鼠标时,会触发 ondrop
事件来执行放置操作。
数据传递
可以使用 event.dataTransfer
对象在拖动源(source)和放置目标(target)之间传递数据:
// 拖动源ball.ondragstart = function(event) {event.dataTransfer.setData('text', 'ball data'); };// 放置目标field.ondrop = function(event) {let data = event.dataTransfer.getData('text');// Do something with the data};
修正定位
在元素拖动代码示例中,球在移动时,球的中心始终位于鼠标指针下方:
ball.style.left = pageX - ball.offsetWidth / 2 + 'px';ball.style.top = pageY - ball.offsetHeight / 2 + 'px';
不错,但这存在副作用。要启动拖放,我们可以在球上的任意位置mousedown
。但是,如果从球的边缘“抓住”球,那么球会突然“跳转”以使球的中心位于鼠标指针下方。
如果我们能够保持元素相对于鼠标指针的初始偏移,那就更好了。
例如,我们按住球的边缘处开始拖动,那么在拖动时,鼠标指针应该保持在一开始所按住的边缘位置上。
让我们更新一下我们的算法:
当访问者按下按钮(
mousedown
)时 —— 我们可以在变量shiftX/shiftY
中记住鼠标指针到球左上角的距离。我们应该在拖动时保持这个距离。我们可以通过坐标相减来获取这个偏移:
// onmousedownlet shiftX = event.clientX - ball.getBoundingClientRect().left;let shiftY = event.clientY - ball.getBoundingClientRect().top;
然后,在拖动球时,我们将鼠标指针相对于球的这个偏移也考虑在内,像这样:
// onmousemove// 球具有 position: absoluteball.style.left = event.pageX - shiftX + 'px';ball.style.top = event.pageY - shiftY + 'px';
能够更好地进行定位的最终代码:
ball.onmousedown = function(event) {let shiftX = event.clientX - ball.getBoundingClientRect().left;let shiftY = event.clientY - ball.getBoundingClientRect().top;ball.style.position = 'absolute';ball.style.zIndex = 1000;document.body.append(ball);moveAt(event.pageX, event.pageY);// 移动现在位于坐标 (pageX, pageY) 上的球// 将初始的偏移考虑在内function moveAt(pageX, pageY) {ball.style.left = pageX - shiftX + 'px';ball.style.top = pageY - shiftY + 'px';}function onMouseMove(event) {moveAt(event.pageX, event.pageY);}// 在 mousemove 事件上移动球document.addEventListener('mousemove', onMouseMove);// 放下球,并移除不需要的处理程序ball.onmouseup = function() {document.removeEventListener('mousemove', onMouseMove);ball.onmouseup = null;};};ball.ondragstart = function() {return false;};
以上介绍了拖放功能从准备到完成的完整流程。希望对大家实现拖放有帮助!
✨ 结语
拖放是一项强大的功能,可以优化交互,增强用户体验。本文详细介绍了拖放在 JavaScript 中的实现,涵盖初始化、跟踪拖放过程、访问数据等完整功能。
希望这篇博客可以帮助大家深入理解拖放接口,并能应用到实际项目中。如果在学习或运用中有任何问题,欢迎在评论区与我讨论。