Свойство CSS3 webkit-overflow-scrolling: touch ERROR
iOS 5 выпустила веб-дизайнеров новое свойство -webkit-overflow-scrolling:touch
, которое использует аппаратный ускоритель устройств iOS для обеспечения прокрутки прокрутки для прокручиваемого div.
При внедрении на нашем сайте в разработке он работает, но не очень хорошо. Я считаю, что может возникнуть проблема с CSS, поэтому я прошу здесь.
Следующий fiddle покажет вам, что он отлично работает
Если вы перейдете на наш сайт в разработке, вы найдете ту же панель на вкладке "Средства", но на iOS, хотя прокрутка идеальна, переполненный раздел не отображается с картинками, буквально расколотыми на две части.
http://www.golfbrowser.com/courses/mill-ride/
Я не знаю, как это исправить
http://www.golfbrowser.com/photo.PNG
Ответы
Ответ 1
Как отметил @relluf, применение трехмерных переходов на относительном элементе исправляет ошибку. Тем не менее, я исследовал его немного дальше, и кажется, что применение -webkit-transform: translateZ(0px)
тоже работает (это то, что Google делает в контейнере карт gmaps), и ему не нужно находиться на относительно позиционированном элементе, просто прямой потомок прокручиваемого элемента.
Итак, если вы не хотите вручную сохранять список всех мест, где требуется исправление, вы можете просто:
element {
-webkit-overflow-scrolling: touch;
}
element > * {
-webkit-transform: translateZ(0px);
}
Ответ 2
Какого пугателя они пустили сюда. Пробовал все способы обхода, пока я не нашел единственное свойство, необходимое для правильного отображения элементов в -webkit-overflow-scrolling:touch
div: position: static
Относительные и абсолютные позиционированные элементы всегда обрезаются на границе и полностью отсутствуют (за исключением пустого пространства) вне его. Если вы изменяете свойство позиции динамически, от статического до абсолютного, только видимая часть просматриваемого окна просмотра прокручивается в любом месте, где бы ни было смещение.
Ответ 3
Я столкнулся с этой ошибкой. Я исправил его, применив следующие css к родительским элементам:
-webkit-transform: translate3d(0, 0, 0);
Тем не менее, я заметил, что это замедляет рендеринг и может выбирать другие элементы ввода, чем требуется, когда прокрученный элемент ввода прокручивается в центр представления (через Safari/iOS).
Ответ 4
Я глубоко исследовал эту ошибку, я также создал jsfiddle и отправил ее Apple в отчет об ошибке. Посмотрите: iOS5. При прокрутке с помощью прокрутки webkit-изображений переходят изображения: коснитесь
Как только Apple ответит мне, я сообщу об этом по этой теме, чтобы вы могли оставаться в курсе этой очень раздражающей ошибки
Ответ 5
Я также столкнулся с проблемой, когда переполнение переполнения с нажатием -webkit-overlfow-scrolling, касающимся касания, привело к проблемам с перерисованием с позиционируемыми элементами. В моем случае у меня был список, в котором отдельные элементы имели относительное позиционирование, чтобы я мог использовать позиционирование для своих дочерних элементов. С приведенным выше CSS на iOS 5, когда пользователь просматривал скрытый контент в представлении, была мгновенная задержка, прежде чем он перерисовал экран для просмотра элементов. Это было очень неприятно. К счастью, я обнаружил, что если бы я предоставил родительскую позицию node как относительную, это было разрешено.
Ответ 6
Ошибка все еще сохраняется в iOS 6. Если ваша проблема связана с position: relative
, вы можете решить проблему, устанавливая временно z-index: 1
через JS. -webkit-transform: translate(...)
не работал с position: relative
в моем случае.
Ответ 7
В iOS, когда элемент внутри элемента с -webkit-overflow-scrolling: touch
установлен абсолютно (или fixed
) относительно элемента вне контейнера прокрутки, элемент отображается только один раз, и рендеринг не обновляется как элемент прокручивается. Пример HTML:
<div class="relative-to-me">
<div class="scrollable">
<div class="absolutely-positioned">
</div>
</div>
</div>
Если вы принудительно перенаправляете, изменяя свойство CSS (например, в инспекторе), вы можете видеть, что позиционирование элемента повторно отображается в правильное местоположение. Я подозреваю, что это результат некоторых характеристик производительности для оптимизации производительности прокрутки.
Решение этой проблемы - установить will-change: transform
на абсолютно (или фиксированный) позиционированный элемент.
.absolutely-positioned {
will-change: transform;
}
Ответ 8
Я пробовал несколько разных решений, казалось, не работал отлично в моем случае.
Наконец, я нашел способ отлично работать с jQuery:
Применить -webkit-overflow-прокрутку свойство каждый раз, когда вы касаетесь.
* Сначала я использовал также -webkit-overflow-scrolling: auto, когда TouchDown, чтобы отключить рендеринг iOS. Но это заставило страницу мигать. Поэтому я отбросил его, а затем отлично работал на удивление!
Проверьте строки ниже, надеюсь, что это поможет:
<!-- 🍉 JQuery Functions-->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script type="text/javascript">
//🍋 Apply -webkit-overflow-scrolling in Every TouchEnd
$(document).on('click touchend', function(event) {
$("#TestDIV").css({"-webkit-overflow-scrolling":"touch"});
});
</script>
<!-- 🍉 html Elements & Style -->
<div id="TestDIV">
<div class="Element"></div>
<div class="Element"></div>
<div class="Element"></div>
<div class="Element"></div>
<div class="Element"></div>
</div>
<style>
#TestDIV{
white-space: nowrap;
overflow-x: scroll;
-webkit-overflow-scrolling:touch;
}
#TestDIV .Element{
width:300px;
height:300px;
margin: 2px;
background-color: gray;
display: inline-block;
}
#TestDIV .Element:nth-child(odd){
background-color: whitesmoke;
}
</style>