В iOS8 Safari появилась новая ошибка с исправлением положения.
Если вы сфокусируете текстовое поле, которое находится на фиксированной панели, Safari прокрутит вас до нижней части страницы.
Это делает невозможным работу со всеми видами пользовательских интерфейсов, поскольку у вас нет возможности вводить текст в текстовые поля, не прокручивая страницу до конца и не теряя свое место.
Есть ли способ исправить эту ошибку?
#a {
height: 10000px;
background: linear-gradient(red, blue);
}
#b {
position: fixed;
bottom: 20px;
left: 10%;
width: 100%;
height: 300px;
}
textarea {
width: 80%;
height: 300px;
}
<html>
<body>
<div id="a"></div>
<div id="b"><textarea></textarea></div>
</body>
</html>
Ответы:
Исходя из этого хорошего анализа этого вопроса, я использовал это
html
иbody
элементы в CSS:Думаю, у меня это отлично работает.
источник
transform: translateZ(0);
с stackoverflow.com/questions/7808110/...Лучшее решение, которое я мог придумать, - это переключиться на использование
position: absolute;
фокусировки и вычисление позиции, в которой он находился, когда он использовалposition: fixed;
. Хитрость в том, чтоfocus
событие срабатывает слишком поздно, поэтому егоtouchstart
нужно использовать.Решение в этом ответе очень точно имитирует правильное поведение, которое мы имели в iOS 7.
Требования:
body
Элемент должен иметь расположение для того , чтобы обеспечить правильное позиционирование , когда элемент переключается на абсолютное позиционирование.Код ( живой пример ):
Следующий код является базовым примером предоставленного тестового примера и может быть адаптирован для вашего конкретного варианта использования.
Вот тот же код без хака для сравнения .
Предостережение:
Если у
position: fixed;
элемента есть другие родительские элементы с позиционированиемbody
, переключение наposition: absolute;
может иметь неожиданное поведение. По своей природеposition: fixed;
это, вероятно, не является серьезной проблемой, поскольку вложение таких элементов встречается нечасто.Рекомендации:
Хотя использование
touchstart
события отфильтрует большинство сред рабочего стола, вы, вероятно, захотите использовать сниффинг пользовательского агента, чтобы этот код работал только для сломанной iOS 8, а не для других устройств, таких как Android и более старые версии iOS. К сожалению, мы еще не знаем, когда Apple исправит эту проблему в iOS, но я был бы удивлен, если она не будет исправлена в следующей основной версии.источник
Я нашел метод, который работает без необходимости менять абсолютное положение!
Полный код без комментариев
Разрушая это
Сначала вам нужно иметь фиксированное поле ввода в верхней части страницы в HTML (это фиксированный элемент, поэтому семантически имеет смысл располагать его в любом случае вверху):
Затем вам нужно сохранить текущую позицию прокрутки в глобальные переменные:
Затем вам нужен способ обнаружения устройств iOS, чтобы он не влиял на вещи, которые не нуждаются в исправлении (функция взята из https://stackoverflow.com/a/9039885/1611058 )
Теперь, когда у нас есть все необходимое, вот и исправление :)
источник
Мне удалось исправить это для входов выбора, добавив прослушиватель событий к необходимым элементам выбора, а затем прокрутив его со смещением в один пиксель, когда выбранный элемент получает фокус.
Это не обязательно хорошее решение, но оно намного проще и надежнее, чем другие ответы, которые я видел здесь. Кажется, что браузер повторно отображает / пересчитывает позицию: fixed; атрибут, основанный на смещении, указанном в функции window.scrollBy ().
источник
Как и предположил Марк Райан Салли, я обнаружил, что ключевым моментом является динамическое изменение высоты и переполнения моего фонового элемента - это не дает Safari возможности прокручивать.
Итак, после завершения анимации открытия модального окна измените стиль фона:
Когда вы закроете модальное окно, верните его обратно:
В то время как другие ответы полезны в более простых контекстах, моя DOM была слишком сложной (спасибо SharePoint), чтобы использовать замену абсолютной / фиксированной позиции.
источник
Чисто? нет.
У меня недавно была эта проблема с фиксированным полем поиска в липком заголовке, лучшее, что вы можете сделать на данный момент, - это постоянно сохранять позицию прокрутки в переменной и после выбора сделать фиксированное положение элемента абсолютным, а не фиксированным с помощью вершины позиция на основе позиции прокрутки документа.
Однако это очень уродливо и по-прежнему приводит к некоторой странной прокрутке вперед и назад перед тем, как приземлиться в нужном месте, но это самое близкое, что я мог найти.
Любое другое решение потребует переопределения механизма прокрутки по умолчанию в браузере.
источник
Не разобрался с этой конкретной ошибкой, но, возможно, поставил overflow: hidden; на теле, когда текстовая область видна (или просто активна, в зависимости от вашего дизайна). Это может привести к тому, что браузеру не будет «вниз» для прокрутки.
источник
Возможное решение - заменить поле ввода.
кодовый ключ
источник
Ни одно из этих решений не помогло мне, потому что моя модель DOM сложна и у меня есть динамические страницы с бесконечной прокруткой, поэтому мне пришлось создать свою собственную.
Предыстория: я использую фиксированный заголовок и элемент ниже, который остается под ним, когда пользователь прокручивает так далеко вниз. Этот элемент имеет поле ввода для поиска. Кроме того, у меня есть динамические страницы, добавленные во время прокрутки вперед и назад.
Проблема: в iOS каждый раз, когда пользователь нажимал на ввод в фиксированном элементе, браузер прокручивал страницу до самого верха. Это не только вызвало нежелательное поведение, но и привело к добавлению моей динамической страницы вверху страницы.
Ожидаемое решение: в iOS нет прокрутки (вообще нет), когда пользователь нажимает на ввод в липком элементе.
Решение:
Требования: JQuery mobile необходим для работы функций startroll и stopcroll.
Debounce включен, чтобы сгладить любую задержку, создаваемую липким элементом.
Проверено в iOS10.
источник
Я только что перепрыгнул через что-то подобное вчера, установив высоту #a на максимальную видимую высоту (высота тела была в моем случае), когда #b виден
пример:
ps: извините за поздний пример, только заметил, что это было необходимо.
источник
Теперь это исправлено в iOS 10.3!
Хаки больше не нужны.
источник
У меня была проблема, ниже строки кода разрешили ее для меня -
источник