предисловие
В HTML было добавлено много новых событий, но из-за проблем с совместимостью многие события не получили широкого распространения.Далее мы представим несколько полезных мобильных сенсорных событий: touchstart, touchmove, touchend.
представлять
Кратко представим эти события:
- touchstart: срабатывает, когда палец касается экрана, даже если палец уже находится на экране.
- touchmove: срабатывает постоянно, когда палец скользит по экрану. Вызов события preventDefault() во время этого события предотвращает прокрутку.
- touchend: срабатывает, когда палец убирается с экрана.
Эти события касания имеют общие свойства dom. Кроме того, они содержат три свойства для отслеживания касаний:
- touches: Массив сенсорных объектов, представляющих текущую отслеживаемую сенсорную операцию.
- targetTouches: Массив объектов Touch, относящихся к цели события.
- changeTouches: Массив объектов Touch, представляющих, что изменилось с момента последнего касания.
Свойства, содержащиеся в каждом сенсорном объекте, следующие:
- clientX: X-координата сенсорной цели в окне просмотра.
- clientY: Координата Y сенсорной цели в окне просмотра.
- pageX: координата x сенсорной цели на странице.
- pageY: Координата Y сенсорного экрана на странице.
- screenX:screenX: X-координата точки касания на экране.
- screenY:screenX: X-координата точки касания на экране.
- identifier: Уникальный идентификатор, идентифицирующий касание.
- target:screenX: X-координата точки касания на экране.
Разобравшись с характеристиками сенсорных событий, приступим к увлекательной практической части.
реальный бой
Давайте реализуем перелистываемый индикатор выполнения для мобильных устройств с помощью сенсорных событий.
Начнем с макета HTML
<div class="progress-wrapper">
<div class="progress"></div>
<div class="progress-btn"></div>
</div>
Часть CSS опущена здесь
Получите элемент dom и инициализируйте начальную точку касания и расстояние от кнопки до левого края контейнера.
const progressWrapper = document.querySelector('.progress-wrapper')
const progress = document.querySelector('.progress')
const progressBtn = document.querySelector('.progress-btn')
const progressWrapperWidth = progressWrapper.offsetWidth
let touchPoint = 0
let btnLeft = 0
мониторtouchstart
мероприятие
progressBtn.addEventListener('touchstart', e => {
let touch = e.touches[0]
touchPoint = touch.clientX // 获取触摸的初始位置
btnLeft = parseInt(getComputedStyle(progressBtn, null)['left'], 10) // 此处忽略IE浏览器兼容性
})
мониторtouchmove
мероприятие
progressBtn.addEventListener('touchmove', e => {
e.preventDefault()
let touch = e.touches[0]
let diffX = touch.clientX - touchPoint // 通过当前位置与初始位置之差计算改变的距离
let btnLeftStyle = btnLeft + diffX // 为按钮定义新的left值
touch.target.style.left = btnLeftStyle + 'px'
progress.style.width = (btnLeftStyle / progressWrapperWidth) * 100 + '%' // 通过按钮的left值与进度条容器长度的比值,计算进度条的长度百分比
})
Посредством ряда логических операций наш индикатор выполнения в основном был реализован, но была обнаружена проблема.Когда положение касания выходит за пределы контейнера индикатора выполнения, возникает ошибка.Давайте сделаем некоторые ограничения.
if (btnLeftStyle > progressWrapperWidth) {
btnLeftStyle = progressWrapperWidth
} else if (btnLeftStyle < 0) {
btnLeftStyle = 0
}
До сих пор была реализована простая мобильная полоса прокрутки.