Riot.js предоставляет удобный механизм работы с DOM, что делает
обработку событий на мобильных устройствах простой и эффективной.
Основные touch-события, используемые в мобильной разработке, включают:
touchstart, touchmove, touchend и
touchcancel. Эти события позволяют отслеживать начало
касания, движение пальца по экрану, завершение касания и его отмену
системой соответственно.
В Riot.js обработка touch-событий реализуется через синтаксис привязки событий в шаблоне компонента. Например:
<my-component>
<div on-touchstart={handleTouchStart}
on-touchmove={handleTouchMove}
on-touchend={handleTouchEnd}>
Сенсорная область
</div>
<script>
export default {
handleTouchStart(e) {
console.log('Начало касания', e.touches[0].clientX, e.touches[0].clientY);
},
handleTouchMove(e) {
console.log('Движение', e.touches[0].clientX, e.touches[0].clientY);
},
handleTouchEnd(e) {
console.log('Касание завершено');
}
}
</script>
</my-component>
Ключевым моментом является доступ к массиву e.touches,
который содержит информацию о всех активных касаниях. Для большинства
сценариев достаточно e.touches[0], чтобы получать
координаты первого касания.
На мобильных устройствах стандартные события мыши
(click, mousedown, mousemove,
mouseup) работают, но имеют задержку около 300 мс, что
может создавать ощущение «торможения» интерфейса. Использование
touch-событий устраняет эту задержку, повышая отзывчивость.
Riot.js позволяет комбинировать события мыши и touch, чтобы компоненты оставались кроссплатформенными. Например:
<button
on-click={handleClick}
on-touchend={handleClick}>
Нажми меня
</button>
Такой подход обеспечивает поддержку как десктопных, так и мобильных устройств без дополнительного дублирования логики.
Для реализации жестов важно отслеживать начальные и конечные координаты касания. Например, для горизонтального свайпа:
export default {
startX: 0,
handleTouchStart(e) {
this.startX = e.touches[0].clientX;
},
handleTouchEnd(e) {
const endX = e.changedTouches[0].clientX;
const deltaX = endX - this.startX;
if (deltaX > 50) {
console.log('Свайп вправо');
} else if (deltaX < -50) {
console.log('Свайп влево');
}
}
}
Пороговое значение 50px обеспечивает фильтрацию
случайных небольших движений пальца, что повышает точность распознавания
жестов.
Для создания сложных жестов, таких как pinch-to-zoom, важно работать с несколькими касаниями одновременно:
export default {
initialDistance: 0,
handleTouchStart(e) {
if (e.touches.length === 2) {
const [touch1, touch2] = e.touches;
this.initialDistance = Math.hypot(
touch2.clientX - touch1.clientX,
touch2.clientY - touch1.clientY
);
}
},
handleTouchMove(e) {
if (e.touches.length === 2) {
const [touch1, touch2] = e.touches;
const currentDistance = Math.hypot(
touch2.clientX - touch1.clientX,
touch2.clientY - touch1.clientY
);
const scale = currentDistance / this.initialDistance;
console.log('Масштаб:', scale);
}
}
}
Использование Math.hypot позволяет корректно вычислять
дистанцию между пальцами для точного масштабирования.
Для мобильных устройств важно избегать лишней нагрузки на основной поток. Рекомендации:
touchmove, чтобы
избежать блокировки скролла:this.root.addEventListener('touchmove', this.handleTouchMove.bind(this), { passive: true });
console.log в
продакшн-версии.requestAnimationFrame.Riot.js не ограничивает работу с нативными touch-событиями, сохраняя доступ ко всем стандартным DOM-событиям. Компоненты легко реагируют на изменения состояния и позволяют управлять жестами с помощью реактивного подхода.
С помощью комбинирования state и touch-событий можно
создавать интерактивные карусели, слайдеры, draggable-элементы и
полноценные мобильные интерфейсы с высокой отзывчивостью.
touchstart,
touchmove, touchend позволяет реализовать
перетаскивание карточек, как в популярных мобильных приложениях.Эти методы обеспечивают максимально естественное взаимодействие с сенсорным экраном и позволяют создавать высоко отзывчивые интерфейсы на базе Riot.js.