Подтвердить что ты не робот

Перетаскиваемый элемент скрыт за пределами контейнера

Используя jQuery UI, я пытаюсь создать интерфейс с двумя прокручиваемыми контейнерами, каждый из которых содержит много перетаскиваемых элементов. Пользователь может перетаскивать элемент из одного контейнера в другой.

Отбрасывающая функция не является проблемой. При удалении элемент отделяется и воссоздается в нужном месте под его новым родителем.

Моя проблема в том, что элемент перетаскивания не может отображаться вне его контейнера, когда в контейнере position:relative; применяется, поэтому при перетаскивании элемент исчезает, когда он перемещается за пределы контейнера.

Это поведение по умолчанию имеет смысл, так как обычно пользователь хотел бы перетащить элемент внутри своего контейнера. В качестве обходного решения я решил, что решение будет заключаться в использовании свойства draggable "appendTo", которое, как я думал, перемещает элемент за пределы его контейнера, но, к сожалению, это, похоже, не оказало никакого эффекта.


DOM: (каждое представление прокручивается, и каждый контейнер имеет положение: относительное и такое же большое, как и все элементы)

BODY
    VIEW 1
        CONTAINER
            DRAGGABLE ELEMENTS
    VIEW 2
        CONTAINER
            DRAGGABLE ELEMENTS

JavaScript:

$('div.card').draggable({
    appendTo: 'body',
    scroll: false //stops scrolling container when moved outside boundaries
});

Пожалуйста, см. JSFiddle для упрощенного объяснения проблемы. Я не хотел раздувать пример с помощью droppable code, поэтому это просто иллюстрирует проблему перетаскивания. http://jsfiddle.net/Em7Ak/


Большое спасибо заранее.

4b9b3361

Ответ 1

Я не уверен, что это исправит вашу точную проблему, но я столкнулся с этим вопросом, ища тот же ответ, и это то, что я нашел.

В параметрах .draggable() перейдите в helper:'clone', чтобы сделать клон элемента автоматически, чтобы его можно было вытащить из контейнера. И используйте appendTo:'body', чтобы поместить его в конец тега <body>. Так что в моем случае мои варианты выглядят примерно так, добавив в revert:'invalid', чтобы вернуть его в spring, если он не был сброшен где-то действительным:

jQuery(".myselector").draggable({
    helper: 'clone',
    revert: 'invalid',
    appendTo: 'body'
});

Ответ 2

У меня была аналогичная проблема несколько месяцев назад.

Мне нужно было использовать автоматическую прокрутку одного большого контейнера из других

Вот мой вопрос для более подробной информации, JqueryUI, перетащить элементы в ячейки прокручиваемого divable div, содержащего большую таблицу

Я нашел обходное решение. Идея состоит в том, чтобы добавить клон элемента в прокручивающийся контейнер во время обратного вызова конструкции помощника, а затем добавить помощника в тело с помощью функции setTimeout после 1 мс. Позиция помощника должна отображаться в позиции мыши, чтобы избежать проблемы со смещением.

Вот мое решение (похоже, JSFiddle сейчас нет, попробуйте позже, если в окнах не отображается код): http://jsfiddle.net/QvRjL/134/

$('[id^="drag-"]').each(function() {
    $(this).draggable({
        opacity: 0.7,
        cursorAt: { top: 15, left: 50 },
        appendTo: 'body',
        containment: 'body',        
        scroll: true,
        helper: function(){ 
            //Hack to append the cartridge to the body (visible above others divs), 
            //but still belonging to the scrollable container  
            $('#container').append('<div id="clone" class="cartridge">' + $(this).html() + '</div>');   
            $("#clone").hide();
            setTimeout(function(){
                $('#clone').appendTo('body'); 
                $("#clone").show();
            },1);
            return $("#clone");
        }    
    });
});​

Ответ 3

используйте вспомогательный ключ "clone" и спрячьте элемент во время его перетаскивания и покажите его снова при остановке.

$(".removalbe-recom").draggable({
    appendTo: "body",
    helper: "clone",
    revert: "invalid",
    cursor: "move",
    containment: "document",
    zIndex: 10000,
    scroll:false,
    start: function (event, ui) {
    $(this).hide();
    },
    stop: function (event, ui) {
        $(this).show();
    }
});

Ответ 4

Добавить позицию: абсолютный стиль карты:

div.card {
    position:absolute;
    width:100px; height:50px;
    border:1px black solid;
    background-color:orange;
    text-align:center; vertical-align:middle;
}