JQuery UI Draggable: выровнять помощник по отношению к мыши

С jQuery у меня есть элемент перетаскивания. Это div размером 200 x 40. Конечно, пользователь может начать перетаскивать этот div, нажимая на различные позиции в div. Я хочу, когда произойдет событие startdrag, вспомогательный (клон) div всегда будет выровнен по курсу таким же образом, независимо от того, где в div пользователь начал перетаскивать.

Итак, после мышки верхние и левые значения помощника должны быть такими же, как и мыши x и y. Я пробовал это, используя этот код coffeescript:

onStartDrag: ( e, ui ) =>
    ui.helper.css
        left: e.clientX
        top: e.clientY

    console.log( e )

Но это не работает, и я предполагаю, что это происходит, потому что значения, которые я вставляю, напрямую перезаписываются плагином перетаскивания из-за перемещения мыши.

Любые идеи?

Ответы

Ответ 1

После попытки ответа Амара и осознания того, что он закручивает взаимодействия с droppable, я углубляюсь и обнаружил, что есть опция, специально поддерживающая это под названием cursorAt.

$('blah').draggable
  helper: ->
    ... custom helper ...
  cursorAt:
    top: 5
    left: 5

Это помещает верхний левый угол помощника 5 пикселей выше и слева от курсора и правильно взаимодействует с droppable.

http://api.jqueryui.com/draggable/#option-cursorAt

И позвольте дать кредит, в котором должен быть кредит. Спасибо, jquery-ui архивы списков рассылки!

https://groups.google.com/forum/#!topic/jquery-ui/Evb94G_QvNw

Ответ 2

Попробуйте сделать это,

       start: function (event, ui) {
                $(ui.helper).css("margin-left", event.clientX - $(event.target).offset().left);
                $(ui.helper).css("margin-top", event.clientY - $(event.target).offset().top);
            }

Посмотрите на jqFAQ.com, это будет более полезно для вас.

Ответ 3

Я нашел исправление для этого, и это очень просто, если вы используете сортируемый плагин, вы можете зафиксировать положение помощника следующим образом:

sort: function(e, ui) {
    $(".ui-sortable-handle.ui-sortable-helper").css({'top':e.pageY});
}

Ответ 4

Я согласен с @roverv.

Это прекрасно работает для меня.

Example of my icon following the mouse cursor after scrolling the page

$('.js-tire').draggable
      tolerance: 'fit',
      appendTo: 'body',
      cursor: 'move',
      cursorAt:
        top: 15,
        left: 18
      helper: (event) ->
        $('<div class="tire-icon"></div>').append($('<img src="/images/tyre_32_32.png" />'))
      start: (event, ui) ->
        if $(event.target).hasClass 'in-use'
          $('.js-send-to-maintenance-box').addClass 'is-highlighted'
        else
          $('.ui-droppable').addClass 'is-highlighted'
      stop: (event, ui) ->
        $('.ui-droppable')
          .removeClass 'is-highlighted'
          .removeClass 'is-dragover'

Ответ 5

Это сделало трюк для меня:

appendTo: 'body'

Так же:

$(this).draggable({
    helper: "clone",
    cursor: "move",
    appendTo: 'body'
});