Элегантно предотвращает движение неподвижного элемента при открытии виртуальной клавиатуры - PullRequest
1 голос
/ 22 февраля 2020

Для веб-приложения, которое я поддерживаю, я недавно представил фиксированную нижнюю строку меню. Через position:fixed это меню остается прикрепленным к нижней части области просмотра , когда пользователь выполняет прокрутку.

Однако, когда пользователь сталкивается с полем textarea или input и пытается focus заполнить его, виртуальная клавиатура открывается, толкая вышеупомянутую фиксированную строку меню вверх. Несколько раз этот механизм c заканчивал тем, что полностью охватывал textarea или input, что порождает огромную проблему юзабилити.

Чтобы исправить это, я написал простое чистое решение JS, в котором я установил position:fixed на position:absolute на focus и вернул его на position:fixed на blur. Решение было подробно рассмотрено в этом ТАК вопросе.

Это решает проблему до некоторой степени, но решение ошибочно c. Позвольте мне показать вам, как.


Следующий код реализует решение, которое я объяснил выше. Запустите фрагмент кода. Затем сфокусируйте textarea прямо под Sample text 2. Это переключает нижнюю строку меню с fixed на absolute, и это вызывает неприятный визуальный скачок. Это усугубляется, если вы попробуете то же самое в textareas ниже.

Как мне избежать неприятного визуального прыжка? В идеале я хочу, чтобы навигационная панель fixed переключалась на absolute таким образом, чтобы она продолжала прилипать к нижней части моего окна просмотра. Это возможно? Хотелось бы увидеть пример от экспертов в этом отношении.


var input_btns = document.getElementsByClassName('inp');// selecting all textareas or inputs for processing (e.g. making fixed bottom menu 'absolute')
for (var i=0, len=input_btns.length; i < len; i++) {
	input_btns[i].onfocus = () => {
		var bottom_nav = document.getElementById("bottom_nav")
		bottom_nav.classList.remove('fix-it');
      	bottom_nav.classList.add('abs-it');
	}
	input_btns[i].onblur = () => {
		var bottom_nav = document.getElementById("bottom_nav")
		bottom_nav.classList.remove('abs-it');
      	bottom_nav.classList.add('fix-it');
	}
}
.fix-it{
		position: fixed;
	}
	.abs-it{
		position: absolute;

	}
<div>
Sample text 1<br><br>

<textarea class="inp" style="width:100%"></textarea>

</div>
<div>
Sample text 2<br><br>

<textarea class="inp" style="width:100%"></textarea>

</div>
<div>
Sample text 3<br><br>

<textarea class="inp" style="width:100%"></textarea>

</div>
<div>
Sample text 4<br><br>

<textarea class="inp" style="width:100%"></textarea>

</div>
<div>
Sample text 5<br><br>

<textarea class="inp" style="width:100%"></textarea>

</div>
<div>
Sample text 6<br><br>

<textarea class="inp" style="width:100%"></textarea>

</div>
<div>
Sample text 7<br><br>

<textarea class="inp" style="width:100%"></textarea>

</div>
<div id="bottom_nav" class="fix-it" style="background:coral;z-index:89;bottom:0;height:56px;width:100%;text-align:center;border-top:1px solid #dddddd">
BOTTOM MENU BAR
</div>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...