Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Передвигать одновременно несколько элементов (https://javascript.ru/forum/jquery/32665-peredvigat-odnovremenno-neskolko-ehlementov.html)

todd-barry 24.10.2012 23:24

Передвигать одновременно несколько элементов
 
Доброго времени суток. Возникла новая проблема - необходимо написать код при помощи плагина draggable, который реализует перетаскивание нескольких объектов одновременно.
То есть: на странице имеется, например два блока div и один блок span. Пользователь кликает по одному из блоков div и перетаскивает его. вслед за этим блоком перетаскиваются два других div'а и span.
Помогите пожалуйста

Dmitriyff 25.10.2012 07:56

эм... не понял вашего примера.

до

|-раздел 1
|--под раздел 1
|--под раздел 1
|-раздел 2
|--под раздел 2
|--под раздел 2

это пример дерева, вас интересует возможность поменять местами разделы, но так чтобы и подразделы тоскались вместе с разделами?

после

|-раздел 2
|--под раздел 2
|--под раздел 2
|-раздел 1
|--под раздел 1
|--под раздел 1


или ваши два других div'а b span находятся в другом месте страниы и никак не связаны с блоком div по которому идет клик?

todd-barry 25.10.2012 14:28

Два других дива и спан никак не связаны с блоком див, по которому кликнули

DjDiablo 25.10.2012 19:37

КАК div'ы связаны ?

todd-barry 25.10.2012 22:13

Он не связаны никак, то есть могут быть и связаны, но их расположение все время различное

DjDiablo 25.10.2012 22:40

я перефразирую

на странице допутим 100 div'ов
как определить те которые надо двигать
по какому признаку ?

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

todd-barry 25.10.2012 23:04

Определить те, что нужно двигать как раз не проблема. Ну пусть нужно двигать дивы с индексами eq:1, eq3 и eq:5. Это не так принципиально. Меня гораздо больше интересует, как их заставить передвигаться синхронно

DjDiablo 26.10.2012 00:29

ну с этого надо было нечинать.
Короче некак ))))))))))

зато можно, менять координаты других div'ов следом за тем предметом который перемещают.

$( "#draggable" ).draggable({
            start: function() {
                   // что то при старте
            },
            drag: function( event, ui) {
                  //функция срабатывает при перемещении
                  $(".moveRect").offset( { left:ui.offset.left, top:ui.offset.top } )                  
           },
            stop: function() {
                   // что то при окончании перемещения
            }
        });

todd-barry 26.10.2012 02:05

Я догадывался, что это возможно только таким способом. Просто хотелось все реализовать более элегантно. Спасибо большое :)

todd-barry 26.10.2012 02:42

А как определить, на сколько сдвинулся перетаскиваемый элемент?

todd-barry 26.10.2012 03:19

Тоесть, сейчас другие дивы автоматически встают в ту же позицию, что и перемещаемый див. А мне нужно реализовать:
$('.other_div').offset().top + ui.offset.top - изначальная позиция перемещаемого элемента

задавать ее в start, а затем использовать в drag не срабатывает

todd-barry 26.10.2012 16:37

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

DjDiablo 26.10.2012 17:19

var oldLeft, oldTop;
$( "#draggable" ).draggable({
            start: function(event, ui) {
                  oldLeft=ui.offset.left;
                  oldTop=ui.offset.top;
            },
            drag: function( event, ui) {
                  // считаем координаты на сколько уехали от старта.
                  var left=oldLeft-ui.offset.left
                  var top=oldTop-ui.offset.top                 

                   //left - на сколько сдвинулись по горизонтали
                   //top на сколько по вертикали

                  //здесь двигай свои div

                  oldLeft=ui.offset.left;
                  oldTop=ui.offset.top;

            },
            stop: function() {
                   // что то при окончании перемещения
            }
        });

должно срабытывать :/

todd-barry 26.10.2012 19:45

DjDiablo, реализовывал точно так же. Сейчас попробую еще раз, может где то допустил ошибку в синтаксисе

todd-barry 26.10.2012 20:21

Что то с рассчетом неправильно - другой див ведет себя очень странно
var oldLeft, oldTop;
        $( "div" ).draggable({
            start: function(event, ui) {
                oldLeft=ui.offset.left;
                oldTop=ui.offset.top;
            },
            drag: function( event, ui) {
                var left=ui.offset.left-oldLeft;
	            var top=ui.offset.left-oldTop;
                $("div").eq(0).offset( { left:$(this).offset().left+left, top:$(this).offset().top+top } );
                oldLeft=ui.offset.left;
	            oldTop=ui.offset.top;
           },
            stop: function() {
                   // что то при окончании перемещения
            }
        });

todd-barry 26.10.2012 20:27

Все получилось. Огромное спасибо,DjDiablo

DjDiablo 26.10.2012 20:31

$(this) - this не на то указывает на что вы думаете))

Вам же нужно что то вроде

el=$("div").eq(0);
el.offset( { left:el.offset().left+left, top:el.offset().top+top } );


Цитата:

Все получилось
Ну и клёво ))))

todd-barry 26.10.2012 21:10

Цитата:

Сообщение от DjDiablo (Сообщение 212510)
$(this) - this не на то указывает на что вы думаете))

Да, я уже понял ошибку ) Вставил часть кода в общий скрипт - что то снова возникли неполадки.

Вроде, бы это последний момент. Если разберусь с этим, все остальные плагины вставлю аналогичным образом. Надеюсь на вашу помощь, в последний раз :)
$(document).ready(
    function (event) {
        var arr = new Array();
        $("body").selectable({
        selected:
            function(event, ui){
                var a = ui.selected;
                var oldLeft, oldTop;
                $(a).draggable({
                    start: 
                        function(event, ui) {
                            oldLeft=ui.offset.left;
                            oldTop=ui.offset.top;
                        },
                    drag:
                        function( event, ui) {
                            var left=oldLeft-ui.offset.left;
                            var top=oldTop-ui.offset.top;
                            $(a).offset( { left:$(a).offset().left-left, top:$(a).offset().top-top } );
                            oldLeft=ui.offset.left;
                            oldTop=ui.offset.top;
                        },
                    stop: 
                        function() {
                        // что то при окончании перемещения
                    }
                });

                      
            },
        unselecting:
            function(event, ui){
                var r = ui.unselecting;
                $(r).draggable({ cancel: "button" });
                      
            },
        unselected:
            function(event, ui){
                var r = ui.unselected;
                $(r).draggable({ cancel: "button" });
            },
        stop:
            function(event, ui){
                
                      
            }
        });

    }
)


Проблемы:
1. Другие выделенные дивы перестали передвигаться синхронно
2. При отмене выделения элемента, возможность передвигать его сохраняется


Суть кода в том, что, выделив, например 3 дива, они получают возможность передвигаться. При этом, передвигая один из них - за ним должны тащиться два других. Затем, при отмене выделения любого из них, он теряет возможность быть передвигаемым и перестает тащиться за перемещаемым дивом

DjDiablo 27.10.2012 02:37

в твоём примере ты меняешь координаты томуже элементу который и двигаешь, естественно остальные не двигаются. С какого они должны двигаться если ты им координаты не меняешь.

В двух словах мысль и спать,
проверять отлаживать слишком поздно, затра только если.

//все дивы можно выделять
$( "div" ).selectable();

//все дивы можно таскать
$("div").draggable({
        start: function(event, ui) {
                            oldLeft=ui.offset.left;
                            oldTop=ui.offset.top;
        },
        drag: function( event, ui) {
                            var left=oldLeft-ui.offset.left;
                            var top=oldTop-ui.offset.top;
 
                             var th=this;// а может ui или this.el - короче ссылка на  dom элемент к которому прикреплён dragable, посмотри в доках как сделать
// когда div перемещается за ним тащатся все остальные выделенны.
// сам div который двигаем исключим из выборки при помощи [B]not[/B]
                
                            $('.ui-selected"').not(th).each(function(){
$(this).offset( { left:$(this).offset().left-left, top:$(this).offset().top-top });

});
                            oldLeft=ui.offset.left;
                            oldTop=ui.offset.top;
       },
       stop: function() {
                        // что то при окончании перемещения
                    }
});

todd-barry 27.10.2012 22:40

Цитата:

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


Часовой пояс GMT +3, время: 10:21.