簡潔的drag效果,自由拖拽div的實現及注意點


偶然間看到了以前做的一個簡潔的div拖拽效果,修改了一下加點注釋,經測試完美通過firefox/chrome/ie6-11,現拿來分享一下。

先說一下實現原理及要點,最主要的有三步。第一步是mousedown事件,鼠標mousedown的時候記錄此時的鼠標X軸和Y軸以及拖拽框的left和top,並且給拖拽標記賦值true,代表拖拽動作就緒。第二步是mousemove事件,此時動態獲取鼠標的X軸和Y軸,然后計算出來拖拽框新的left和top並賦值使其實現拖拽效果。第三步是mouseup事件,鼠標彈起時給拖拽標記賦值false,拖拽動作完成。

html代碼如下:

<div class="divWrap" id="move1" style="width: 200px; height: 200px; background: Green; border: 1px solid red; position: absolute; top: 100px; left: 100px; cursor: move; -moz-user-select: none; -webkit-user-select: none;"></div>
<div class="divWrap" style="width: 200px; height: 200px; background: brown; border: 1px solid red; position: absolute; top: 300px; left: 100px;">
    <h3 id="move2" style="height: 45px; line-height: 45px; font-size: 18px; background: red; margin: 0; cursor: move; -moz-user-select: none; -webkit-user-select: none;">Title--Move</h3>
</div>

js代碼如下:

(function($) {
    $.fn.dragDiv = function(divWrap) {
        return this.each(function() {
            var $divMove = $(this);//鼠標可拖拽區域
            var $divWrap = divWrap ? $divMove.parents(divWrap) : $divMove;//整個移動區域
            var mX = 0, mY = 0;//定義鼠標X軸Y軸
            var dX = 0, dY = 0;//定義div左、上位置
            var isDown = false;//mousedown標記
            if(document.attachEvent) {//ie的事件監聽,拖拽div時禁止選中內容,firefox與chrome已在css中設置過-moz-user-select: none; -webkit-user-select: none;
                $divMove[0].attachEvent('onselectstart', function() {
                    return false;
                });
            }
            $divMove.mousedown(function(event) {
                var event = event || window.event;
                mX = event.clientX;
                mY = event.clientY;
                dX = $divWrap.offset().left;
                dY = $divWrap.offset().top;
                isDown = true;//鼠標拖拽啟動
            });
            $(document).mousemove(function(event) {
                var event = event || window.event;
                var x = event.clientX;//鼠標滑動時的X軸
                var y = event.clientY;//鼠標滑動時的Y軸
                if(isDown) {
                    $divWrap.css({"left": x - mX + dX, "top": y - mY + dY});//div動態位置賦值
                }
            });
            $divMove.mouseup(function() {
                isDown = false;//鼠標拖拽結束
            });
        });
    };
})(jQuery);
//
$(document).ready(function() {
    $("#move1").dragDiv();//拖拽整個div
    $("#move2").dragDiv(".divWrap");//拖拽div頭部
});

最后要說明一下,在開始拖拽動作之前,要禁止選中內容,否則影響拖拽效果。firefox和chrome可以通過css來設置:{-moz-user-select: none; -webkit-user-select: none;},ie本來也可以直接在html里寫一個onselectstart="return false",但似乎chrome受了點影響,所以決定取消這個寫法,然后在js里為ie瀏覽器寫一個onselectstart事件。

這個小插件只是簡單實現拖拽效果,但兼容性很好,里面也用到了一些知識點和技巧。當然也可以借助這個插件或里面的思想繼續擴展,寫一個比較完善的拖拽插件(如:Draggable和Droppable)。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM