【问题标题】:draggable div without jquery UI cant drag well没有jquery UI的可拖动div不能很好地拖动
【发布时间】:2012-06-24 17:27:47
【问题描述】:

我有这个代码:

jQuery:

var mouseDown=false;
var lastPositionX;
var lastPositionY;
var newX;
var newY;
var lastPositionLeft;
var lastPositionTop;
var newLeft;
var newTop;
    $("#insideMap").on("mousedown",function(){
        mouseDown=true;
        lastPositionX=e.pageX;
        lastPositionY=e.pageY;
    });
    $("#insideMap").on("mouseup",function(u){
        mouseDown=false;
    });
    $("#insideMap").on("mouseleave",function(){
        mouseDown=false;
    });
    $("#insideMap").on("mousemove",function(n){
        if (mouseDown){
            mouseDown = true; // mantain the boolean to prevent mouseleave trigger
            newX=n.pageX-lastPositionX;
            newY=n.pageY-lastPositionY;
            lastPositionLeft=$("#insideMap").position().left;
            lastPositionTop=$("#insideMap").position().top;
            newLeft=newX+lastPositionLeft;
            newTop=newY+lastPositionTop;
            $("#insideMap").css({"left":newLeft,"top":newTop});
            lastPositionX=n.pageX;
            lastPositionY=n.pageY;
        }
    });

演示: http://jsfiddle.net/SkWeX/3/

但还是有问题 :( 效果不佳,仍然滞后, 你能帮帮我吗?

【问题讨论】:

    标签: jquery html movable


    【解决方案1】:

    :) 浏览器有时想要拖动您的图像 (bg),您需要防止这种情况发生!

    jsFiddle demo

    只需将其添加到您的 #insideMap 元素的 CSS 中:

    -webkit-touch-callout: none;
    -webkit-user-select: none;
    -khtml-user-select: none;
    -moz-user-select: none;
    -ms-user-select: none;
    user-select: none;
    

    这段代码就是你所需要的:

    var mouseDown=false,
        posX   = 0,
        posY   = 0,
        innerX = 0,
        innerY = 0;
    
    $("#insideMap").on("mousedown",function(e){
        innerX = e.pageX - $(this).offset().left;
        innerY = e.pageY - $(this).offset().top;
        mouseDown= true;
    }).on("mouseup",function(){
        mouseDown=false;
    });
    
    $(document).on("mousemove",function(e){    
        if (mouseDown){
            var m = {  x: e.pageX-innerX,  y: e.pageY-innerY };        
            $('#insideMap').css({ left: m.x, top: m.y });       
        }
    });
    

    一些解释:

    您的代码运行缓慢,原因是 任何 已注册的鼠标移动(并且有很多)您正在重新计算元素位置。错了。

    • 我在点击变量innerXinnerX 时抓取元素内的鼠标位置
    • 在 mousemove 上,我只是将CSS element position 移动到实际的鼠标位置(你猜对了:),但减去了元素被点击的位置(innerX,innerY)(以防止元素跳转到鼠标位置)。李>

    【讨论】:

    • 哦,很好 :) 谢谢你,jsfiddle.net/SkWeX/4,但我觉得还是有点滞后
    • @user1477829 PS:您真的希望 mouseleave 触发 mouseDown(为 false)吗?因为如果您在某个点快速重新定位元素,您的光标将比元素位置快,并且 mouseleave 将触发!
    • @user1477829 我重新编辑了答案并创建了更好的代码。看看吧。
    • 谢谢! '...我更正你的答案'我的答案有什么问题?
    猜你喜欢
    • 2012-01-24
    • 2011-01-07
    • 2017-04-18
    • 1970-01-01
    • 1970-01-01
    • 2018-04-14
    • 2012-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多