Соответствует сетке относительно другого элемента

Я пытаюсь реализовать систему сетки с перетаскиванием, которая позволяет пользователям перетаскивать элементы с панели инструментов и помещать их в область, которая может использоваться в качестве сетки. В разных частях страницы может быть несколько областей для удаления.

Если я перетащу объект в область Droppable, есть ли способ, которым я могу привязать его к локальной сетке этого объекта?

Например: значок на панели инструментов находится в верхней позиции: 10; слева: 15 Пропадающая область в верхнем положении: 99; осталось: 99

Если я установлю опцию сетки перетаскиваемого объекта на [10, 10], она будет двигаться только с шагом 10 пикселей от (10, 15), например. (100, 95) является действительным, но не (99, 99). В идеале я хочу, чтобы движение сетки перетаскиваемого объекта было смещено от верхнего левого угла любого предмета, внутри которого он находился.

Вот код, который я пытался использовать:

$(function() {
    $(".draggable").draggable();
    $(".droppable").droppable({
        drop: function(event, ui) {
            ui.draggable.draggable({grid: false});
        },
        over: function(event, ui) {
            ui.draggable.draggable({grid: [20,10]});
        },
        out: function(event, ui) {
            ui.draggable.draggable({grid: false});
        },
        tolerance: "fit"
    })
});

Этот код работает нормально, но проблема в том, что независимо от того, когда сетка включена, позиция, в которой находился объект, когда он был поднят, используется для определения того, какое выравнивание сетки использовать:

1. Object starts at (0, 0)
2. Pick up, move to (5, 5), enable grid [10, 10]
3. Object aligns to a grid starting at (0, 0).
4. Disable grid, drop object at (7, 7)
5. Pick object up and enable grid [10, 10]
6. object now aligns to grid starting at (7, 7)

Есть ли способ установить смещение сетки перетаскиваемого в режиме сетки при первом перетаскивании в отбрасываемый объект?

1 ответ

Решение

Я нашел решение, которое, кажется, будет соответствовать моим требованиям. Я добавил новый div, чтобы он вел себя как маркер для позиции сетки, показывая и скрывая этот div при перетаскивании в область сбрасывания.

$(function() {
    $(".draggable").draggable();
    $(".droppable").droppable({
        drop: function(event, ui) {
            $(".ui-draggable-dragging").show();
            $(this).children(".gridmarker").hide();
        },
        over: function(event, ui) {
            // I hide like this because i'm cloning the draggable
            $(".ui-draggable-dragging").hide();
            $(this).children(".gridmarker").show();
        },
        out: function(event, ui) {
            $(".ui-draggable-dragging").show();
            $(this).children(".gridmarker").hide();
        },
    })
    .append($("<div>").addClass("gridmarker").hide());

Затем я добавил новый обработчик для события mousemove тела, который перемещает маркер сетки в соответствии с сеткой в ​​области сбрасывания:

    $("body").mousemove($.proxy(function(event){
        var leftOffset = event.pageX - $(this).offset().left;
        var topOffset = event.pageY - $(this).offset().top;
        $(this).children(".gridmarker")
            .css("left", leftOffset - leftOffset % 20)
            .css("top", topOffset - topOffset % 10);
    }, $(".droppable")));
});
Другие вопросы по тегам