首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >不带jQuery UI的可拖动div

不带jQuery UI的可拖动div
EN

Stack Overflow用户
提问于 2011-12-20 07:45:38
回答 10查看 116.9K关注 0票数 59

我正在尝试在不使用jQuery UI的情况下使div可拖动。

然而,我被下面的代码卡住了。我知道我应该使用相对于容器div的鼠标位置(其中div将被拖动),并且我应该设置div相对于这些值的偏移量。

我就是想不通是怎么回事。有什么线索吗?

这是(当然)不能工作的代码:

代码语言:javascript
复制
var X, Y;

$(this).mousedown(function() {
    $(this).offset({ 
        left: X, 
        top: Y
    });
});

$("#containerDiv").mousemove(function(event) {
    X = event.pageX;
    Y = event.pageY;
});
EN

回答 10

Stack Overflow用户

发布于 2014-09-19 19:01:12

这是我的贡献:

http://jsfiddle.net/g6m5t8co/1/

代码语言:javascript
复制
<!doctype html>
<html>
    <head>
        <style>
            #container {
                position:absolute;
                background-color: blue;
                }
            #elem{
                position: absolute;
                background-color: green;
                -webkit-user-select: none;
                -moz-user-select: none;
                -o-user-select: none;
                -ms-user-select: none;
                -khtml-user-select: none;     
                user-select: none;
            }
        </style>
        <script>
            var mydragg = function(){
                return {
                    move : function(divid,xpos,ypos){
                        divid.style.left = xpos + 'px';
                        divid.style.top = ypos + 'px';
                    },
                    startMoving : function(divid,container,evt){
                        evt = evt || window.event;
                        var posX = evt.clientX,
                            posY = evt.clientY,
                        divTop = divid.style.top,
                        divLeft = divid.style.left,
                        eWi = parseInt(divid.style.width),
                        eHe = parseInt(divid.style.height),
                        cWi = parseInt(document.getElementById(container).style.width),
                        cHe = parseInt(document.getElementById(container).style.height);
                        document.getElementById(container).style.cursor='move';
                        divTop = divTop.replace('px','');
                        divLeft = divLeft.replace('px','');
                        var diffX = posX - divLeft,
                            diffY = posY - divTop;
                        document.onmousemove = function(evt){
                            evt = evt || window.event;
                            var posX = evt.clientX,
                                posY = evt.clientY,
                                aX = posX - diffX,
                                aY = posY - diffY;
                                if (aX < 0) aX = 0;
                                if (aY < 0) aY = 0;
                                if (aX + eWi > cWi) aX = cWi - eWi;
                                if (aY + eHe > cHe) aY = cHe -eHe;
                            mydragg.move(divid,aX,aY);
                        }
                    },
                    stopMoving : function(container){
                        var a = document.createElement('script');
                        document.getElementById(container).style.cursor='default';
                        document.onmousemove = function(){}
                    },
                }
            }();

        </script>
    </head>
    <body>
        <div id='container' style="width: 600px;height: 400px;top:50px;left:50px;">     
            <div id="elem" onmousedown='mydragg.startMoving(this,"container",event);' onmouseup='mydragg.stopMoving("container");' style="width: 200px;height: 100px;">
                <div style='width:100%;height:100%;padding:10px'>
                <select id=test>
                    <option value=1>first
                    <option value=2>second
                </select>
                <INPUT TYPE=text value="123">
                </div>
            </div>
        </div>  
    </body>
</html>
票数 16
EN

Stack Overflow用户

发布于 2017-01-19 16:33:38

无Jquery解决方案-基本

最基本的可拖动代码是:

代码语言:javascript
复制
Element.prototype.drag = function(){

   var mousemove = function(e){ // document mousemove

       this.style.left = ( e.clientX - this.dragStartX ) + 'px';
       this.style.top  = ( e.clientY - this.dragStartY ) + 'px';

   }.bind(this);

   var mouseup = function(e){ // document mouseup

       document.removeEventListener('mousemove',mousemove);
       document.removeEventListener('mouseup',mouseup);

   }.bind(this);

   this.addEventListener('mousedown',function(e){ // element mousedown

       this.dragStartX = e.offsetX;
       this.dragStartY = e.offsetY;

       document.addEventListener('mousemove',mousemove);
       document.addEventListener('mouseup',mouseup);

   }.bind(this));

   this.style.position = 'absolute' // fixed might work as well

}

然后是用法(非jquery):

代码语言:javascript
复制
document.querySelector('.target').drag();

或者在jquery中:

代码语言:javascript
复制
$('.target')[0].drag();

注意:拖动的元素应该有一个position:absoluteposition:fixed应用于它,以使左上角的移动起作用...

下面的代码有一些更“高级”的特性: dragStart、dragStop回调、附加的css类,用于在拖动时删除其他元素的文本选择,以及一个拖放特性……

查看以下代码:

http://codepen.io/anon/pen/VPPaEK

它主要是在需要拖动的元素上设置一个'mousedown‘事件,然后绑定和解除绑定文档的mousemove来处理移动。

可拖动的手柄

为了为元素设置可拖动的句柄

代码语言:javascript
复制
Element.prototype.drag = function( setup ){

   var setup = setup || {};

   var mousemove = function(e){ // document mousemove

       this.style.left = ( e.clientX - this.dragStartX ) + 'px';
       this.style.top  = ( e.clientY - this.dragStartY ) + 'px';

   }.bind(this);

   var mouseup = function(e){ // document mouseup

       document.removeEventListener('mousemove',mousemove);
       document.removeEventListener('mouseup',mouseup);

   }.bind(this);

   var handle = setup.handle || this;

   handle.addEventListener('mousedown',function(e){ // element mousedown

       this.dragStartX = e.offsetX;
       this.dragStartY = e.offsetY;

       document.addEventListener('mousemove',mousemove);
       document.addEventListener('mouseup',mouseup);

       handle.classList.add('dragging');

   }.bind(this)); 

   handle.classList.add('draggable');

   this.style.position = 'absolute' // fixed might work as well

}

上面的代码是这样使用的:

代码语言:javascript
复制
var setup = {
   handle : document.querySelector('.handle')
};

document.querySelector('.box').drag(setup);

添加CSS以消除可选文本

现在的问题是,当拖动时,可拖动元素中的文本被选中却没有任何用处,这令人恼火。

这就是我们将draggabledragging类添加到元素的原因。这将取消这种不需要的行为,并添加一个移动光标,以显示此元素是可拖动的

代码语言:javascript
复制
.draggable{
    cursor: move;
    position: fixed;
}

.draggable.dragging{
    user-select: none;
}

添加事件

现在我们有了draggable元素,我们有时需要调用各种事件。

代码语言:javascript
复制
setup.ondraginit  // this is called when setting up the draggable
setup.ondragstart // this is called when mouse is down on the element
setup.ondragend   // this is called when mouse is released (after dragging)
setup.ondrag      // this is called while the element is being dragged

每个处理程序都会将原始鼠标事件传递给特定的处理程序

最后,这是我们得到的.

代码语言:javascript
复制
Element.prototype.drag = function( setup ){

    var setup = setup || {};

    var mousemove = function(e){ // document mousemove

        this.style.left = ( e.clientX - this.dragStartX ) + 'px';
        this.style.top  = ( e.clientY - this.dragStartY ) + 'px';

        setup.ondrag && setup.ondrag(e); // ondrag event

    }.bind(this);

    var mouseup = function(e){ // document mouseup

        document.removeEventListener('mousemove',mousemove);
        document.removeEventListener('mouseup',mouseup);

        handle.classList.remove('dragging');

        setup.ondragend && setup.ondragend(e); // ondragend event

    }.bind(this);

    var handle = setup.handle || this;

    handle.addEventListener('mousedown',function(e){ // element mousedown

        this.dragStartX = e.offsetX;
        this.dragStartY = e.offsetY;

        document.addEventListener('mousemove',mousemove);
        document.addEventListener('mouseup',mouseup);

        handle.classList.add('dragging');

        setup.ondragstart && setup.ondragstart(e); // ondragstart event

    }.bind(this)); 

    handle.classList.add('draggable');

    setup.ondraginit && setup.ondraginit(e); // ondraginit event

}

要使用这个:

代码语言:javascript
复制
var setup = {
   handle      : document.querySelector('.handle'),
   ondragstart : e => { console.log('drag has started!'); },
   ondrag      : e => { console.log('drag!'); },
   ondragend   : e => { console.log('drag has ended!'); }
};

document.querySelector('.box').drag(setup);

请注意,e.target是对可拖动元素的引用

票数 13
EN

Stack Overflow用户

发布于 2011-12-20 08:39:40

这是另一种制作可拖动对象的方法,该对象以单击为中心

http://jsfiddle.net/pixelass/fDcZS/

代码语言:javascript
复制
function endMove() {
    $(this).removeClass('movable');
}

function startMove() {
    $('.movable').on('mousemove', function(event) {
        var thisX = event.pageX - $(this).width() / 2,
            thisY = event.pageY - $(this).height() / 2;

        $('.movable').offset({
            left: thisX,
            top: thisY
        });
    });
}
$(document).ready(function() {
    $("#containerDiv").on('mousedown', function() {
        $(this).addClass('movable');
        startMove();
    }).on('mouseup', function() {
        $(this).removeClass('movable');
        endMove();
    });

});

CSS

代码语言:javascript
复制
#containerDiv {
    background:#333;
    position:absolute;
    width:200px;
    height:100px;
}
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8569095

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档