【问题标题】:How to get the position of a draggable object如何获取可拖动对象的位置
【发布时间】:2011-06-21 16:06:51
【问题描述】:

我正在尝试使用 jQuery 获取可拖动对象的 xy

场景是,我正在将一个对象拖放到另一个对象上,并且想要获取拖放对象的位置。

编辑:现在我可以得到对象的位置,但我需要更多:

这是我尝试过的:

<script>
$(function() {
    $('#draggable').draggable({
        drag: function() {
            var offset = $(this).offset();
            var xPos = offset.left;
            var yPos = offset.top;
            $(this).text('x: ' + xPos + 'y: ' + yPos);
        }
    });

    $("#droppable").droppable({
        drop: function(event, ui) {
            $(this)
                .addClass("ui-state-highlight")
                .find("p")
                .html("Dropped!");
        }
    });
});
</script>

现在我可以获取可拖动对象的位置,但我需要它可以调整大小,除了获取可拖动对象的x,y,我还需要它的大小。

【问题讨论】:

  • 我刚刚回答了我认为您的问题。但重读,我不太确定。你能澄清一下你想知道什么吗?正如我假设您想要持续更新您拖动的对象的x/y 位置...我可能根本没有回答您的问题。
  • 大卫,实际上我需要的有点复杂,但你可能会帮上大忙。我想要做的是将一个可拖动对象和一个可放置图像放在面板中,然后将可拖动对象拖动到图像上并获取它被放置的位置。我还需要可拖动对象可调整大小并在最后获得它的大小:) 谢谢

标签: jquery jquery-ui drag-and-drop position


【解决方案1】:

您可以使用drag 事件:

$('#dragThis').draggable({
    drag: function() {
        var offset = $(this).offset();
        var xPos = offset.left;
        var yPos = offset.top;
        $('#posX').text('x: ' + xPos);
        $('#posY').text('y: ' + yPos);
    }
});

JS Fiddle demo.

这个demo由drag event,方法offset()text()为大家带来。


编辑以回应 OP 对原始问题的评论:

大卫,实际上我需要的有点复杂,但你可能会帮上大忙。我想要做的是将一个可拖动对象和一个可放置图像放在面板中,然后将可拖动对象拖动到图像上并获取它被放置的位置。我还需要可拖动对象可调整大小并在最后获得它的大小:) 谢谢

...呃,...

认为这种涵盖了所要求内容的基础知识:

$('#dragThis').draggable( {
    containment: $('body'),
    drag: function() {
        var offset = $(this).offset();
        var xPos = offset.left;
        var yPos = offset.top;
        $('#posX').text('x: ' + xPos);
        $('#posY').text('y: ' + yPos);
    },
    stop: function() {
        var finalOffset = $(this).offset();
        var finalxPos = finalOffset.left;
        var finalyPos = finalOffset.top;

        $('#finalX').text('Final X: ' + finalxPos);
        $('#finalY').text('Final X: ' + finalyPos);
    },
    revert: 'invalid'
});

$('#dropHere').droppable({
    accept: '#dragThis',
    over: function() {
        $(this).animate({
            'border-width': '5px',
            'border-color': '#0f0'
        }, 500);
        $('#dragThis').draggable('option', 'containment', $(this));
    }
});

Updated JS Fiddle demo.

Newly-updated JS Fiddle demo, featuring revert: invalid,因此将可拖动的 div 放置在任何位置可放置的 div 将导致可拖动的动画返回到其起始位置。如果那将不胜感激。或者根本不需要...

为了解决draggable 对象也为resizable 的要求,我认为这是不可能的,因为draggable()resizable() 都响应相同 互动。以某种方式这可能是可能的,但恐怕目前超出了我的理解范围。


编辑以添加“高度/宽度”要求,并整理一些内容并改进 CSS。也就是说:

HTML:

<div id="dragThis">
    <ul>
        <li id="posX">x: <span></span></li>
        <li id="posY">y: <span></span></li>
        <li id="finalX">Final X: <span></span></li>
        <li id="finalY">Final Y: <span></span></li>
        <li id="width">Width: <span></span></li>
        <li id="height">Height: <span></span></li>
    </ul>
</div>

<div id="dropHere"></div>

CSS:

#dragThis {
    width: 8em;
    height: 8em;
    padding: 0.5em;
    border: 3px solid #ccc;
    border-radius: 0 1em 1em 1em;
    background-color: #fff;
    background-color: rgba(255, 255, 255, 0.5);
}

#dragThis span {
    float: right;
}

#dragThis span:after {
    content: "px";
}

li {
    clear: both;
    border-bottom: 1px solid #ccc;
    line-height: 1.2em;
}

#dropHere {
    width: 12em;
    height: 12em;
    padding: 0.5em;
    border: 3px solid #f90;
    border-radius: 1em;
    margin: 0 auto;
}

jQuery:

$('#dragThis').draggable({
    containment: $('body'),
    drag: function() {
        var offset = $(this).offset();
        var xPos = offset.left;
        var yPos = offset.top;
        $('#posX > span').text(xPos);
        $('#posY > span').text(yPos);
    },
    stop: function() {
        var finalOffset = $(this).offset();
        var finalxPos = finalOffset.left;
        var finalyPos = finalOffset.top;

        $('#finalX > span').text(finalxPos);
        $('#finalY > span').text(finalyPos);
        $('#width > span').text($(this).width());
        $('#height > span').text($(this).height());
    },
    revert: 'invalid'
});

$('#dropHere').droppable({
    accept: '#dragThis',
    over: function() {
        $(this).animate({
            'border-width': '5px',
            'border-color': '#0f0'
        }, 500);
        $('#dragThis').draggable('option', 'containment', $(this));
    }
});

JS Fiddle demo, of the above.

【讨论】:

  • 如果您有时间,请帮我解决剩下的问题?谢谢大卫
  • @David,你能不能也让它调整大小:) 谢谢!非常感谢
  • @Pabuc,如果你看看最后一段,可悲的是,答案是“不,我不能。”主要是因为draggable()droppable() 都响应相同的用户操作,我找不到区分应该调用哪个插件/方法的方法。可能通过在元素内嵌套跨度或 div,但是......我不相信。对不起 =(
  • 好的,那么我必须找到一个解决方法,我能想到的第一个是,因为我会让用户在可拖动对象中输入文本,你认为有可能得到文本的长度并调整可拖动对象的大小?
  • @SameeraPrasadJayasinghe:不客气!
【解决方案2】:

您可以尝试以下方法之一:

$(this).position()

$(this).offset()

.position() 方法允许我们检索元素相对于偏移父元素的当前位置。将此与 .offset() 进行对比,后者检索相对于文档的当前位置。

来自http://api.jquery.com/position/

【讨论】:

【解决方案3】:

您可以使用 .resizable() 和 stop 事件获取宽度输出。尝试添加:

$('#dragThis').resizable({ handles: "e, w",      
      stop: function(event, ui) {
        var width = ui.size.width;
        var height = ui.size.height;
    $('#width > span').text($(this).width());
    $('#height > span').text($(this).height());
      }
   });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-16
    相关资源
    最近更新 更多