jquery拖動程式碼

前端開發部落格發表於2016-04-24

重新整理了一篇自己寫過的一個jquery拖動程式碼,精簡了一些東西。

實現以下目標:

1.支援自適應(縮放時,不會看不到,始終會在視窗內,記錄位置)
2.拖動的元素不會拖到外面去(保持始終可見)
3.相容IE瀏覽器,使用流暢

html程式碼:

<style type="text/css">
.page{text-align:left;}
.dragDiv{border:1px solid #ddd; padding:10px; width:300px; margin:0 auto; border-radius:4px; box-shadow:0 1px 2px #fefefe; position: fixed;}
</style>
<div class="dragDiv" id="drag">
    <div class="drag-head">點選拖動</div>
    <div class="drag-body">
        蔡寶堅部落格專注於前端開發,歡迎關注和收藏。<br/>
        微博:<a href="http://weibo.com/kujian" target="_blank">http://weibo.com/kujian</a><br/>
        部落格:<a href="http://caibaojian.com" target="_blank">http://caibaojian.com/</a>
    </div>
</div>

jQuery程式碼:

var _drag = {};
_drag.top = 0; //拖動過的位置距離上邊
_drag.left = 0; //拖動過的位置距離左邊
_drag.maxLeft; //距離左邊最大的距離
_drag.maxTop; //距離上邊最大的距離
_drag.dragging = false; //是否拖動標誌
//拖動函式
function bindDrag(el){ 
    var winWidth = $(window).width(), winHeight =$(window).height(),objWidth = $(el).outerWidth(), objHeight = $(el).outerHeight();
    _drag.maxLeft = winWidth - objWidth, _drag.maxTop = winHeight - objHeight;
    var els = el.style,x=0,y=0;
    var objTop = $(el).offset().top, objLeft = $(el).offset().left;
    $(el).mousedown(function(e){ 
        _drag.dragging = true;
        _drag.isDragged = true;
        x = e.clientX - el.offsetLeft; 
        y = e.clientY - el.offsetTop; 
        el.setCapture && el.setCapture(); 
        $(document).bind(`mousemove`,mouseMove).bind(`mouseup`,mouseUp);
        return false;
    }); 
    function mouseMove(e){ 
        e = e || window.event;
        if(_drag.dragging){
            _drag.top = e.clientY - y; 
            _drag.left = e.clientX - x;
            _drag.top = _drag.top > _drag.maxTop ? _drag.maxTop : _drag.top;
            _drag.left = _drag.left > _drag.maxLeft ? _drag.maxLeft : _drag.left;
            _drag.top = _drag.top < 0 ? 0 : _drag.top;
            _drag.left = _drag.left <0 ? 0 : _drag.left;
            els.top = _drag.top + `px`; 
            els.left = _drag.left+ `px`;
            return false;
        }

    } 
    function mouseUp(e){ 
        _drag.dragging = false; 
        el.releaseCapture && el.releaseCapture(); 
        e.cancelBubble = true;
        $(document).unbind(`mousemove`,mouseMove).unbind(`mouseup`,mouseUp); 
    }
    $(window).resize(function(){
        var winWidth = $(window).width(),
        winHeight = $(window).height(),
        el = $(el),
        elWidth = el.outerWidth(),
        elHeight = el.outerHeight(),
        elLeft = parseFloat(el.css(`left`)),
        elTop = parseFloat(el.css(`top`));
        _drag.maxLeft = winWidth - elWidth;
        _drag.maxTop = winHeight - elHeight;
        _drag.top = _drag.maxTop < elTop ? _drag.maxTop : elTop;
        _drag.left = _drag.maxLeft < elLeft ? _drag.maxLeft : elLeft;
        el.css({
            top:_drag.top,
            left:_drag.left
        })
    })
} 
bindDrag(document.getElementById(`drag`));

演示地址:

連結

原文:http://caibaojian.com/jquery-drag.html

PS:該專欄以後會不定期同步前端開發部落格上的文章過來,歡迎大家關注,也感謝sf這麼一個平臺,希望和你們一起進步。

相關文章