基本拖拽
new Dragdrop({
target 拖拽元素 HTMLElemnt 必选
bridge 指定鼠标按下哪个元素时开始拖拽,实现模态对话框时用到
dragable 是否可拖拽 (true)默认
dragX true/false false水平方向不可拖拽 (true)默认
dragY true/false false垂直方向不可拖拽 (true)默认
area [minX,maxX,minY,maxY] 指定拖拽范围 默认任意拖动
callback 拖拽过程中的回调函数
});
jQuery插件
/**
* jQuery拖拽插件
*
* 简单使用
* $(xx).dragable()
*
* 配置对象 option
* $(xx).dargable({
* handle: // @string 鼠标按下开始拖动的元素
* canDrag: // @boolean 默认: true
* axis: // @string 拖拽方向,默认: "xy"。x: 仅水平方向,y: 仅垂直方向
* area: // @array [minX,maxX,minY,maxY] 拖拽范围 默认任意拖动
* inwin: // @boolean 仅在浏览器窗口内拖动
* cursor: // @string 鼠标状态
* zIndex: // @number 拖拽时zIndex值
* fixed: // @boolean 出现滚动条时保持fixed 默认true
* })
*
* 方法 method
* $(xx).dragable('disable') // 停止拖拽
* $(xx).dragable('enable') // 开启拖拽
* $(xx).dragable('reset') // 重置配置对象option
*
* 事件 event [start:开始拖拽, drag:拖拽中, end:拖拽结束]
* $(xx).dragable({
* start: function() {
*
* },
* drag: function() {
*
* },
* end: function() {
*
* }
* })
*/
~function(win, doc, $) {
var $win = $(win)
var $doc = $(doc)
var doc = $doc[0]
/*
* 获取视窗的宽高
*/
function getViewSize() {
return {
width: $win.width(),
height: $win.height()
}
}
/*
* @private initilize 初始化拖拽
* @param {Object} option
* @param {Object} jqObject
*/
function initilize(option, jqObject) {
option = option || {}
var axisReg = /^xy$/
var option = $.extend({
handle: '',
canDrag: option.canDrag !== false,
axis: option.axis || 'xy',
area: option.area || [],
inwin: option.inwin,
cursor: 'move',
zIndex: ''
}, option)
jqObject.each(function(i, elem) {
var handle = option.handle
var dragObj = $(elem)
var downObj = handle ? dragObj.find(handle) : dragObj
var dargElem = dragObj[0]
// 暂存配置对象
dragObj.data('optionData', option)
dragObj.data('originData', $.extend({}, option))
// 设置鼠标状态
downObj.css('cursor', option.cursor)
// 需要使用的一些状态变量
var diffX, diffY, viewSize
var dragElemWidth, dragElemHeight, dragElemMarginTop, dragElemMarginLeft
// 鼠标mousedown
downObj.mousedown(function(ev) {
// 模拟拖拽,需要设置为绝对定位
dragObj.css('position', 'absolute')
// 鼠标按下的时候计算下window的宽高,拖拽元素尺寸.
// 不要再mousemove内计算
viewSize = getViewSize()
dragElemWidth = Math.max(dargElem.offsetWidth, dargElem.clientWidth)
dragElemHeight = Math.max(dargElem.offsetHeight, dargElem.clientHeight)
dragElemMarginTop = parseInt(dargElem.style.marginTop, 10) || 0
dragElemMarginLeft = parseInt(dargElem.style.marginLeft, 10) || 0
// 仅在窗口可视范围内移动
if (option.inwin) {
var winX = viewSize.width - dragElemWidth
var winY = viewSize.height - dragElemHeight
option.area = [0, winX, 0, winY]
}
if (win.captureEvents) { //标准DOM
ev.stopPropagation()
ev.preventDefault()
$win.blur(mouseup)
} else if(dargElem.setCapture) { //IE
dargElem.setCapture()
ev.cancelBubble = true
dragObj.bind('losecapture', mouseup)
}
diffX = ev.clientX - dargElem.offsetLeft
diffY = ev.clientY - dargElem.offsetTop
$doc.mousemove(mousemove)
$doc.mouseup(mouseup)
// drag start event
if (option.start) {
option.start.call(dragObj)
}
})
function mousemove(ev) {
var minX, maxX, minY, maxY
var moveX = ev.clientX - diffX
var moveY = ev.clientY - diffY
// 设置拖拽范围
if (option.area) {
minX = option.area[0]
maxX = option.area[1]
minY = option.area[2]
maxY = option.area[3]
moveX < minX && (moveX = minX) // left 最小值
moveX > maxX && (moveX = maxX) // left 最大值
moveY < minY && (moveY = minY) // top 最小值
moveY > maxY && (moveY = maxY) // top 最大值
}
// 设置是否可拖拽,有时可能有取消元素拖拽行为的需求
if (option.canDrag) {
var axis = option.axis
//设置位置,并修正margin
moveX = moveX - dragElemMarginTop
moveY = moveY - dragElemMarginLeft
if (axis === 'x' || axisReg.test(axis)) {
dargElem.style.left = moveX + 'px'
}
if (axis === 'y' || axisReg.test(axis)) {
dargElem.style.top = moveY + 'px'
}
}
// drag event
if (option.drag) {
option.drag.call(dragObj, moveX, moveY)
}
}
function mouseup(ev) {
// 删除事件注册
$doc.unbind('mousemove', mousemove)
$doc.unbind('mouseup', mouseup)
if (win.releaseEvents) { //标准DOM
$win.unbind('blur', mouseup)
} else if(dargElem.releaseCapture) { //IE
dragObj.unbind('losecapture', mouseup)
dargElem.releaseCapture()
}
// drag end evnet
if (option.end) {
option.end.call(dragObj)
}
}
})
}
/*
* @method dragable jQuery拖拽插件
* @param {Object} option
* @param {String} key
* @param {String} value
*/
$.fn.dragable = function(option, key, value) {
return this.each(function() {
var $self = $(this)
if (typeof option === 'string') {
var oldOption = $self.data('optionData')
switch (option) {
case 'destroy':
break
case 'disable':
oldOption.canDrag = false
break
case 'enable':
oldOption.canDrag = true
break
case 'reset':
var originOption = $self.data('originData')
$.extend(true, oldOption, originOption)
break
case 'option':
if (key && value === undefined) {
return oldOption[key]
}
switch (key) {
case 'axis':
oldOption.axis = value
break
case 'cursor':
oldOption.cursor = value
break
case 'zIndex':
oldOption.zIndex = value
break
}
break
default:;
}
} else {
initilize(option, $self)
}
})
}
}(this, document, jQuery);
效果
拖拽状态:
x:0,
y:0
Drag me.
任意方向 水平方向 垂直方向 停止拖拽 开启拖拽 恢复初始状态