simpleDrag的第一个版本(simpleUI子项目)
时间:2011-04-27 来源:前端开发(xing)
这些天,因为项目完工的原因,难得休息几天,就趁着这些日子多写点东西。让自己可以更快的成长。
本来以为拖动是件很简单的事情,但是仔细考虑起来还是挺麻烦的~~
使用库编程的最大好处就是不用考虑那么多复杂的兼容性问题~
初始版本的simpleDrag支持以下几个功能
1:基本的拖动
2:在制定范围内的拖动
3:拖动代理
4:拖动触发的handle
5:iframeFix
拖动无非就是触发三个事件~mousedown,mousemove,mouseup。在鼠标按下的时候记住当前位置,移动的过程中更新代理或者对象本身的位置,弹起的时候更新对象的位置,解除为document绑定的事件就行了,是不是很简单?下面开始编码
声明个构造函数
var SimpleDrag= function(el,config) {
var defaults= {
handle:null,
x:false,
y:false,
container:null,
helper:null,
iframeFix:false,
ondragstart:$.noop,
ondragmove:$.noop,
ondragstop:$.noop
};
config=$.extend({},defaults,config);
}
我发现我不喜欢在原型链上添加方法~失败。。。
我会在构造函数的内部声明一个对象然后把逻辑写在里面,当然这种习惯非常不好吧。争取在以后改。。
首先针对handle的问题。其实就是谁触发mousedown事件的问题。
if(config.handle) {
$(el).each( function() {
var that=this;
$(config.handle,this).mousedown( function(e) {
drag.domousedown(e,that);
});
});
} else {
$(el).mousedown( function(e) {
drag.domousedown(e,this)
});
}
在mousedown事件使用对象存储当前拖动目标的位置
var x=e.pageX,y=e.pageY,s=drag;
s.ddManage.oldPositionDrag=[x,y];
s.ddManage.oldPosition=$(parent).offset();
s.ddManage.dragEl=$(parent);
在mousemove事件更新值
updatePosition: function(proxyEl,e) {
var container;
config.container==null?container=document.body:container=config.container;
var s=drag,self=this;
var conSize=self.getContainerPosition(container);
var leftSize=s.ddManage.oldPosition.left+(e.pageX-s.ddManage.oldPositionDrag[0]),
topSize=s.ddManage.oldPosition.top+(e.pageY-s.ddManage.oldPositionDrag[1]);
leftSize=leftSize<conSize.left?conSize.left:leftSize;
topSize=topSize<conSize.top?conSize.top:topSize;
topSize=topSize+s.ddManage.dragEl.outerHeight()>conSize.bottom?conSize.bottom-s.ddManage.dragEl.outerHeight():topSize;
leftSize=leftSize+s.ddManage.dragEl.outerWidth()>conSize.right?conSize.right-s.ddManage.dragEl.outerWidth():leftSize;
proxyEl.css({
left:leftSize,
top:topSize
});
}
其中需要有个考虑的问题就是在指定的范围内拖动。在拖动的过程中,计算当前的offset的left值是否小于指定范围的offset的left值,加上拖动对象的宽度是否大于指定范围的右边距的值。
还有就是同级的iframe的问题,我们可以在拖动的过程中使用一个Div设定其透明度为0来遮住iframe,防止拖动的过程中出现抖动的情况。
s.ddManage.iframeFix.appendTo(document.body).css({
position:'fixed',
width:'100%',
在IE7下貌似有个奇怪的问题,如果DIV的背景是transparent的话,是遮不住任何东西的~~所以要设定background。
helper这个属性接受三个值“clone”,null,function(){}
如果要自定义拖动代理的话,可以自定义像下面的函数
helper:function(){
var div=$('<div/>').css({
width:100,
return div;
}
效果如下
目前值得注意的就这么多,但是还有很多功能要写。这个只是预览版~~
下载
http://u.115.com/file/f5f5a4b82c










