zoukankan      html  css  js  c++  java
  • Javascript自由拖拽类

    基本拖拽

    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 {
             $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.

    dragdrop.zip

  • 相关阅读:
    Count the Colors---zoj1610线段树
    统计难题---hdu1251字典树模板
    Mayor's posters---poj2528线段树、离散化
    I Hate It---hdu1754线段树
    敌兵布阵---hud1166(线段树或者树状数组模板)
    A Simple Problem with Integers---poj3468线段树
    STL的Vector介绍
    STL的Deque介绍
    索尼高清影视技术学院参观观后感
    RTSP协议学习笔记
  • 原文地址:https://www.cnblogs.com/snandy/p/2015576.html
Copyright © 2011-2022 走看看