> Как реализовать перетаскивание модального окна мышкой на чистом JavaScript с использованием событий? (JavaScript)
Уровень: senior · Роль: frontend · Категория: Технические вопросы
Компании: Cyber Interactive
Стек: JavaScript
> Пример ответа
Для реализации перетаскивания модального окна мышкой на чистом JavaScript нужно использовать три события: mousedown, mousemove и mouseup. Основная идея - при нажатии на заголовок окна запоминаем начальные координаты мыши и текущее положение окна, затем при движении мыши обновляем позицию окна, а при отпускании - прекращаем обработку.
Вот пример реализации:
JAVASCRIPTconst modal = document.getElementById('modal');const header = document.getElementById('modal-header');let isDragging = false;let offsetX, offsetY;header.addEventListener('mousedown', (e) => {isDragging = true;// Запоминаем смещение курсора относительно окнаconst rect = modal.getBoundingClientRect();offsetX = e.clientX - rect.left;offsetY = e.clientY - rect.top;// Предотвращаем выделение текстаe.preventDefault();});document.addEventListener('mousemove', (e) => {if (!isDragging) return;// Вычисляем новые координаты с учетом смещенияconst newLeft = e.clientX - offsetX;const newTop = e.clientY - offsetY;// Применяем позиционирование (окно должно быть position: absolute или fixed)modal.style.left = newLeft + 'px';modal.style.top = newTop + 'px';});document.addEventListener('mouseup', () => {isDragging = false;});
Важные моменты:
- Окно должно иметь CSS-свойство
position: absoluteилиfixed(обычноfixedдля модалок). - События
mousemoveиmouseupвешаются наdocument, чтобы перетаскивание работало даже при быстром движении мыши за пределами окна. e.preventDefault()вmousedownпредотвращает выделение текста или другие нежелательные действия браузера.- Для мобильных устройств аналогично используют события
touchstart,touchmove,touchendс координатамиe.touches[0].clientX/Y.
Этот код можно расширить, добавив проверку границ экрана или изменение курсора при перетаскивании.
> Похожие задачи по frontend
Что представляет браузер и какие объекты он предоставляет
Как реализовать бесконечную ленту (infinite scroll) в веб-приложении
Если объект является экземпляром класса и методы лежат в прототипе, где их увидим: в for-in или Object.keys
Какие данные остаются после преобразования типов в JavaScript и когда оно происходит
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью