Поведение Tom Select на сенсорных устройствах определяется сочетанием нативных событий браузера и внутренних механизмов управления фокусом, скроллом и выбором элементов. Основная сложность заключается в конфликте между прокруткой контейнеров, обработкой касаний и логикой взаимодействия с выбранными элементами (items) и выпадающим списком (dropdown).
Сенсорный ввод в контексте Tom Select опирается на три базовых сценария:
Каждый из этих сценариев использует события уровня браузера:
touchstart, touchmove, touchend,
а в современных реализациях — унифицированные pointerdown,
pointermove, pointerup.
Tom Select не реализует полноценную gesture-систему уровня мобильных UI-фреймворков, поэтому поведение жестов формируется комбинацией CSS и JavaScript-обработчиков поверх DOM-структуры.
Ключевая проблема сенсорного взаимодействия заключается в конкуренции между:
Внутри dropdown обычно применяется ограничение поведения скролла:
overflow: auto;-webkit-overflow-scrolling: touch для
инерции iOS;touchmove могут частично блокироваться через
event.preventDefault() в критических местах.Однако агрессивная блокировка скролла приводит к ухудшению UX, поэтому используется условная логика: предотвращение стандартного поведения применяется только при распознавании жеста, не связанного со скроллом.
Типовой подход:
Один из распространённых паттернов мобильного интерфейса — удаление
выбранного элемента через свайп по «чипу» (item). В стандартной
конфигурации Tom Select удаление происходит через клик по кнопке
×, однако на сенсорных устройствах свайп может служить
дополнительным способом взаимодействия.
Логика реализации свайпа:
touchstart/pointerdown на
элементе item;startX;deltaX;Ключевой параметр — порог срабатывания, который предотвращает случайные удаления при обычном скролле.
Пример логики:
deltaX > threshold → удаление элемента;deltaX < -threshold → отмена жеста;Визуально это часто сопровождается трансформацией:
transform: translateX(px)Современные реализации предпочитают Pointer Events, так
как они объединяют мышь, сенсор и стилус в единую модель.
Преимущества:
pointercancel для системных прерываний;pointerType (touch, pen,
mouse).Типовая схема:
pointerdown — захват начального состояния;pointermove — вычисление смещения;pointerup — завершение жеста;pointercancel — аварийный сброс состояния.Для корректной работы используется setPointerCapture,
позволяющий сохранять поток событий даже при выходе указателя за пределы
элемента.
Dropdown в Tom Select часто содержит большое количество элементов, что делает прокрутку критически важной.
Основная проблема: свайп по элементу может конфликтовать со скроллом списка.
Решения:
Приоритет обычно отдается скроллу, так как он является базовым поведением списка.
При мультивыборе элементы представлены в виде строки «чипов», где каждый элемент потенциально интерактивен.
Особенности:
Свайпы здесь требуют аккуратной реализации, чтобы не конфликтовать с горизонтальным scroll контейнера tags.
Часто применяется правило:
На мобильных устройствах открытие клавиатуры изменяет viewport, что влияет на жесты:
Для компенсации используются:
visualViewport;Для достижения нативного поведения применяются CSS-механизмы:
-webkit-overflow-scrolling: touch;scroll-behavior: smooth (ограниченно);Инерционное поведение важно при прокрутке dropdown, но для свайпов по элементам чаще используется строгая дискретная логика без инерции, чтобы избежать неоднозначных состояний.
Обработка жестов должна выполняться с учётом частоты событий
touchmove (до 120–240 FPS на современных устройствах).
Оптимизация включает:
requestAnimationFrame для обновления
UI;Особенно критично избегать повторных вычислений
getBoundingClientRect() внутри touchmove.
Жесты не должны заменять базовые механизмы управления:
ARIA-атрибуты обеспечивают корректную интерпретацию элементов:
role="listbox" для dropdown;role="option" для элементов списка;aria-selected для выбранных значений.Свайпы рассматриваются как дополнительный слой взаимодействия, не влияющий на основную семантику компонента.
Гибкость Tom Select позволяет внедрять собственные gesture-модули через плагины.
Типовая структура расширения:
initialize;pointerdown на элементы items;Пример логики плагина:
closest;this.removeItem(value) при превышении
порога.Такой подход сохраняет ядро Tom Select неизменным и переносит логику жестов на уровень расширений.
Сенсорное взаимодействие в Tom Select имеет ряд ограничений:
Эти ограничения компенсируются кастомизацией событийной модели и строгим разделением зон взаимодействия внутри компонента.