Обзор совместимости клавиатуры H5
В проектах H5 мы часто сталкиваемся с расположением одного или даже нескольких полей ввода/текстовой области и нижних фиксированных элементов на странице. Когда поле ввода ввода/текстовой области получает фокус, оно автоматически запускает всплывающую клавиатуру, но всплывающее окно клавиатуры не соответствует веб-просмотру ios и android, и есть также разница, когда мы активно запускаем клавиатуру свернуть. В любом случае, мы хотим, чтобы пользовательский интерфейс был как можно более последовательным, пока функция работает плавно, поэтому у нас есть следующая серия исследований проблем совместимости.
1. Различная производительность всплывающей клавиатуры
- IOS: Клавиатура IOS находится в верхнем слое окна, когда клавиатура всплывает, высота веб-просмотра не меняется, но меняется scrollTop, и страницу можно прокручивать. А максимальная прокручиваемая страница — это высота всплывающей клавиатуры, и только при прокрутке страницы вниз при всплывающей клавиатуре значение изменения scrollTop — это высота клавиатуры, иначе его нельзя получить. Это затрудняет получение реальной высоты клавиатуры в случае с IOS.
- Android: оставьте место в веб-просмотре, пространство меньше или равно пространству клавиатуры, разница в высоте изменения будет зависеть от макета, некоторые думают
键盘高度 + 页面高度 = 原页面高度;
неверно и вводит в заблуждение, эта формула может применяться только в некоторых очень случайных ситуациях компоновки.
2. Различная производительность втягивания клавиатуры
- IOS: когда кнопка на клавиатуре срабатывает, чтобы закрыть клавиатуру или область страницы за пределами поля ввода, поле ввода потеряет фокус, поэтому будет запущено событие размытия поля ввода.
- Android: когда кнопка на клавиатуре срабатывает, чтобы закрыть клавиатуру, поле ввода не теряет фокус, поэтому событие размытия страницы не срабатывает; когда срабатывает область за пределами поля ввода, поле ввода теряется сфокусируйтесь и вызовите событие размытия поля ввода.
3. Следите за всплывающими окнами и свертыванием клавиатуры
В настоящее время в h5 нет интерфейса для прямого наблюдения за событиями клавиатуры, но мы можем судить о том, находится ли клавиатура во всплывающем или убранном состоянии, анализируя процесс срабатывания и проявления всплывающих и убираемых клавиш.
- Всплывающее окно клавиатуры: когда поле ввода получает фокус, оно автоматически запускает действие всплывающей клавиатуры, поэтому мы можем прослушивать событие фокуса поля ввода и реализовать логику страницы, необходимую после всплывающей клавиатуры. Это ведет себя одинаково в ios и android.
- Отвод клавиатуры: как видно из части 2, различные формы запуска отвода клавиатуры будут иметь различную производительность.При активации других областей страницы для отвода клавиатуры мы можем отслеживать событие размытия поля ввода и осознавать результат после убирание клавиатуры. необходимая логика страницы. Когда клавиатура убирается с помощью кнопки клавиатуры, есть разница в производительности между ios и android.Ниже приводится подробный анализ:
- IOS: событие размытия поля ввода запускается, и оно по-прежнему отслеживается этим методом.
- Android: событие размытия поля ввода не запускается. Но из Частей 1 и 2 мы можем узнать, что в Android переключение состояния клавиатуры (всплывающее окно, свертывание) не только связано с полем ввода, но также влияет на изменение высоты веб-просмотра, поэтому мы также может отслеживать изменение высоты веб-просмотра, чтобы определить, закрыта ли клавиатура.
- IOS: событие размытия поля ввода запускается, и оно по-прежнему отслеживается этим методом.
Вот пример, где страница содержит поле ввода:
<div class="txd">
Welcome to TXD!
</div>
<div class="input">
<input id="input" type="tel" />
</div>
Всплывающее окно клавиатуры iOS и Android:
const $input = document.getElementById('input');
$input.addEventListener('focus', () => {
// 处理键盘弹出后所需的页面逻辑
}, false);
Клавиатура ios рухнула:
const $input = document.getElementById('input');
$input.addEventListener('blur', () => {
// 处理键盘收起后所需的页面逻辑
}, false);
Клавиатура Android появляется и закрывается:
/*键盘弹起后页面高度变小*/
const originHeight = document.documentElement.clientHeight || document.body.clientHeight;
window.addEventListener('resize', () => {
const resizeHeight = document.documentElement.clientHeight || document.body.clientHeight;
if (resizeHeight < originHeight) {
// 键盘弹起所后所需的页面逻辑
} else {
// 键盘弹起所后所需的页面逻辑
}
}, false);
На практике, какой метод использовать, определяется путем оценки userAgent:
const ua = window.navigator.userAgent.toLocaleLowerCase();
const isIOS = /iphone|ipad|ipod/.test(ua);
const isAndroid = /android/.test(ua);
4. Варианты использования
Вот несколько распространенных сценариев, основанных на приведенном выше обсуждении:
(1) Головное и среднее поля ввода находятся в обычном потоке документов, а нижний элемент зафиксирован.
Клавиатура iOS скрыта на странице, высота страницы остается неизменными, страница может прокрутить, а нижний элемент скрыта;
Высота страницы андроида уменьшена, страницу нельзя прокручивать, а базовой линией нижнего атрибута фиксированного элемента является клавиатура;
(2) Заголовок и поле ввода находятся в обычном потоке документов, и занимаемая видимая область становится больше, а нижний элемент фиксируется.
Высота ios не изменилась, и страницу можно прокручивать;
Высота страницы андроида становится меньше, но для того, чтобы элементы обычного документооборота отображались нормально, страницу можно прокручивать вверх и вниз, а базовой линией нижнего атрибута фиксированного элемента является клавиатура;
(3) Головка находится в обычном потоке документов, а поле ввода находится вне нормального потока документов, фиксированное нижнее положение
(Для удобства наблюдения выше фон оборачивающего элемента поля ввода установлен на прозрачность)
Высота ios не изменилась, а поле ввода всегда гарантированно находится в видимой области;
Высота страницы андроида становится меньше, страницу нельзя прокручивать, а базовой линией нижнего атрибута фиксированного поля ввода является клавиатура;
5. Резюме
- В ios не важно какая раскладка, чтобы поле ввода отображалось в видимой области, при всплытии клавиатуры страница будет прокручиваться вверх.Прокрутка в видимую область окна браузера) выдает одно и то же эффекта; высота остается прежней, а страницу можно прокручивать.
- В андроиде после пробуждения клавиатуры возможность прокрутки страницы определяется ее элементами в обычном потоке документов: если элементы в обычном потоке документов могут отображаться полностью, страница не может быть прокручена, иначе страница поддерживает прокрутка;
- В Android после вызова клавиатуры ссылка на фиксированный элемент изменится: элемент, расположенный в соответствии с нижним положением, изменится на верхнюю часть клавиатуры; элемент, расположенный в соответствии с верхним, по-прежнему соответствует верхней части страницы, поэтому чтобы позаботиться о нормальном потоке документов и взаимодействии с пользователем фиксированного элемента, некоторые элементы можно расположить в соответствии с верхним положением, а некоторые — в соответствии с нижним.
Гораздо проще решать проблемы совместимости, когда вы понимаете всплывающую природу клавиатуры в h5. В то же время вы также можете использовать метод Element.scrollIntoViewIfNeeded() для решения проблем (например, при переключении между различными методами ввода, что может привести к блокировке полезной информации) для оптимизации работы.