67. СПАСИБО!
Иван Чашкин, Егор Дыдыкин
Front-end разработчики
i.chashkin@corp.mail.ru e.dydykin@corp.mail.ru
Editor's Notes
Свайп, в простонародье – листалка. Позволяет листать из стороны в сторону «страницы» посредствам привычного движения пальцем.(ДЕМО)
Специально для работы с тач устройствами ввода в браузерах реализованы событияНо не все браузеры на тач устройствах их поддерживают
Эмуляция через мышиныеОблом - WP
Стандартная последовательность
Облом – WPПотому swipe реализован только на тач событиях. (ДЕМО)
В тач событие падает информация о касаниях:touches - все касания, ассоциированные с событиемchangedTouches - касания, по которым есть измененияtargetTouches - касания, ассоциированные с target события
Каждому касанию присваивается уникальный идентификатор. В разных браузерах может иметь различные значения, в одних постоянно инкрементируется, в других сбрасывается, когда прикосновений больше нет.Так же объект касания содержит информацию о координатах - относительно вьюпорта (client), экрана (screen) и страницы (page).
проверяем флаг started (не был ли уже начат свайп) и кол-во touches. Если свайп уже идет или toches не один, значит пользователь орудует несколькими пальцами и реагировать на это не надо, а значит return
Запоминаем текущее касание и координатыставим флаг detecting = true, что далее на touchmove надо определить, хотел ли пользователь сделать свайп или он просто прокручивает страницу или тапнул по ссылке
первым делом проверяем, если не стоит ни started, ни detecting, не делаем ничего. Не наш случай
определяем смещение пальца относительно сохраненного касания. Если смещение больше по оси х, чем по у, значит пользователь листает
отменяем поведение по умолчанию, started = trueВ любом случае detecting = false (ДЕМО)
В любом случае detecting = false
отменяем поведение по умолчанию
восстанавливаем интересующее нас касание по идентификатору из changedTouches.Если восстановить не удалось - return
Вычисляем смещение пальца по оси х
Если свайпить некуда, делим смещение на некоторый “коэффициент сопротивления”, делая тем самым вид, что блок как бы сопротивляется движению, чтобы дать пользователю понять, что листать некуда
отрисовываем смещение блока
восстанавливаем интересующее нас касание по идентификатору из changedTouches. Если восстановить не удалось - return
Отменяем действие по-умолчанию (ДЕМО)если этого не сделать, и в блоке к которому мы пролистываем по текущим координатам окажется ссылка, по ней произойдет кли
устанавливаем направление свайпа
Анимируем пролистываниепролистываем блок в нужную сторону
Для того, чтобы сделать листалку, нужно расположить страницы в рядСтраницы же были разбиты на 3 логичные группы:страницы слевацентральная страницы - всегда однаи страницы справа
Каждая из страниц должна быть шириной не больше не меньше родителя.
центральная всегда видна, левые смещены на 100% влево, а правые - на 100% вправо.
Чтобы получить ширину страницы 100% родителя, нужно каким-то образом задать ширину всей таблицы в <колво страниц>*100%, и самим страницам в 100%/<колво страниц>, что без дополнительных JS манипуляций не возможно и грозит погрешностями и неровностями, а так же дополнительными расчетами.
Обертке блока указали высоту, position:relative и overflow:hidden, снизив нагрузку на браузер
нужно максимально обособить страницы друг от друга – каждой страницы указаны position:absolute; и соответствующие координаты и размеры.
Анимируются страницы средствами CSS - transition. (ДЕМО)Если анимировать left, получается очень медленно. Гораздо быстрее работает translate, а еще быстрее translate3d из css-трансформаций.
страницам указан left:0 и оба варианта translateсо значениями смещения по горизонтали -100%, 0 и 100%
Стопки слева и справа
Следующие правая и левая
Изначально анимации выключен, по событию touchmove для страницы устанавливается translate, со значением смещения по горизонтали равным смещению пальца
Одновременно двигаются три страницы - текущая видимая и по странице слева и справа. для правой и левой страниц смещение равноширине страницы с соответствующим положению знаком (для правой плюс, для левой минус) плюс смещение пальца.
По событию touchend или touchcancel страницам устанавливается класс swipe__page_animating, включающий css-анимации, И финальные смещенияЛибо возвращаем все назад, либо пролистываем
На событииtransitionEndотключаются анимацииЗаново выбираются next страницыУстанавливаются новые классы принадлежности к группам
Удаляются установленныеинлайновые стилиИ очищаются установленные флаги вроде startedВозврат к исходному состоянию(ДЕМО)
Например, в случае блока новостей, на примере которого я рассказываю о свайпе, мы сделали привычные всем табы. Пользователь может тапнуть по закладке и перелистнуть страницу.