медленная прокрутка списка на iPad при прокрутке в переполнении: auto div - PullRequest
21 голосов
/ 30 марта 2012

Я разрабатываю приложение Phonegap для основных платформ os и в настоящее время тестирую его на iPad с iOS 5. Я использую jquery mobile. Так что для больших экранов я использовал мобильный плагин splitview jquery. http://asyraf9.github.com/jquery-mobile/
Я положил

$scrollArea.css('overflow-y','auto');        
$scrollArea.css('-webkit-overflow-scrolling','touch');

, чтобы сделать прокрутку страницы вместо использования iscroll, как это делал плагин. Теперь, что происходит, это то, что страница не загружается / перерисовывается, когда пользователь прокручивает. У меня есть список из 100 элементов, и я прокручиваю их.

Сама прокрутка не медленная, но занимает почти целую секунду, чтобы новые строки списка отображались после прокрутки. До этого это пустое место.

Наблюдая, я вижу, что элементы списка не появляются, пока прокрутка не остановилась. (прокрутка импульса)

Подобная проблема здесь http://forum.jquery.com/topic/help-with-slow-list-view-scrolling-on-ipad-when-scrolling-in-an-overflow-auto-div

Что я могу сделать, чтобы это нормально работало ?? То же самое хорошо работает на вкладках Android. Пожалуйста, помогите.

РЕДАКТИРОВАТЬ: Если я использую только

 $scrollArea.css('overflow-y','auto');        

тогда я не сталкиваюсь с проблемой мгновенных пустых областей после прокрутки, но тогда прокрутка мучительно медленная.

Пожалуйста, не предлагайте использовать iScroll. Уже попробовал это. гораздо медленнее, чем то, что я получаю с -webkit-overflow-scrolling, и я не могу его использовать.

Ответы [ 2 ]

23 голосов
/ 06 июля 2012

Мой подход

Итак, я много пробовал и читал еще больше об этой проблеме.В итоге я нашел решение, которое мне подходит (потому что оно работает), но определенно не близко к «идеальному».

При использовании этого CSS:

.container {
    overflow:                   scroll;
    -webkit-overflow-scrolling: touch;
}

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

Итак, что же случилось?В основном это CSS:

.container > * {
    -webkit-transform:          translate3d(0,0,0);
}

С этим правилом контент почти все время воспроизводился без получения этих пустых областей.Только при быстрой прокрутке вниз в первый раз она слегка мерцает.

Но будьте осторожны с правилом -webkit-transform: translate3d(0,0,0);.Использование этого правила во многих дочерних элементах вынуждает Safari: иногда замедляться, но почти все время вылетать.Лучше всего обернуть все элементы содержимого в один div, отлично работает.

Готово? Не совсем.По-прежнему существует вопрос iframe: ("argh")

iframe

Когда iframe не полностью находится в видимой части контейнера в начале, он обрезается илидаже не отображается вообще.Иногда это может происходить и при прокрутке.Итак, я попытался заставить Safari перерисовать эту часть в любое время после завершения прокрутки и придумал следующее:

//using jQuery
var container   = $('#container');
var iframe  = $('#iframe');
container.scroll( function (event) {
    iframe.css( 'marginLeft', 1 );
    setTimeout( function() {
        iframe.css ( 'marginLeft', 0 );
    }, 1 );
});

С событием прокрутки на сенсорном устройстве связано то, что оно срабатывает только тогда, когдапрокрутка подошла к концу, поэтому эта функция не запускается в любое время, но когда импульс заканчивается.Короткое движение на самом деле не видно.

Итак, может быть, это кому-нибудь пригодится.

Дополнительная информация

Вот еще несколько ссылок по этому вопросу:

1 голос
/ 04 апреля 2012

Мы использовали плагин ниже в нашем проекте, вы пробовали этот?

https://github.com/jquery/jquery-mobile/tree/master/experiments/scrollview

В iOS для визуализации прокрутки используется аппаратное ускорение. Его довольно просто использовать, все, что вам нужно сделать, это назначить дополнительный класс вашему div.

У нас были некоторые проблемы на Android 2 с этим плагином, для преодоления этих проблем мы изменили свойство scrollMethod в jquery.mobile.scrollview.js.

Надеюсь, это поможет вам решить проблему с прокруткой

...