- Drag to scroll
- Scroll to given position
- Drag to scroll
- Use cases
- Как создать перетаскиваемый элемент
- Что нужно знать про Drag and Drop?
- Как реализовать эффект Drag and Drop с помощью JavaScript
- Обзор событий
- Пошаговая инструкция
- Первый шаг: создаем перетаскиваемый элемент
- Второй шаг: стилизуем элементы
- Третий шаг: запуск событий
- Итоги
- Перетаскивание элементов Drag and drop (jQuery UI Droppable)
- Подключение и базовое использование
- Стили для курсоров «Drag & Drop»:
- Пример:
- Запретить выносить элемент за пределы родителя
- Пример:
- Перемещение по сетке
- Пример:
- Ограничение направлений перемещения
- Движение только по горизонтали
- Пример:
- Движение только по вертикали
- Пример:
- Перемещение только под заданным углом
- Пример:
- Получить координаты элемента
- Пример:
- Перемещение элементов стрелками клавиатуры
Drag to scroll
User often uses the mouse to scroll in a scrollable container. In addition to that, some applications also allow user to scroll by dragging the element. You can see that feature implemented in a PDF viewer, Figma and many more.
This post shows you a simple way to archive that feature with vanilla JavaScript.
Assume that we have a scrollable container as below:
div id="container" class="container">. div>
The element must have at least two CSS properties:
.container
cursor: grab;
overflow: auto;
>
The cursor: grab indicates that the element can be clicked and dragged.
Scroll to given position
As long as the element is scrollable, we can scroll it to given position by setting the scrollTop or scrollLeft property:
const ele = document.getElementById('container');
ele.scrollTop = 100;
ele.scrollLeft = 150;
Drag to scroll
The implementation is quite straightforward. By using the similar technique in the Make a draggable element post, we start with handling the mousedown event which occurs when user clicks the element:
let pos = top: 0, left: 0, x: 0, y: 0 >;
const mouseDownHandler = function (e)
pos =
// The current scroll
left: ele.scrollLeft,
top: ele.scrollTop,
// Get the current mouse position
x: e.clientX,
y: e.clientY,
>;
document.addEventListener('mousemove', mouseMoveHandler);
document.addEventListener('mouseup', mouseUpHandler);
>;
pos stores the current scroll and mouse positions. When user moves the mouse, we calculate how far it has been moved, and then scroll to the element to the same position:
const mouseMoveHandler = function (e)
// How far the mouse has been moved
const dx = e.clientX - pos.x;
const dy = e.clientY - pos.y;
// Scroll the element
ele.scrollTop = pos.top - dy;
ele.scrollLeft = pos.left - dx;
>;
Good practice
As you see above, the left , top , x , and y properties are related to each other. It’s better to encapsulate them in a single variable pos instead of creating four variables.
Last but not least, we can improve the user experience by setting some CSS properties when user starts moving the mouse:
const mouseDownHandler = function(e)
// Change the cursor and prevent user from selecting the text
ele.style.cursor = 'grabbing';
ele.style.userSelect = 'none';
.
>;
These CSS properties are reset when the mouse is released:
const mouseUpHandler = function ()
document.removeEventListener('mousemove', mouseMoveHandler);
document.removeEventListener('mouseup', mouseUpHandler);
ele.style.cursor = 'grab';
ele.style.removeProperty('user-select');
>;
Use cases
Hopefully you love the following demo!
Как создать перетаскиваемый элемент
Что нужно знать про Drag and Drop?
Дословно Drag-and-Drop переводится с английского, как «перетяни и кинь». Именно таким образом осуществляется перетаскивание элементов с использованием мыши. Чаще всего это действие ассоциируется с перемещением файлов в папку.
Возможность перетаскивания блоков и элементов из одной секции в другую делает удобными такие конструкторы сайтов, как Tilda, Craftum и Wix. В них любой пользователь может создать страницу без знания программирования. Удобный и понятный интерфейс позволяет собрать лендинг буквально за пару часов. Сегодня мы покажем, как создавать такие же перетаскиваемые фрагменты.
Как реализовать эффект Drag and Drop с помощью JavaScript
Первое, что нужно отметить, мы реализуем перетаскивание элементов без загрузки фреймворков и библиотеки Java Script . Для желаемого результата достаточно знаний API-интерфейса и браузеры версий: Firefox 3.5+, Chrome 4, 9+, Safari 6+, Opera 12+.
Прежде чем писать код, нужно решить 2 задачи:
- Определяемся, что и куда будем перетаскивать (draggable element и dropzone).
- После чего решаем, что именно будет происходить с перетаскиваемым элементом.
И как всегда, при выполнении заданных условий, в браузере запускаются события. Поэтому сейчас мы подробнее остановимся на тех, которые срабатывают до тех пор, пока объект не окажется в целевой области.
Обзор событий
При перетаскивании элементов возникает 7 событий. Даже если их функция понятна на интуитивном уровне, нужно четко представлять при каких обстоятельствах они возникают.
- Dragstart – это событие срабатывает на старте перетаскивания элемента, как только его зажимает мышь.
- Dragenter – сработает при входе перетаскиваемого элемента в целевую область (объект).
- Dragover – отследить событие Dragover можно в момент, когда перетаскиваемый элемент находится в зоне целевого объекта, но еще не отпущен.
- Dragleave – означает выход перетаскиваемого элемента из целевого объекта, при этом клавиша мыши все еще зажата.
- Drag – это событие происходит на протяжении всего времени, пока элемент в процессе перетаскивания.
- Drop – если происходит данное событие, значит перетаскиваемый элемент «упал» при отпуске зажатой клавиши.
- Dragend – на этом событии процесс перемещения элемента завершается (элемент либо успешно переместился, либо перетаскивание отменилось).
Этот список событий делится на две подгруппы. События № 1, 5, 7 применимы для элемента, который мы перетаскиваем. Остальные используются для целевой области. Наоборот они не функционируют и также не могут сработать одновременно. Поэтому вам нужно определиться, что будет происходить на экране при перетаскивании вашего элемента в dropzone. Наверняка, вам хочется перейти к делу. Все пояснения есть в инструкции.
Пошаговая инструкция
В качестве перетаскиваемых элементов могут быть блоки, фото, текст. Мы приведем пример с использованием списка задач, который нужно выполнить. То есть под перетаскиваемым элементом будет «TASK», а целевая область — «DONE». В html-разметке будет два , поскольку один draggable element и одна drop zone. Вы можете создавать сколько угодно элементов и зон сброса.
Первый шаг: создаем перетаскиваемый элемент
В новом каталоге проекта создаем HTML-файл и помещаем в него базовый код веб-страницы. Также в этой папке сразу создаем файл с расширением .css и .js. И чтобы не забыть, ссылку на файл style.css вставляем между тегов , а ссылку src=»https://timeweb.cloud/tutorials/css-html/script.js» перед закрытием тега .
Теперь нужно создать перетаскиваемый элемент и целевую зону. Как мы уже упоминали выше, между тегами помещаем перетаскиваемый элемент под названием TASK и область, куда его скинем. Также обратите внимание, что нужно разрешить перемещение элементов, указав около атрибута draggable значение true. Чтобы запретить перетаскивание или задать поведение автоматически (по умолчанию), используйте команды: draggable=» false | auto»
draggable="true" >
TASK
DONE