Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / drag & drop rollback / 25 сообщений из 27, страница 1 из 2
10.12.2017, 20:03
    #39567378
vdekameron
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
drag & drop rollback
Добрый день уважаемые спецы! Прохожу курс 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
10.12.2017, 22:08
    #39567414
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
drag & drop rollback
...
Рейтинг: 0 / 0
10.12.2017, 22:54
    #39567421
vdekameron
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
drag & drop rollback
hVostt,

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

ну..

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

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

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

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

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

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

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

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

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

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

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

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

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

Ну так соорудите песочницу на jsfiddle или ещё где и давайти сюда. Вроде уже и намекал, и прямо говорил...
...
Рейтинг: 0 / 0
12.12.2017, 22:26
    #39568696
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
drag & drop rollback
vdekameronстандартный drag & drop встроенный в HTML5. Он довольно сильно ограничен по возможностям.я б сказал ужасно ограничен.
и при клике по перемещаемому элементу , элемент становится прозрачным, и как изменить эту прозрачность фиг знает, как бы не было большим желанием его использовать - это дело очень и очень дохлое
...
Рейтинг: 0 / 0
13.12.2017, 00:14
    #39568716
vdekameron
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
drag & drop rollback
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
13.12.2017, 15:33
    #39569078
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
drag & drop rollback
vdekameron,

держи

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

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

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

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

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

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

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

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

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

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

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

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

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

window.scrollBy(0, 0);

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

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

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

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

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

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


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