принудительная остановка прокрутки импульса на iphone/ipad в javascript

Можно ли принудительно остановить прокрутку импульса на iphone/ipad в javascript?

Дополнительно: почти уверен, что это журавль в небе, но за бонусные баллы (честь и славу) после манипулирования домом и применения scrollTo возобновите прокрутку с тем же импульсом до принудительной остановки. Как?


person Geert-Jan    schedule 19.04.2013    source источник
comment
Вы пытались установить положение прокрутки и отключить переполнение для тела/html? Возобновление прокрутки также возможно, просмотрите события прокрутки перед остановкой и рассчитайте свой dy. Однако вам нужно будет получить хорошую оценку значения трения (насколько быстро оно замедляется).   -  person Halcyon    schedule 19.04.2013
comment
Если я правильно понял ваш вопрос, я думаю, что ответил на него здесь: переполнение-прокрутка   -  person insertusernamehere    schedule 19.04.2013
comment
Хорошо, ребята, спасибо. Пробуем, насколько реально получить последний dy и уйти оттуда.   -  person Geert-Jan    schedule 19.04.2013
comment
да, действительно, как предложил @insertusernamehere, scrolltop доступен только после остановки прокрутки. Мне нужно это как индикатор для начала принудительной остановки скроллера, так что это не представляется возможным. хм. Спасибо в любом случае!   -  person Geert-Jan    schedule 19.04.2013


Ответы (3)


На самом деле это вполне возможно при использовании fastclick.js. Библиотека устраняет задержку клика в 300 мс на мобильных устройствах и позволяет захватывать события во время прокрутки по инерции/импульсу.

После включения fastclick и присоединения его к элементу body мой код для остановки прокрутки и перехода наверх выглядит так:

scrollElement.style.overflow = 'hidden';
scrollElement.scrollTop = 0;
setTimeout(function() {
  scrollElement.style.overflow = '';
}, 10);

Хитрость заключается в том, чтобы установить overflow: hidden, который останавливает прокрутку инерции/импульса. Пожалуйста, посмотрите мою скрипку для полной реализации остановить прокрутку во время инерции/импульса.

person Patrick Rudolph    schedule 05.02.2014
comment
Сброс переполнения на скрытый, а затем обратно на автоматический или прокрутку — надежное решение без использования fastclick.js. Только не забудьте про тайм-аут! - person abriggs; 25.11.2014
comment
Это первый ответ, который я нашел простым и работает в разных браузерах. Обратите внимание, что timeOut нельзя установить на 0 - person Alexei Darmin; 29.12.2016
comment
Установка overflow: hidden сделает прокрутку в пользовательском интерфейсе невосприимчивой. - person Haslo Vardos; 14.10.2019

Вот мой код, использующий анимацию jQuery (выполняется как событие onclick)

var obj=$('html, body'); // your element

if(!obj.is(':animated')) {

    obj.css('overflow', 'hidden').animate({ scrollTop: 0 }, function(){ obj.css('overflow', ''); });

}

Проверено на айфоне 6

person Jan Šafránek    schedule 28.01.2016

Я нашел способ ОТМЕНИТЬ прокрутку импульса BODY, назначив свойство html.scrollTop событию touchend. Выглядит так:

let html = document.querySelector('html');
window.addEventListener( 'touchend', function( e ){
    html.scrollTop = html.scrollTop;
});

Протестировано на iOS 13

UPD: Приведенное выше решение не работает в iOS 12, потому что фактический элемент прокрутки в этой версии не является «html».

Код ниже работает как для 12, так и для 13:

window.addEventListener( 'touchend', function( e ){
    window.scroll( 0, window.scrollY );
});
person Yuriy Polezhayev    schedule 14.11.2019