`
wangxin0072000
  • 浏览: 87687 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

javascript drag&drop beginning

阅读更多
javascript drag&drop beginning
首先我不赞成自己实现拖拽功能,因为比较麻烦,
建议用当下比较流行的一些库,用什么那就看项目需要了,
但是即便用别人的东西也只至少知道原理,所以我们先看看原理吧
如果想自己手动实现拖拽,那么我们先看看都要有哪些工作要做。
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事件,并可以在这些
事件中增加自己的动作。

分享到:
评论
1 楼 kingjzd 2008-09-10  
MS LZ没写完 挺好的帖子

相关推荐

    深度VMware6.0完美精简汉化版+Drag&Drop_FixPatch

    【深度VMware6.0完美精简汉化版+Drag&Drop_FixPatch】是一款针对VMware Workstation 6.0的专业优化版本,它结合了深度定制和汉化,为用户提供更加符合中文用户习惯的操作界面。VMware Workstation是一款强大的虚拟机...

    VMware6.0深度完美汉化版+vmtools+Drag&Drop_FixPatch(1)

    而且我已经把windows和linux的vmtools包,以及解决拖拽的问题脚本Drag&Drop_FixPatch一并加入进来,欢迎大家下载使用。 注意:因为大小问题,我分为两卷: VMware6.0深度完美汉化版+vmtools+Drag&Drop_FixPatch(1) ...

    Drag&Drop VCL for Delphi

    《Delphi中的Drag&Drop VCL技术详解》 在Delphi编程环境中,实现Windows应用程序的交互性和用户友好性,往往离不开“拖放”(Drag & Drop)功能的支持。Drag&Drop VCL是针对这一需求而设计的一套组件库,它基于...

    使用Drag&Drop接受文件名的输入框(13KB)

    "使用Drag&Drop接受文件名的输入框"是一种创新的交互方式,它允许用户通过简单的拖放操作来输入文件路径或文件名,提高了用户体验和工作效率。这种功能在多种应用中都非常实用,比如文件管理器、编辑器或者上传服务...

    VMware6.0深度完美汉化版+vmtools+Drag&Drop_FixPatch(2)

    而且我已经把windows和linux的vmtools包,以及解决拖拽的问题脚本Drag&Drop_FixPatch一并加入进来,欢迎大家下载使用。 注意:因为大小问题,我分为两卷: VMware6.0深度完美汉化版+vmtools+Drag&Drop_FixPatch(1) ...

    HTML5实践Drag&Drop

    HTML5实践Drag&Drop HTML5作为现代网页开发的标准,引入了许多新的特性和API,其中一项就是拖放(Drag&Drop)功能。这项技术允许用户通过鼠标或触控设备将元素从一个位置拖动到另一个位置,极大地提升了用户体验。...

    Blender插件-多格式文件拖拽导入插件 Drag & Drop Import V1

    Optimize your workflow with Drag and Drop Import for Blender. Quickly and easily import files by dragging them from your file explorer and dropping them into Blender’s 3D Viewport or Outliner. No ...

    一个很不错的drag & drop

    标题中的“一个很不错的drag & drop”指的是使用拖放(Drag & Drop)技术的一个应用程序或功能,这在网页设计和开发中非常常见。拖放功能允许用户通过鼠标将元素从一处拖到另一处,实现数据的移动、拷贝或者进行其他...

    eclipse rcp drag&drop

    5. **Drag and Drop Operations**: 拖放操作有多种类型,如`DND.DROP_COPY`(复制)、`DND.DROP_MOVE`(移动)和`DND.DROP_DEFAULT`(默认)。在`DragSourceAdapter`和`DropTargetAdapter`中,你可以根据需要重写...

    WPF Drag&Drop

    在Windows Presentation Foundation (WPF) 中,拖放(Drag&Drop)功能是一种常见的用户交互方式,允许用户通过鼠标操作将项目从一个位置移动到另一个位置。在这个特定的场景中,"WPF Drag&Drop"指的是在两个DataGrid...

    Drag & Drop in Javascript.zip

    JavaScript中的拖放(Drag & Drop)功能是一种交互式技术,允许用户通过鼠标操作将元素从一个位置拖动到另一个位置,常用于文件管理、界面构建和游戏开发等场景。在这个"Drag & Drop in JavaScript"项目中,我们可能...

    Drag & drop source code android

    在Android开发中,拖放(Drag & Drop)功能是一种用户友好的交互方式,允许用户通过手势将一个元素从一处移动到另一处。本资源提供的"Drag & Drop source code android"包含了一个实现Android拖放功能的源代码示例,...

    Window下拖放操作Drag & Drop 全解析

    Window 下拖放操作 Drag & Drop 全解析 Windows 操作系统中拖放操作(Drag & Drop)是一种常用的用户交互方式,允许用户在不同的程序窗口之间、同一个程序的不同窗口之间或同一程序同一窗口的不同控件之间进行移动...

    Drag & Drop Files to Delete.zip

    标题“Drag & Drop Files to Delete.zip”提示我们这是一个与JavaScript相关的项目,可能涉及到文件操作,特别是拖放(Drag & Drop)功能,用于删除文件。在Web开发中,这种功能允许用户通过简单的拖放操作来处理...

    Drag & Drop Modules

    "Drag & Drop Modules" 是一个关于使用拖放功能在JavaScript虚拟机2(JSVM2)中构建模块化应用的示例。这个主题涉及到前端开发中的交互设计和模块化编程两个重要概念。 首先,让我们深入了解“Drag & Drop”技术。...

    【类库与框架】★★★★★-DragKit - an iOS framework for enabling drag & drop

    【类库与框架】★★★★★-DragKit - an iOS framework for enabling drag & drop【类库与框架】★★★★★-DragKit - an iOS framework for enabling drag & drop 1.适合学生学习研究参考 2.适合个人学习研究参考 3...

    Drag&drop.zip

    在我们的例子中,“Drag&drop.zip”项目包含了一个测试示例,展示了如何在两个列表框(QListWidget)之间进行拖放操作。 在Qt 5.6中,启用拖放功能通常需要以下步骤: 1. **启用拖放功能**:对于每个列表框,需要...

    WPF listbox之间拖动 drag&drop

    本教程将详细讲解如何在两个`ListBox`之间实现拖放(Drag & Drop)功能,以及如何添加上下按钮来控制`ListBox`内部元素的移动,并在拖动时改变边框颜色,提升用户体验。 首先,我们要了解`ListBox`的基本用法。`...

    VMware拖放剪贴板支持组件

    【Drag&Drop_FixPatch.exe】很可能是这个补丁程序的执行文件,它的主要任务就是为VMware添加拖放支持。当用户安装并运行这个补丁后,应该能够在虚拟机和宿主机之间自由地拖放文件,无需再通过繁琐的复制粘贴或者借助...

Global site tag (gtag.js) - Google Analytics