В отличие от настольных браузеров, iOS использует события
касаний (touch events) вместо стандартных событий мыши
(mousedown, mousemove, mouseup).
Библиотека Shopify Draggable абстрагирует
взаимодействие с различными устройствами, но для корректной работы на
iOS важно понимать несколько специфических моментов:
touch-action и предотвращение
скролла По умолчанию iOS обрабатывает свайпы и скроллинг на
элементах, что может конфликтовать с перетаскиванием. Для
элементов-контейнеров Draggable необходимо установить CSS:
.draggable-container {
touch-action: none;
}
Это полностью отключает стандартное поведение жестов и позволяет Draggable корректно отслеживать движения пальца.
Обработка passive событий iOS по
умолчанию добавляет опцию passive: true к
touchstart и touchmove, что препятствует
вызову event.preventDefault(). Draggable внутри себя
корректно обрабатывает этот момент, но при кастомных обработчиках важно
явно указывать:
element.addEventListener('touchmove', function(e) {
e.preventDefault(); // необходимо для предотвращения скролла
}, { passive: false });Draggable автоматически детектирует сенсорные устройства и использует
TouchSensor вместо MouseSensor. Пример базовой
инициализации:
import { Draggable } from '@shopify/draggable';
const draggable = new Draggable(document.querySelectorAll('.draggable-container'), {
draggable: '.draggable-item',
delay: 0, // Задержка для сенсорных устройств
mirror: {
constrainDimensions: true
}
});
draggable.on('drag:start', (event) => {
console.log('Начало перетаскивания', event.source);
});
Особенности для iOS:
delay иногда требуется увеличивать на iOS, чтобы
избежать конфликтов с долгими нажатиями.mirror: { constrainDimensions: true }, так как на iOS
transform и position: fixed могут работать
иначе.iOS использует touchmove с высокой чувствительностью.
Для предотвращения ложных срабатываний:
Минимальное смещение перед активацией drag
Draggable позволяет задать delay и
distance:
const draggable = new Draggable(document.querySelectorAll('.draggable-container'), {
draggable: '.draggable-item',
delay: 100, // миллисекунды
distance: 5 // пиксели
});
Значение distance особенно важно на iOS, чтобы избежать
активации drag при мелких случайных касаниях.
Синхронизация с системным скроллом Если контейнер вертикально скроллится, нужно следить за предотвращением конфликта:
draggable.on('drag:move', (event) => {
event.originalEvent.preventDefault();
});На iOS при появлении клавиатуры изменяется viewport и поведение touch-событий. Важно учитывать:
window.addEventListener('resize', () => {
draggable.updateDraggables(); // пересчитывает позиции элементов
});
Transform вместо absolute На iOS для плавной
анимации Draggable использует transform: translate3d().
Прямое изменение top/left может вызывать рывки и
подтормаживания.
Сглаживание движения Использование
will-change: transform на draggable-элементах улучшает
отклик на сенсорных устройствах:
.draggable-item {
will-change: transform;
}Аппаратное ускорение Для тяжелых списков и сеток
рекомендуется использовать requestAnimationFrame внутри
кастомных событий Draggable, хотя библиотека сама обрабатывает
большинство оптимизаций.
iOS чувствительна к вложенным draggable-контейнерам. Важно:
containers в настройках Draggable.ignoreInputTextSelection для текстовых
полей, чтобы избежать блокировки ввода:const draggable = new Draggable(containers, {
draggable: '.draggable-item',
ignoreInputTextSelection: true
});
console.log(event) для отслеживания
координат touch.touchstart и
drag:start, особенно на старых устройствах.iOS требует внимательного подхода к обработке touch-событий,
предотвращению скролла и оптимизации CSS-анимаций, чтобы
Draggable работал плавно и без багов. Правильная комбинация
touch-action, delay, distance и
mirror.constrainDimensions обеспечивает стабильную работу
на сенсорных экранах.