jquery实现拖动效果

jquery实现拖动效果,第1张

因为想实现相框的拖到,找了半天的原因愣是没有找到错误,所以,只能翻看源码了

如何实现拖动效果?

首先分析下拖动效果原理:

1.当鼠标在被拖动对象上按下鼠标(触发onmousedown事件,且鼠标在对象上方)

2.开始移动鼠标(触发onmousemove事件)

3.移动时更显对象的top和left值

4.鼠标放开停止拖动(触发onmouseup事件)

注意:拖动的对象必须是定位对象(即设置了position:absolute或

relative)。

也就是说拖动事件=onmousedown事件+onmousemove事件

整个过程就是处理这三个事件来模拟drag事件

现在看看我实现的源代码:

html代码:

<div

class="drag">

<p

class="title">标题(点击标题拖动)</p>

</div>

<div

class="drag1">

<p

class="title">标题</p>

点击我移动

</div>

jquery插件代码:

(function($){

$.fn.drag=function(options){

//默认配置

var

defaults

=

{

handler:false,

opacity:0.5

}

//

覆盖默认配置

var

opts

=

$.extend(defaults,

options)

this.each(function(){

//初始标记变量

var

isMove=false,

//handler如果没有设置任何值,则默认为移动对象本身,否则为所设置的handler值

handler=opts.handler?$(this).find(opts.handler):$(this),

_this=$(this),

//移动的对象

dx,dy

$(document)

//移动鼠标,改变对象位置

.mousemove(function(event){

//

console.log(isMove)

if(isMove){

//获得鼠标移动后位置

var

eX=event.pageX,eY=event.pageY

//更新对象坐标

_this.css({'left':eX-dx,'top':eY-dy})

}

})

//当放开鼠标,停止拖动

.mouseup(function(){

isMove=false

_this.fadeTo('fast',

1)

//console.log(isMove)

})

handler

//当按下鼠标,设置标记变量isMouseDown为true

.mousedown(function(event){

//判断最后触发事件的对象是否是handler

if($(event.target).is(handler)){

isMove=true

$(this).css('cursor','move')

//console.log(isMove)

_this.fadeTo('fast',

opts.opacity)

//鼠标相对于移动对象的坐标

dx=event.pageX-parseInt(_this.css("left"))

dy=event.pageY-parseInt(_this.css("top"))

}

})

})

}

})(jQuery)

调用方法:

$(function(){

//拖动标题

$(".drag").drag({

handler:$('.title'),// *** 作拖动的对象,此对象必须是移动对象的子元素

opacity:0.7

//设置拖动时透明度

})

//拖动主体对象

$(".drag1").drag({

opacity:0.7

})

})

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

主要功能需求说明:

1.左侧的元素结构最后会通过Ajax call服务器的数据来生成,能支持多级元素。父节点可以折叠起来

2.用户可以通过拖放的 *** 作,将元素从左侧拖放到右侧。如果是拖的父节点元素,那么需要把它子节点的元素一并拖到右边

3.元素放到右侧,右侧可以接受元素的区域有2种可能。一种新建一个区域,就类似“华东交通大学”所示。另外一种就是拖放到已经有元素的区域。两者的关系是“或”。单个元素区域有“非”和“且”的关系。点击右边删除按钮可以删除节点元素。

第一步:左侧元素可以拖

官方给出的实例是直接在要拖动的元素上添加class="ui-widget-

content"。最初我是在所有要拖动的元素都添加了“ui-widget-content”类别。但是测试拖动结果,发现元素只能在它所在的

container里面拖动,再往右拖动,div会出现水平或垂直滚动条。不知道是不是自己在参数设置上不对。container设置了

overflow:auto。

效果如下图所示:

为最终的左侧元素节点是通过Ajax访问后台返回json数据,然后通过Javascript动态生成这种结构,而已不能为动态生成的元素绑定drag事

件,也就不能调用draggable方法,所以我使用了一个称之“中间拖拽容易元素”,这div一直在页面上。只是默认不显示,只要用户开始拖拽左侧的元

素时,它就出现了。当然这里需要自己手动添加很多代码。

复制代码 代码如下:

<div id='draggableDiv' class="ui-widget-content">

中间拖拽容器元素

</div>

<script type="text/javascript">

$("#draggableDiv").draggable({

containment: "parent",

drag: function (event, ui) { console.log("拖拽中")},

stop: function () { console.log("拖拽结束")}

})

</script>

第二步:将

要拖的元素内容复制到draggableDiv上。实现拖动父节点时,其下面的子节点元素也要拖放到右边。如果是拖动的子节点元素,就在右边直接显示子节

点元素。父节点和子节点是相对的,因为左侧树形结构的节点可以是无限级的,所以一个元素既可能是子节点元素,也会是父节点元素。通过监听鼠标的

mousedown和mouseup事件,来判断用户在拖动元素。这步的原理如下图所示:

用户拖动B节点时,首先把B元素上的内容复制给draggableDiv元素,当用户拖动B元素,其实是拖动draggableDiv元素。所以我们要计

算出我们点击的B元素的位置,然后让draggableDiv在拖动时候显示正确的位置,然后拖动就是draggableDiv元素,用户看起来是拖动的

B节点元素。

复制代码 代码如下:

var clickElement = null$(".threepanels .ptreelist").bind("mousedown",function (event) {

//获取当前mousedown元素的内容

var itemContent = $(this).html()var draggableDiv = $("#draggableDiv")

$(draggableDiv).css({ "display": "block", "height": 0 })

//将点击的元素内容复制

clickElement = $(this).clone()

var

currentdiv = $(this).offset()$(draggableDiv).css({ "top":

currentdiv.top, "left": currentdiv.left })draggableDiv.trigger(event)

//取消默认行为 return false})

$("#draggableDiv").mouseup(function (event) { $(this).css({ "height": "0" })})

//拖动元素时鼠标的位置

var dragDivLeft = 0

var dragDivTop = 0

$("#draggableDiv").draggable({

containment: "parent", drag: function (event, ui) {

$("#draggableDiv").css({ "width": "260px", "height": "22px" })

$("#draggableDiv").append(clickElement)

var closeTop = $(".closeBar").offset().top

dragDivLeft = event.target.offsetLeft

dragDivTop = event.target.offsetTop},

stop: function () {

//拖拽结束,将拖拽容器内容清空

$("#draggableDiv").html("")

$("#draggableDiv").css({"height":"0"})}

})

第三步:右边的元素可以放到指定的位置上

需要将元素拖到指定的区域里面,然后释放 *** 作。完成“放”的 *** 作。可以从上图看出,我是将元素的上边左边和下边缘的左边存到一个数组里面。然后在“拖”的过程中,一直记录了拖动的左边,放到右侧时,就可以判断当前元素将要放的位置。具体可以下载代码查看。

jquery的拖动函数有个参数控制这个,有很多活动范围可选择,如下:

1.containment:

[类型]选择器, 元素, 字符串, 数组.

选择器: 只能在选择器约束的元素内拖动

元素: 只能在给定的元素内拖动

2.字符串:

parent: 只能在父容器内拖动

document: 在当前html文档的document下可拖动, 超出浏览器窗口范围时, 自动出现滚动条

widow: 只能在当前浏览器窗口的内容区域拖动, 拖动超出当前窗口范围, 不会导致出现滚动条...

3.数组: [x1, y1, x2, y2]以[开始水平坐标, 开始垂直坐标, 结束水平坐标, 结束垂直坐标]的方式划定一个区域, 只能在此区域内拖动. 这种方式指定时, 值是相对当前浏览器窗口内容区域左上角的偏移值.

false: 不限制拖动的活动范围

[默认值]false

[产生影响]

影响指定可拖动控件的活动区域.

[代码示例]

[初始化]

$('.selector').draggable({ containment: 'parent' })

[获取属性值]

var containment = $('.selector').draggable('option', 'containment')

[设置属性值]

$('.selector').draggable('option', 'containment', 'parent')


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11606473.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-17
下一篇 2023-05-17

发表评论

登录后才能评论

评论列表(0条)

保存