powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / drag & drop rollback
25 сообщений из 27, страница 1 из 2
drag & drop rollback
    #39567378
vdekameron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день уважаемые спецы! Прохожу курс javascript. На данном этапе drag & drop. Подскажите пожалуйста как поправить функцию rollback() чтобы иконки плавно перемещались на исходное место при неудачном переносе на цель.

Разметка и стили:
Код: html
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
<style type="text/css">
    .computer {
        width: 93px;
        height: 98px;
        background: url(https://js.cx/clipart/computer.gif) no-repeat;
        padding: 5px;
        font-style: italic;
    }
 
    .computer-smile {
        background: url(https://js.cx/clipart/computer-smile.gif) no-repeat;
    }
    </style>
    
    <h3><i>Можно легко дорабатывать данный фреймворк, добавляя ему новый функционал</i></h3>
    <ul>
        <li>Возможность захвата элемента только за определенную часть</li>
        <li>Возможность положить в определенное место droppable</li>
        <li>Подсветка текущего droppable</li>
        <li>Анимация отмены переноса</li>
    </ul>
    <div class="container">
        <div class="draggable_elems">
            <img class='draggable' src="https://js.cx/browsers/chrome.svg" alt="chrome">
            <img class='draggable' src="https://js.cx/browsers/firefox.svg" alt="firefox">
            <img class='draggable' src="https://js.cx/browsers/ie.svg" alt="ie">
            <img class='draggable' src="https://js.cx/browsers/opera.svg" alt="opera">
            <img class='draggable' src="https://js.cx/browsers/safari.svg" alt="safari">
        </div>
        <p>Переместите элементы на компьютер.</p>
        <div class='droppable computer'></div>
    </div>



Java Script:
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
var dragManager = new function() {
        var dragObject = {};
        var self = this;
 
        document.addEventListener('mousedown', mousedown);
        document.addEventListener('mousemove', mousemove);
        document.addEventListener('mouseup', mouseup);
        document.ondragstart = function(e) { return false };
 
        function mousedown(e) { // При нажатии
            if (e.which != 1) return; // Если не лкм
 
            var elem = e.target.closest('.draggable');
 
            if (!elem) return; // Если не найден draggable
 
            dragObject.elem = elem;
            dragObject.downX = e.pageX;
            dragObject.downY = e.pageY;
        };
 
        function mousemove(e) { // Движение мыши
            if (!dragObject.elem) return; // Если лкм не зажата
 
            if (!dragObject.avatar) { // Если аватар еще не создан
                var moveX = e.pageX - dragObject.downX;
                var moveY = e.pageY - dragObject.downY;
 
                if (Math.abs(moveX) < 5 && Math.abs(moveY) < 5) return; // Если перетащили меньше чем на 5 px
 
                dragObject.avatar = createAvatar(e); // Если лкм зажата и переместили достаточно создаем аватар
 
                if (!dragObject.avatar) { // Если по какой-то причине не удалось создать аватар
                    dragObject = {};
                    return
                };
 
                var coords = getCoords(dragObject.avatar); // получаем координаты аватара с учетом прокрутки
                dragObject.shiftX = e.pageX - coords.left; // запоминаем смещение
                dragObject.shiftY = e.pageY - coords.top;
 
                startDrag(e); // Подготавливаем аватар к переносу
            };
 
            // Если аватар создан, перемещаем его за курсором
            dragObject.avatar.style.left = e.pageX - dragObject.shiftX + 'px';
            dragObject.avatar.style.top = e.pageY - dragObject.shiftY + 'px';
 
            return false;
        };
 
        function mouseup(e) {
            if (dragObject.avatar) { // Если есть аватар заканчиваем перенос
                finishDrag(e)
            };
 
            dragObject = {};
        };
 
        function createAvatar(e) {
            var avatar = dragObject.elem;
 
            var old = { // Запоминаем родителя, позицию и свойства для отката
                parent: avatar.parentNode,
                nextSibling: avatar.nextElementSibling,
                position: avatar.style.position || '',
                left: avatar.style.left || '',
                top: avatar.style.top || '',
                zIndex: avatar.style.zIndex || ''
            };
 
            avatar.rollback = function(e) {
                old.parent.insertBefore(avatar, old.nextSibling);
                avatar.style.position = old.position;
                avatar.style.left = old.left + 'px';
                avatar.style.top = old.top + 'px';
                avatar.style.zIndex = old.zIndex;
            };
 
            return avatar;
        };
 
        function getCoords(avatar) {
            var box = avatar.getBoundingClientRect();
            return {
                top: box.top + window.pageYOffset,
                left: box.left + window.pageXOffset
            };
        };
 
        function startDrag(e) {
            var avatar = dragObject.avatar;
 
            if (avatar.parentNode != document.body) document.body.appendChild(avatar);
            avatar.style.position = 'absolute';
            avatar.style.zIndex = 9999;
        };
 
        function finishDrag(e) {
            var dropElem = findDroppable(e);
 
            if (dropElem) {
                self.onDragSuccess(dragObject.avatar, dropElem);
            } else {
                self.onDragCancel(dragObject.avatar);
            };
        };
 
        function findDroppable(e) {
            dragObject.avatar.hidden = true; // Прячем для того, чтобы проверить над каким эл. курсор
 
            var elem = document.elementFromPoint(e.clientX, e.clientY);
 
            dragObject.avatar.hidden = false; // После получения элемента под курсором снова показываем аватар
 
            if (elem == null) return null; // В случае если курсор зашел за экран
 
            return elem.closest('.droppable');
        };
 
        // При успешном переносе
        this.onDragSuccess = function(avatar, dropElem) {
            avatar.hidden = true;
            dropElem.classList.add('computer-smile');
 
            setTimeout(function() {
                dropElem.classList.remove('computer-smile');
            }, 200);
        };
 
        this.onDragCancel = function(avatar) {
            avatar.rollback();
        };
    };



Не могу понять почему не получается таким способом:
Код: javascript
1.
2.
3.
4.
5.
6.
 avatar.rollback = function(e) {
                avatar.style.transitionProperty = 'all';
                avatar.style.transitionDuration = '0.2s';
                avatar.style.left = dragObject.downX - dragObject.shiftX + 'px';
                avatar.style.top = dragObject.downY - dragObject.shiftY + 'px';
           };



Получается только если назначить left и top с выдержкой ноль, при этом приходится менять и логику события mouseup и не очищать полностью объект а только лишь свойства elem и avatar (dragObject.elem = null; dragObject.avatar = null). Но это целая история и кроме всего иконка не становится точно на свое место, придется еще назначать каждой иконке обработчик события ontransitionend и там прописывать все остальное.

Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
avatar.rollback = function(e) {
                avatar.style.transitionProperty = 'all';
                avatar.style.transitionDuration = '0.2s';
                setTimeout(function() {
                    avatar.style.left = dragObject.downX - dragObject.shiftX + 'px';
                    avatar.style.top = dragObject.downY - dragObject.shiftY + 'px';
                }, 0);
           };



Подскажите пожалуйста как можно проще поправить rollback чтобы плавно откатывалась на свое место.
И если не сложно подскажите почему мой способ работает только с выдержкой ноль а без этого нет.
...
Рейтинг: 0 / 0
drag & drop rollback
    #39567414
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
drag & drop rollback
    #39567421
vdekameron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVostt,

Да это библиотека. Я же учу чистый javascrip. Вопрос по чистому javascript
...
Рейтинг: 0 / 0
drag & drop rollback
    #39567423
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vdekameron,

ну..

1. библиотеку (коих вагон и тележка) можно поковырять и посмотреть как оно устроено, изучение чужих удачных исходников приносит большую пользу и интегрируется в ваш опыт

2. если хотите получить помощь на своём примере, то почему бы вам не оформить пример на том же jsfiddle.net , чтобы можно было потыкать, внести исправления и дать вам рабочий форк, объяснив проблему?
...
Рейтинг: 0 / 0
drag & drop rollback
    #39567433
vdekameron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVostt2. если хотите получить помощь на своём примере, то почему бы вам не оформить пример на том же jsfiddle.net , чтобы можно было потыкать, внести исправления и дать вам рабочий форк, объяснив проблему?

Я так понимаю этот сайт для того, чтобы там пробовать варианты. Так какая разница. Я локально у себя пробую. Рабочий вариант нашел, я же писал об этом. Там слишком много менять нужно. Автор написал что там как-то просто можно. Вот и спросил тут. Скинул и стили и разметку и сам код. Может я просто не вижу легкого решения.
...
Рейтинг: 0 / 0
drag & drop rollback
    #39567437
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vdekameronЯ так понимаю этот сайт для того, чтобы там пробовать варианты. Так какая разница. Я локально у себя пробую. Рабочий вариант нашел, я же писал об этом. Там слишком много менять нужно. Автор написал что там как-то просто можно. Вот и спросил тут. Скинул и стили и разметку и сам код. Может я просто не вижу легкого решения.

как хотите.
...
Рейтинг: 0 / 0
drag & drop rollback
    #39567486
vdekameron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVosttкак хотите.

Но все-равно спасибо за желание помочь. Я все же хочу нормально разобраться с чистым javascript.
...
Рейтинг: 0 / 0
drag & drop rollback
    #39567493
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vdekameronЯ все же хочу нормально разобраться с чистым javascript.
Вот статейка на эту тему...
...
Рейтинг: 0 / 0
drag & drop rollback
    #39567540
vdekameron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
krvsa Вот статейка на эту тему...

Именно по этому автору я сейчас учусь. Но это статейка не про это а про анимацию. Вопрос же про drag & drop. Там конкретную функцию нужно поправить. Есть 2 конкретных вопроса, буду признателен тому, кто попробует вникнуть.
...
Рейтинг: 0 / 0
drag & drop rollback
    #39567630
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сначала ты писал
vdekameronкак поправить функцию rollback() чтобы иконки плавно перемещались на исходное место при неудачном переносе на цель
А это как раз анимация...
...
Рейтинг: 0 / 0
drag & drop rollback
    #39567665
vdekameron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
krvsaА это как раз анимация...

Я к тому, что рассматривать всю обширную тему анимации нет смысла. Там же все просто....свойство transition. Только почему-то оно срабатывает только когда свойства top и left назначаю через интервал времени с нулем. Не могу понять почему. Тогда приходится и логику onmouseup переделывать. Короче думал может кто-то увидит более легкое решение. Я понимаю что все занятые и времени нет, мало ли может кто-то сталкивался именно с этим примером
...
Рейтинг: 0 / 0
drag & drop rollback
    #39567711
Фотография user89
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vdekameron,

я тоже пишу на чистом JavaScript. То надо таблицы с группировками сделать, то выпадающие списки с галочками и прочими удобствами... Для этого надо найти фреймворк, изучить, помучиться с подгонкой под нужные требования. Проще самому сделать, да и страница быстрее грузиться будет
Drag and Drop изучал по https://www.w3schools.com/html/html5_draganddrop.asp
А может ну её, эту анимацию? Пользователей часто раздражают эти лишние движения по экрану. Им надо работу быстрее сделать, а тут при промахе, ещё ненужные замедлители...
...
Рейтинг: 0 / 0
drag & drop rollback
    #39568000
vdekameron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
user89Drag and Drop изучал по https://www.w3schools.com/html/html5_draganddrop.asp

Так это стандартный drag & drop встроенный в HTML5. Он довольно сильно ограничен по возможностям.
user89А может ну её, эту анимацию? Пользователей часто раздражают эти лишние движения по экрану. Им надо работу быстрее сделать, а тут при промахе, ещё ненужные замедлители...

Я идеалист. Согласен про быстродействие...но наряду с быстродействием хочется еще приятный функционал...например возврат в 0.2 секунды думаю не затратит много времени, зато намного приятнее чем мгновенный отскок. Ну это мое мнение.
...
Рейтинг: 0 / 0
drag & drop rollback
    #39568466
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vdekameronЯ идеалист. Согласен про быстродействие...но наряду с быстродействием хочется еще приятный функционал...например возврат в 0.2 секунды думаю не затратит много времени, зато намного приятнее чем мгновенный отскок. Ну это мое мнение.

Не обязательно «возвращать» объект на своё место. Можно сделать движение с быстрым снижением opacity до нуля в сторону прошлой позиции, а затем какой-нибудь эффект bounce. Красиво так варпнулся
...
Рейтинг: 0 / 0
drag & drop rollback
    #39568659
vdekameron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVosttНе обязательно «возвращать» объект на своё место. Можно сделать движение с быстрым снижением opacity

Спасибо за советы. Можно много что придумать, но мне хочется именно так сделать как у меня не получилось, узнать причину почему.
...
Рейтинг: 0 / 0
drag & drop rollback
    #39568662
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vdekameronhVosttНе обязательно «возвращать» объект на своё место. Можно сделать движение с быстрым снижением opacity

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

Ну так соорудите песочницу на jsfiddle или ещё где и давайти сюда. Вроде уже и намекал, и прямо говорил...
...
Рейтинг: 0 / 0
drag & drop rollback
    #39568696
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vdekameronстандартный drag & drop встроенный в HTML5. Он довольно сильно ограничен по возможностям.я б сказал ужасно ограничен.
и при клике по перемещаемому элементу , элемент становится прозрачным, и как изменить эту прозрачность фиг знает, как бы не было большим желанием его использовать - это дело очень и очень дохлое
...
Рейтинг: 0 / 0
drag & drop rollback
    #39568716
vdekameron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVosttНу так соорудите песочницу на jsfiddle или ещё где и давайти сюда. Вроде уже и намекал, и прямо говорил...

Извините, я не понял намеков. Я подумал вы имели в виду сделай в писочнице и ищи решение там))). Я уже даже не надеялся что кто-то захочет посмотреть.

https://jsfiddle.net/xqtf1jb6/2/

Еще раз повторю 2 основных вопроса, чтобы вы не листали:
1) Как можно проще поправить rollback чтобы иконки плавно откатывались на стартовую позицию при неудачном переносе.
2) Почему моим способом не получается?


vdekameronНе могу понять почему не получается таким способом:
Код: javascript
1.
2.
3.
4.
5.
6.
 avatar.rollback = function(e) {
                avatar.style.transitionProperty = 'all';
                avatar.style.transitionDuration = '0.2s';
                avatar.style.left = dragObject.downX - dragObject.shiftX + 'px';
                avatar.style.top = dragObject.downY - dragObject.shiftY + 'px';
           };




vdekameronПолучается только если назначить left и top с выдержкой ноль, при этом приходится менять и логику события mouseup и не очищать полностью объект а только лишь свойства elem и avatar (dragObject.elem = null; dragObject.avatar = null). Но это целая история и кроме всего иконка не становится точно на свое место, придется еще назначать каждой иконке обработчик события ontransitionend и там прописывать все остальное.

Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
avatar.rollback = function(e) {
                avatar.style.transitionProperty = 'all';
                avatar.style.transitionDuration = '0.2s';
                setTimeout(function() {
                    avatar.style.left = dragObject.downX - dragObject.shiftX + 'px';
                    avatar.style.top = dragObject.downY - dragObject.shiftY + 'px';
                }, 0);
           };
...
Рейтинг: 0 / 0
drag & drop rollback
    #39569078
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vdekameron,

держи

https://jsfiddle.net/xqtf1jb6/5/

изрядно ты перемудрил конечно, всё ещё сильнее можно было упростить, но мне лень :)
...
Рейтинг: 0 / 0
drag & drop rollback
    #39569079
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ещё один фикс

https://jsfiddle.net/xqtf1jb6/6/
...
Рейтинг: 0 / 0
drag & drop rollback
    #39569310
vdekameron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVosttещё один фикс

https://jsfiddle.net/xqtf1jb6/6/

Блин че-то я реально тупанул. Спасибо тебе огромное!!!!!! Особенно мне понравились комментарии))) "НАХЕР НЕ НАДО")))

Можешь объяснить почему работает только через setTimeout???? причем и с нулем тоже работает, ты почему-то использовал 50мс
...
Рейтинг: 0 / 0
drag & drop rollback
    #39569313
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vdekameronБлин че-то я реально тупанул. Спасибо тебе огромное!!!!!! Особенно мне понравились комментарии))) "НАХЕР НЕ НАДО")))

это был не простой день с большим количеством ревью кода, где вот так не напишешь ))

vdekameronМожешь объяснить почему работает только через setTimeout???? причем и с нулем тоже работает, ты почему-то использовал 50мс

50 мс — комфортная задержка перед началом анимации, имитация некой инерционности.
...
Рейтинг: 0 / 0
drag & drop rollback
    #39569316
vdekameron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVostt50 мс — комфортная задержка перед началом анимации, имитация некой инерционности.

Ну так почему не работает без задержки?

Вот простейший пример где задержка совсем не обязательна для анимации.
https://jsfiddle.net/zzs03L0n/3/
...
Рейтинг: 0 / 0
drag & drop rollback
    #39569382
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vdekameronНу так почему не работает без задержки?

Вот простейший пример где задержка совсем не обязательна для анимации.
https://jsfiddle.net/zzs03L0n/3/

без задержки можно ещё так

window.scrollBy(0, 0);

почему требуется задержка, почитай про repaint / reflow и оптимизации браузера

вот статейка на тему

https://habrahabr.ru/post/224187/
...
Рейтинг: 0 / 0
drag & drop rollback
    #39570713
vdekameron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVosttпочему требуется задержка, почитай про repaint / reflow и оптимизации браузера

вот статейка на тему

https://habrahabr.ru/post/224187/

Более-менее разобрался. Спасибо большое за разъяснения и за коррекцию кода. Тут тоже разобрался. Все намного оказалось проще чем пытался намудрить.
...
Рейтинг: 0 / 0
25 сообщений из 27, страница 1 из 2
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / drag & drop rollback
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]