Pull to refresh
796.44
Яндекс
Как мы делаем Яндекс

yaTouchSlider — слайдер для тач-устройств

Reading time2 min
Views14K
QR-код на результаты поиска по слову «Погода»На многих известных нам мобильных сайтах для тач-устройств слайдеры (листалки) устроены так, что анимация происходит уже после свайп-жеста, после того как человек убрал палец. Это не так красиво и не так удобно, как в нативных слайдерах, например, на главных экранах iOS-устройств.

Мы сделали jQuery-плагин, который помогает сделать слайдер похожим на нативный, и хотим поделиться им со всеми заинтересованными. Посмотреть на работу плагина можно, например, в ответе погоды или картинок на новой странице результатов поиска для iPhone и iPod Touch.

В отличие от обычного CSS3 Transform, «3D» задействует аппаратное GPU ускорение в iOS. Это позволяет добиться очень плавной и приятной анимации. Сама тема аппаратного ускорения анимации достаточно обширна, в будущем на эту тему будет отдельная статья.

Чтобы слайдер ощущался нативным, мы учли множество мелочей:
  • если свайп-жест длинный, сразу на несколько пунктов, то слайдер это поймёт;
  • если свайпнуть меньше, чем на один шаг, при этом не преодолев заданный порог (по умолчанию 30 пикселей), то слайдер «отпружинит» назад;
  • слайдер так же отпружинит назад при попытке свайпнуть за левый или правый предел.

Зависимость от скорости жеста


Чтобы слайдер вёл себя более живо и соответствовал ожиданиям от жеста, мы научили его понимать ускорение. Оно рассчитывается по следующей формуле (условия и значения для неё подбирались экспериментально):

accel = speed > 0.3 && speed < 0.6 ? 2 :
speed >= 0.6 && speed < 1 ? 3 :
speed >= 1 ? 4 :
1;


Где speed — расстояние от начала до конца свайп-жеста, делённое на его время (школьные знания «v = s / t» наконец-то пригодились :)

Среднестатистический свайп-жест — примерно 0.4-0.6 пикселей в миллисекунду. Есть совсем небольшой, но всё же заметный разброс во времени анимации CSS Transition:

animationTime = accel >= 3 ? '0.3' : '0.2';

После него шаг умножается на значение акселерации и происходит анимация.

Внешнее API


При навешивании слайдера на блок можно указать callback-функцию. Она будет вызываться при каждом свайпе с пробрасываемым набором всех необходимых данных — скорость, шаг, пределы, время и прочее. Также слайдер можно подвинуть и без помощи пальца, затриггерив на блок слайдера события slideLeft([шаг]) или slideRight([шаг]).

“Fork us on GitHub”


Посмотреть или скачать код плагина с комментариями можно в репозитории проекта на Гитхабе.

P.S.: Приглашаем всех заинтересованных в официальный блог разработчиков интерфейсов Яндекса.
Tags:
Hubs:
Total votes 40: ↑39 and ↓1+38
Comments16

Articles

Information

Website
www.ya.ru
Registered
Founded
Employees
over 10,000 employees
Location
Россия