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();
это работает лучше всего для меня на всех устройствах и браузерах.
У меня есть пара решений для вас. Вам придется протестировать их самостоятельно, так как я не пробовал их раньше в мобильном браузере, но вот они:
- Используйте jQuery's
.css()
метод (или.animate()
в зависимости от того, какая ваша конечная цель нам), отрегулировать верхнее поле (примечание: вам придется изменить переполнение на скрытое и обернуть текст во внутренний элемент div, который будет элементом, для которого вы настраиваете поле) - Сделайте то же самое, что и в первом решении, за исключением того, что установите положение встроенного 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 показывает, как это делается.
Единственный способ добиться прокрутки к верхней части страницы на вкладке 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()
вместо.
$('#yourFineElement').offset({ top: X, left Y)});