`
fqmly520
  • 浏览: 65042 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

如何在 JavaScript 中实现拖放(中)

阅读更多
上一篇文章 介绍了移动页面元素所涉及到的捕获鼠标移动和鼠标点击的相关问题,本段文章将介绍如何移动和放置页面元素。

    移动元素

    我们现在已经知道如何捕获鼠标移动和点击。接下来需要做的就是移动任何我们想拖动的元素。首先,将一个元素准确移动到页面上我们想要的位置,该元素样式表的position值必须为absolute,这意味着你可以设置它的style.top或style.left,测量值相对于页面的左上角,因为我们所有的鼠标移动都是相对于页面左上角的,通常都是这样。

    一旦我们设置了item.style.position='absolute',接下来就需要改变该元素top和left的位置,使它移动!

document.onmousemove  =  mouseMove;
document.onmouseup   
=  mouseUp;

var  dragObject   =   null ;
var  mouseOffset  =   null ;

function  getMouseOffset(target, ev)  {
  ev 
=  ev  ||  window.event;

  
var  docPos  =  getPosition(target);
  
var  mousePos  =  mouseCoords(ev);

   
return   {x:mousePos.x  -  docPos.x, y:mousePos.y  -  docPos.y} ;
}


function  getPosition(e)  {
  
var  left  =   0 ;
  
var  top   =   0 ;

  
while  (e.offsetParent) {
    left 
+=  e.offsetLeft;
    top 
+=  e.offsetTop;
    e 
=  e.offsetParent;
  }


  left 
+=  e.offsetLeft;
  top 
+=  e.offsetTop;

  
return   {x:left, y:top} ;
}


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

  
if  (dragObject)  {
    dragObject.style.position 
=  'absolute';
    dragObject.style.top 
=  mousePos.y  -  mouseOffset.y;
    dragObject.style.left 
=  mousePos.x  -  mouseOffset.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 ;
  }

}

    你会注意到这些代码是以我们前面的例子为基础的(参考上篇文章),将它们放置在一起,你将能够随意的去移动元素。

    当我们点击一个元素时,存储了另外的一个变量,mouseOffset。mouseOffset简单的包含了我们点击元素的位置信息。如果我们有一张20*20px的图像,然后点击图像的中间,mouseOffset应该是{x:10, y:10}。如果我们点击图像的左上角,mouseOffset应为{x:0, y:0}。我们在鼠标移动后的位置信息中用到它。如果我们没有存储这个值,不论你点击元素的哪一个位置,元素相对于鼠标的位置都将会是相同的。

    mouseOffset函数用到了另外一个函数getPosition。getPosition目的是返回元素相对于documemt文档的坐标位置。如果我们简单的去读取item.offsetLeft或item.style.left,得到的将是元素相对于它父元素的位置,而不是document文档的。在我们的脚本中,所有的元素都是相对于document文档的,因此需要这样做。

    要完成获取元素相对于document文档位置的工作,getPosition从它自身的父级开始,循环获取它的left和top的值并累加,这样我们就得到了我们想要的元素距文档顶部和左侧的累计值。

    当我们获取了这条信息并移动鼠标的时候,mouseMove开始运行。首先我们需要保证item.style.position值为absolute,接着,我们将元素移动到任何一个地方,鼠标位置都会减去我们之前记录的鼠标相对于元素的偏移量。当鼠标释放时,dragObject将被设置为null,并且mouseMove函数不再做任何事情。

    放置元素

    我们前面的例子已经处理了这个问题,仅仅是拖动一个元素,然后将它放下。然后,在我们放下元素的时候通常还有其他的目的,我们以拖动元素到垃圾回收站为例,或我们可能想让该元素和页面中某个特定的区域对齐。

    不幸的是我们在这里进入了一个相对主要的问题。因为我们正在移动的元素总是直接处于我们的鼠标下,而不可能去引发mouseover、mousedown、mouseup或鼠标对页面中其他元素的操作。如果你移动一个元素到垃圾回收站,你的鼠标会一直在移动元素的上方,而不是垃圾回收站。

    那么我们该如何处理这个问题呢?这里有几种解决方案。在前面所提到的mouseOffset的目的是保证元素总是在鼠标下方正确的位置,如果你忽视了这点,然后总是使得元素在鼠标的右下方,你的鼠标将不会被你正在拖动的元素所隐藏,我们也不会碰到问题。但事实上往往不会这样,为了美观我们通常要保持元素在鼠标的下方。

    另外一种选择是不移动你正在拖动的元素,你可以改变鼠标样式,来告诉使用者你正在拖动一个元素,直到你将它放置到某个地方。这解决了我们的问题,但是带来了和前面一种方案面临的同样问题:美观。

    我们最后的一种解决方案既不影响你正在移动的元素,也不影响移动终点位置上的元素(例如垃圾回收站)。不幸的是,这比前面两种解决方案的难度更大。我们将要做的是获得一组我们要放置的目标,当鼠标释放时,我们手工检查当前鼠标相对于每个目标的位置,看鼠标是否释放在这个目标中某一个目标的位置上,如果是的,我们就知道我们已经将元素放置在我们的目标上了。

/**/ /*
All code from the previous example is needed with the exception
of the mouseUp function which is replaced below
*/


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 ;
}

    这个例子中当鼠标释放时,我们循环每个可能放置元素的目标,如果鼠标指针在目标上,我们则拥有了一个放置元素的事件,通过鼠标横坐标大于目标元素左侧横坐标(mousePos.x>targPos.x),小于目标元素右侧横坐标(mousePos.x<(targPos.x+targWidth))来判定,对于Y坐标我们做同样的判断。如果所有的这些值都返回true,那么我们的鼠标就是在目标元素的范围内。

分享到:
评论

相关推荐

    掌握 JavaScript 中的拖放(Drag and Drop)API:实现动态交互

    通过本文的介绍,你应该能够理解拖放API的基本概念,掌握在JavaScript中实现拖放功能的方法,并能够在实际项目中应用这一API来实现动态交互。这将有助于你构建更加动态和交互式的Web应用,为用户提供更加丰富的体验...

    两款JAVASCRIPT拖拽(拖放)

    在本文中,我们将探讨拖放的基本原理以及如何使用JavaScript实现这一功能。 首先,拖放功能的核心在于浏览器提供的`HTML5 Drag and Drop API`,它允许开发者定义拖动源(drag source)、放置目标(drop target)...

    HTML5中实现拖放效果无须借助javascript.docx

    通过以上介绍可以看出,在HTML5中实现拖放效果无需编写额外的JavaScript代码。仅通过简单的HTML标记和CSS样式即可完成基本的拖放功能。这种方式不仅简化了开发流程,而且提升了页面性能。不过需要注意的是,虽然...

    MooTools 1.2中的Drag.Move来实现拖放

    在MooTools 1.2中,`Drag.Move`是用于实现拖放功能的一个强大类,它扩展了基础的`Drag`类,使得元素不仅能够被拖动,还能在特定的可接受元素(droppables)之间进行移动。 `Drag.Move`的基本用法涉及创建一个新的...

    javascript 拖放实现的要点

    这个API使得在浏览器环境中实现拖放功能变得更加简单和标准化。它提供了`dragstart`、`drag`、`dragenter`、`dragover`、`dragleave`、`drop`和`dragend`等一系列事件,帮助开发者监听和处理拖放过程的各个阶段。 1...

    asp.net 实现拖放操作

    下面将详细探讨如何在ASP.NET中实现拖放操作。 首先,了解HTML5的拖放API是关键。HTML5引入了`draggable`属性,使得任何HTML元素都可以被拖动。同时,通过监听`dragstart`、`drag`、`dragend`等事件,可以实现拖动...

    javascript 拖放效果实现代码

    在你的网页上实现拖放的效果并不是很复杂。首先,我们知道鼠标的位置,然后我们需要了解用户什么时候点击一个元素,以至于我们知道要准备开始拖动它,最后我们要移动这个元素。 捕获鼠标的移动 第一步,我们需要...

    javascript 拖放效果实现代码.docx

    以下将详细讲解如何利用JavaScript实现拖放效果的关键步骤和涉及的技术。 首先,理解拖放的基本流程至关重要。拖放操作通常包括以下几个阶段: 1. **监听鼠标按下(mousedown)**:当用户点击可拖动元素时,我们...

    Javascript拖放框架

    在本压缩包文件中,我们可能找到了一个简易而灵活的JavaScript拖放框架的源代码或者相关文档,这将有助于我们理解并快速实现拖放功能。 拖放功能的核心在于以下几点关键技术: 1. **数据Transfer对象**:在拖放...

    【JavaScript源代码】如何利用vue.js实现拖放功能.docx

    在Vue.js中实现拖放功能,首先我们需要配置项目数据。创建一个包含项目的`items`数组,每个项目都有唯一的`id`、显示文本`title`以及所属的列表`list`。例如: ```javascript data() { return { items: [ { id: ...

    实现拖放上传图片文件

    HTML5引入了拖放功能,使得在浏览器中实现拖放操作变得可能。主要涉及的事件包括`dragstart`、`dragenter`、`dragover`、`dragleave`、`drop`和`dragend`。在`index.html`文件中,我们需要创建一个可拖放区域,通常...

    可以实现拖放的JS代码

    在这个"可以实现拖放的JS代码"中,我们将探讨如何使用纯JavaScript实现拖放功能。 首先,我们需要了解HTML5引入的拖放API。这个API提供了一系列的事件和接口,使得在网页上实现拖放操作变得相对简单。关键的事件...

    dragsvg 实现拖放、拉伸

    在`dragsvg.html`中,开发者可能使用了原生JavaScript或者SVG事件监听器来实现拖放功能。SVG元素拥有`dragstart`、`drag`和`dragend`等事件,通过绑定这些事件处理函数,可以控制SVG图形在用户的鼠标操作下移动。...

    javascript实现拖放效果

    在Web开发中,使用JavaScript实现拖放效果可以增加页面的交互性,改善用户体验。本文将详细介绍使用JavaScript实现拖放效果的核心知识点和基本原理。 首先,要实现拖放功能,需要使用到几个关键的DOM事件:...

    JavaScript_拖放太简单了,很伤人.zip

    "JavaScript_拖放太简单了,很伤人.zip"这个文件名暗示了一个关于JavaScript实现拖放功能的教程或者示例代码库,可能是作者在尝试或教学过程中发现其比预期的更易上手,从而产生了“伤人”的趣味说法。 拖放功能在...

    JS实现拖放效果,dataTransfer对象实现拖放效果

    dataTransfer对象用于从被拖动元素向放置目标传递字符串数据。因为这个对象是 event 的属性,所以在拖放事件的事件处理程序外部无法访问 data...在事件处理程序内部,可以使用这个对象的属性和方法实现拖放功能。

    全尺寸拖放式JavaScript活动日历

    `lib`目录通常存放项目的核心代码库,包括实现拖放日历功能的JavaScript文件和其他必要的库。`examples`目录可能包含一些演示示例,展示如何在实际项目中使用这个日历组件。 开发和调试过程中,开发者可以参考`...

    js 实现div区域拖放

    javascript 实现div区域拖放

    JavaScript实现的多种鼠标拖放效果

    本文实例将介绍如何使用纯JavaScript实现多种拖放效果,包括触发对象、设置范围限制、指定容器大小以及水平和垂直锁定等。 首先,我们需要了解一下JavaScript中的事件处理。在示例代码中,`addEventHandler` 和 `...

Global site tag (gtag.js) - Google Analytics