Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Как реализовать смену порядка перетаскиванием (https://javascript.ru/forum/misc/74912-kak-realizovat-smenu-poryadka-peretaskivaniem.html)

MC-XOBAHCK 15.08.2018 23:17

Как реализовать смену порядка перетаскиванием
 
Можете подсказать как реализовать смену порядка div-блоков перетаскиванием мышкой?
Я видел вроде в jQuery UA есть какая та реализация. Но это нужно две библиотеки добавлять.

А на нативном JS сложно реализовать такую задачу? Можете подкинуть идею или ссылку на то как такое организовать? Может какую простую библиотеку посоветуете или идею на реализацию.

У меня дивы примерно 200х250px горизонтально в ряд. При заполнении ряда могут становится вторым, третьим рядом. Что то у меня даже как начать JS нет идей.
Наверное нажатая кнопка мыши и следить за координатами курсора, при этом накинуть z-index на выбранный див... Но лучше спрошу, может кто даст какой совет.

Rise 15.08.2018 23:38

Цитата:

Сообщение от MC-XOBAHCK
А на нативном JS сложно реализовать такую задачу?

нативный

MC-XOBAHCK 15.08.2018 23:50

Rise, спасибо! Примеры увидел, теорию по Drag'n'Drop в учебнике нашёл. Буду изучать и пробовать решить свою задачу.

MC-XOBAHCK 17.08.2018 13:31

Блин, что то я запутался и нахожусь в самом начале.
Если кто то сможет посмотреть и подсказать, то у меня такой макет HTML:
<style>.skates{display:flex;flex-wrap:wrap;justify-content:flex-start}.skat-size{display:flex;flex-direction:column;flex-basis:215px;margin:15px 3px 15px;padding:0 1px 1px;border:solid 1px #ccc;max-width:212px}.skat-size:hover .skat__btn{opacity:0.4}.skat-size .skat__btn:hover{opacity:1;cursor:all-scroll}.dragPanel{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='18' viewBox='0 0 10 18'%3E%3Cpath fill='%23010202' d='M4 5H0V1h4v4zm6-4H6v4h4V1zM4 7H0v4h4V7zm6 0H6v4h4V7zm-6 6H0v4h4v-4zm6 0H6v4h4v-4z'/%3E%3C/svg%3E");width:10px;height:18px;margin-left:5px}.skat__panel{height:21px}.skat__btn{display:inline-block;opacity:0;margin-top:3px}</style>

<div class="skates">
        
        <div class="skat-size">
            <div class="skat__panel">
                <div class="dragPanel skat__btn" title="Переместить"></div>
            </div>
            <div class="skat-params"><h4>Блок 1</h4></div>
        </div>

        <div class="skat-size">
            <div class="skat__panel">
                <div class="dragPanel skat__btn" title="Переместить"></div>
            </div>
            <div class="skat-params"><h4>Блок 2</h4></div>
        </div>

        <div class="skat-size">
            <div class="skat__panel">
                <div class="dragPanel skat__btn" title="Переместить"></div>
            </div>
            <div class="skat-params"><h4>Блок 3</h4></div>
        </div>
        
</div>

Три однотипных блока, при наведении на блок - появляется область-элемент для перетаскивания.
Эти блоки генерируются через class, поэтому события отслеживаю по event.target.
Если я правильно понял, первым делом при нажатой кнопке мыши добавляю для блока атрибут draggable="true". Получается такое начало JS:
// Перетаскивание [url]https://developer.mozilla.org/en-US/docs/Web/API/HTML_Drag_and_Drop_API[/url]
document.querySelector('.skates').addEventListener('mousedown', function(e) {
    let el = event.target;
    
    if (el.className == 'dragPanel skat__btn') {

        el.parentNode.parentNode.setAttribute('draggable', true);



        document.querySelector('.skates').addEventListener('mouseup', function (e) {
            console.log('Отпустил кнопку');
        })
    }
})

А что делать дальше? То ли собирать DataTransferItemList и создавать DataTransferItem??? - я потерялся. Может кто поможет.

Rise 19.08.2018 19:06

MC-XOBAHCK,
без mouse-событий, только drag&drop-события, не подходит?

Aetae 19.08.2018 19:13

Да никто нативным d&d кроме как для файлов и не пользуется, слишком мутно, криво и неудобно.)


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