Ответ 1
Мой подход
Итак, я много пробовал, и я еще больше читал об этой проблеме. Я закончил с решением, которое "ОК" для меня (потому что оно работает), но которое определенно не близко к "совершенному".
При использовании этого 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
-issue: ( "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 );
});
Вещь с событием прокрутки на сенсорном устройстве состоит в том, что она срабатывает только тогда, когда прокрутка заканчивается, поэтому эта функция не запускается в любое время, а когда импульс подходит к концу. Короткое движение на самом деле не видно.
Итак, возможно, это полезно для кого-то.
Дополнительная информация
Вот еще несколько ссылок по этой проблеме:
-
О том, как событие scroll запускается в iOS:
-
Сообщение об ошибке для Apple:
-
iframe
пример с той же проблемой: