#ИМЯ?
Я работаю над веб-приложением, которое использует -webkit-overflow-scrolling:touch
в нескольких местах, чтобы прокрутить прокрутку прокрутки div.
Начиная с обновления до IOS8, -webkit-overflow-scrolling: touch
перестает прокручиваться, и единственный способ, которым я смог это исправить, заключается в удалении -webkit-overflow-scrolling: touch
, который оставляет стандартную липкую прокрутку. Пожалуйста, помогите!
Вот пример одного из стандартных классов, который работает в iOS5, 6 и 7:
.dashboardScroll {
height: 100%;
overflow-x: hidden;
overflow-y: scroll;
-webkit-overflow-scrolling: touch; /*MAKES OVERFLOWN OBJECTS HAVE INERTIA SCROLLING*/
-webkit-transform: translateZ(0px); /*HELPS THE ABOVE WORK IN IOS5*/
}
Ответы
Ответ 1
У меня была аналогичная проблема с (довольно сложным) вложенным прокручиваемым div, который отлично прокручивался в iOS 5, 6 и 7, но это прерывисто не удалось прокрутить в iOS 8.1.
Решение, которое я нашел, это удалить все CSS, которые обманывают браузер в использовании графического процессора:
-webkit-transform: translateZ(0px);
-webkit-transform: translate3d(0,0,0);
-webkit-perspective: 1000;
Таким образом, '-webkit-overflow-scrolling: touch;' все еще могут быть включены и по-прежнему функционируют как обычно.
Это означало жертвовать (для меня, сомнительных) успехов в прокручивании производительности, что вышеупомянутые хаки давали в ранних воплощениях iOS, но при выборе между этим и инерционным прокруткой прокрутка инерции считалась более важной (и мы надеемся 't поддержка iOS 5 больше).
На этом этапе я не могу сказать, почему этот конфликт существует; возможно, это плохая реализация этих функций, но я подозреваю, что что-то немного глубже в CSS, который вызывает это. В настоящее время я пытаюсь создать упрощенную конфигурацию HTML/CSS/JS, чтобы продемонстрировать ее, но, возможно, для нее требуется структура тяжелой разметки и большие объемы динамических данных.
Добавление: Я, однако, должен указать нашему клиенту, что если даже с этим исправлением пользователь начнет прокручивать прокручиваемый элемент, ей придется ждать секунду после останавливаясь перед тем, как прокручивать прокручиваемый элемент. Это собственное поведение.
Ответ 2
У меня была эта проблема и я нашел решение. Решение состоит в том, что вы должны поместить свой контент в два контейнера для ex:(. DashboardScroll > .dashboardScroll-inner) и предоставить внутренний контейнер ".dashboardScroll-inner" на 1px больше высоты, чем родительский .dashboardScroll ", пропустите этот css3 свойство
.dashboardScroll-inner { height: calc(100% + 1px);}
ознакомьтесь с этим:
http://patrickmuff.ch/blog/2014/10/01/how-we-fixed-the-webkit-overflow-scrolling-touch-bug-on-ios/
или иначе, если вы не можете добавить другой контейнер, используйте это:
.dashboardScroll:after { height: calc(100% + 1px);}
Ответ 3
У меня была такая же проблема в веб-приложении Кордовы. Для меня проблема заключалась в том, что у меня был родительский <div>
, который был анимирован и имел свойство animation-fill-mode: forwards;
Удаление этого свойства разрешило проблему и устранило разбитую переполненную прокрутку.
Ответ 4
Я не смог решить проблему с предыдущими ответами. Итак, через несколько часов я попросил библиотеку iScroll, iScroll. Я знаю, в том числе дополнительную библиотеку (и довольно значительную), чтобы добавить прокрутку только для iOS, это не здорово, но это то, что сработало для меня. Просто следуйте readme, достаточно облегченной версии.
Недостатки:
- Прокрутка на Android теперь выглядит как дерьмо, она больше не является родной.
- Невозможно обновить страницу, прокручивая больше
- Вам нужно применить другое исправление для Android: Клики не работают
Я не уверен, буду ли я использовать его, но если вы в этом нуждаетесь, отпустите его.
Ответ 5
Я пробовал все решения здесь без успеха. Я смог заставить его работать, имея свойство -webkit-overflow-scrolling: touch; в прокручиваемом div AND в родительском контейнере.
div.container {
-webkit-overflow-scrolling: touch;
}
div.container > div.scrollable {
-webkit-overflow-scrolling: touch;
overflow-y: auto;
}
Ответ 6
У меня были проблемы с этим, но в немного другом сценарии.
У меня есть свои divs с инерцией без проблем.
У меня есть простой JSFiddle, где вы можете посмотреть.
https://jsfiddle.net/SergioM/57f2da87/17/
.scrollable {
width:100%;
height:200px;
-webkit-overflow-scrolling:touch;
overflow:scroll;
}
Надеюсь, что это поможет.
Ответ 7
У меня была эта проблема при использовании модального wstwwwwww. Я исправил его, создав свою собственную таблицу стилей и удалив фиксированную ширину и маржу в запросах на медиа.
ОРИГИНАЛ:
.modal-dialog {
position: relative;
width: auto;
margin: 10px;
}
@media (min-width: 768px) {
.modal-dialog {
width: 600px;
margin: 30px auto;
}
.modal-content {
-webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);
box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);
}
.modal-sm {
width: 300px;
}
}
@media (min-width: 992px) {
.modal-lg {
width: 900px;
}
}
Изменения:
.modal-dialog {
margin: 0px;
margin-top: 30px;
margin-left: 5%;
margin-right: 5%;
}
@media (min-width: 768px) {
.modal-dialog {
width: auto;
margin-left: 10%;
margin-right: 10%;
}
.modal-content {
-webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);
box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);
}
}
@media (min-width: 992px) {
.modal-dialog {
width: auto;
margin-left: 15%;
margin-right: 15%;
}
}
Ответ 8
Я использовал последний метод в mohammed Suleiman answer (.dashboardScroll: после {height: calc (100% + 1px);}), но в результате у меня было пустое пространство 100% + 1px ниже моего содержимого. Я исправил это, изменив высоту до 1px после 500 мс. Ужасно, но он работает.
Это было приложение response.js, поэтому мой код был таким:
componentDidUpdate() {
if (window.navigator.standalone && /* test for iOS */) {
var self = this;
setTimeout(function(){
self.refs.style.innerHTML = "#content::after { height: 1px}";
}, 500);
}
}
и сделать:
render() {
var style = '';
if (window.navigator.standalone && /* test for iOS */) {
style = "#content::after { height: calc(100% + 1px)}";
}
return (<div>
<style type="text/css" ref="style">
{style}
</style>
<div id="content"></div>
</div>);
}