jQuery scrollTop() не работает при прокрутке DIV на мобильных браузерах, альтернативы?

Я пытаюсь прокрутить в определенное место прокрутки DIV. Прямо сейчас я использую смещение в пикселях с помощью функции jQuery scrollTop(), которая отлично работает в браузерах настольных компьютеров, но не работает в браузерах на мобильных устройствах Android, за исключением браузера Google Chrome Android (у меня нет устройства iOS для проверки работоспособности).). Все решения, которые я нашел, предназначены для прокрутки страниц (окон), а не для прокрутки в DIV. У кого-нибудь есть предложения относительно того, что еще я могу использовать для выполнения той же задачи?

Вот пример:
http://jsfiddle.net/aQpPc/
http://jsfiddle.net/aQpPc/embedded/result/

Другие вещи, которые я пробовал, работают в настольных браузерах:

document.getElementById('ID_of_element_in_a_DIV').scrollIntoView();
document.getElementById('ID_of_DIV').scrollTop = 200;

РЕДАКТИРОВАТЬ 3/11/13:

Это известная проблема браузера Android: https://code.google.com/p/android/issues/detail?id=19625

Один пользователь в отчете об ошибке предложил обходной путь:

поскольку проблема возникает только тогда, когда свойство переполнения установлено на прокрутку, вы можете сначала установить его в "скрытый", установить свойство scrollTop, а затем вернуть его обратно в "прокрутку" (или автоматически). Свойство scrollTop, по-видимому, учитывается при повторной визуализации элемента с помощью полос прокрутки. Не ясно, есть ли у этого неожиданные побочные эффекты, но "это работает на моей машине!"

14 ответов

Это сработало для меня:

setTimeout( function() {
    $(div).scrollTop(0)
}, 500 );

Обходное решение, которое сработало для меня: сначала временно установите свойство переполнения на "скрытый", затем установите свойство scrollTop, а затем снова установите свойство переполнения на "прокрутка" (или автоматически). Значение scrollTop, кажется, остается неизменным и учитывается, когда для свойства переполнения возвращается значение "scroll". Это был довольно тривиальный обходной путь, который работал во всех браузерах, на которых я тестировал (на компьютере и на мобильном устройстве). Я не тестировал это полностью, и я не тестировал с переходами на месте, поэтому могут быть побочные эффекты, с которыми я не сталкивался... Ваш пробег может варьироваться - но это легко попробовать.

Я нашел ответ здесь http://blog.jonathanargentiero.com/jquery-scrolltop-not-working-on-mobile-devices-iphone-ipad-android-phones/

Мобильные телефоны не понимают $('html,body') так что вы можете сделать следующее для мобильного

if(navigator.userAgent.match(/(iPod|iPhone|iPad|Android)/)) {           
    window.scrollTo(0)
} else {
    // default `$('html,body')` code for scrolling
}

ИЛИ ЖЕ

просто используйте $('body') вместо $('html, body'),

Вместо того чтобы использовать методы scroll, scrollTo или scrollTop (которые доставляют мне проблемы с мобильными устройствами), я рекомендую установить идентификатор для вашего верхнего элемента DOM (например, #top) и просто использовать:

document.getElementById("top").scrollIntoView();

это работает лучше всего для меня на всех устройствах и браузерах.

У меня есть пара решений для вас. Вам придется протестировать их самостоятельно, так как я не пробовал их раньше в мобильном браузере, но вот они:

  1. Используйте jQuery's .css() метод (или .animate() в зависимости от того, какая ваша конечная цель нам), отрегулировать верхнее поле (примечание: вам придется изменить переполнение на скрытое и обернуть текст во внутренний элемент div, который будет элементом, для которого вы настраиваете поле)
  2. Сделайте то же самое, что и в первом решении, за исключением того, что установите положение встроенного div относительно и отрегулируйте его top приписывать.

Дайте мне знать, если вам нужна помощь, если у вас есть, или у вас есть еще вопросы по этому поводу. Удачи!:)


Обратите внимание, что хотя я не проверял их на мобильных устройствах до того, как они основывались на стандартах CSS, а не на функциях jQuery, они должны работать.

Временная настройка overflow свойство 'hidden', как рекомендовано в ответе @Allan Nienhuis, не работает на Android 4.0.3 например (что, например, работает Kindle Fire 2) - когда вы устанавливаете overflow вернуться к scroll элемент прокручивается обратно наверх.

Альтернативы:

  • Прокрутите свою собственную прокрутку с помощью вспомогательной функции, как показано здесь - хотя это и просто реализовать, но это просто, поскольку она не дает вам инерционную прокрутку или избыточную прокрутку.

  • Используйте такую ​​библиотеку, как iScroll, которая реализует собственную сложную прокрутку (инерционную, избыточную прокрутку) на основе CSS-преобразований.

Использование iScroll требует некоторой настройки: вам нужна оболочка div с фиксированной высотой и стилем overflow: hidden и элемент для прокрутки не должен иметь overflow стиль. Эта демонстрация jsFiddle показывает, как это делается.

Ты пробовал это?

$("html").scrollTop(0);

Единственный способ добиться прокрутки к верхней части страницы на вкладке Galaxy - это скрыть страницу. body на 100 мс при прокрутке. Используя jQuery:

$("body").hide();
window.scrollTo(0, 0);
setTimeout(function(){ $("body").show() }, 100);

Эти решения не работают для меня. Я знаю, что кто-то упоминал мобильное обнаружение, но их подход не работал для меня. Наконец-то меня осенило использовать мобильное обнаружение для предоставления двух разных стилей CSS для каждого случая. Может быть, не идеально, но это точно работает. Временное изменение стилей с помощью js, также предложенное выше, у меня не сработало.

У меня был двухколонный макет с независимой прокруткой div, каждый из которых был настроен на переполнение: прокрутка, а тело должно было быть настроено на переполнение: скрыто. Мне нужно использовать scrollTop на одном из столбцов, и никакие решения не сработали.

Я использовал wp_is_mobile() (функция Wordpress), и если mobile true, overflow: hidden удаляется из тела, а div с overflow: scroll удаляют этот css. Наконец, scrollTop работал на мобильном телефоне.

jQuery(document).ready(function($) {

$(".scroll").click(function(event){     
    event.preventDefault();
    $('html,body').animate({scrollTop:$(this.hash).offset().top}, 1500);
});
});

<a href="#top" class="scroll"></a>

Используйте следующий код:

$("body").animate( { scrollTop: 50,  },  800,  function(){
    $("body").clearQueue();
} );

Попробуйте использовать метод janu.animate:

$('.div').animate({ scrollTo: x; });

Где x равно положению div, который вы хотите прокрутить к вершине.

У меня была такая же проблема, и я решил ее с помощью jquery .offset() вместо.

http://api.jquery.com/offset/

$('#yourFineElement').offset({ top: X, left Y)});
Другие вопросы по тегам