Я знаю атрибут autofocus
:
<input type = "email" id = "hello" placeholder = "[email protected]" autofocus>
для автоматической установки фокуса на ввод HTML.
Но когда страница намного выше высоты браузера, есть ли способ (со специальным значением autofocus
?) автоматически устанавливать фокус на поле только тогда, когда после прокрутки <input>
появляется в области просмотра / в текущей видимой части страница?
function handleScroll() {
var el = document.getElementById('hello')
var rect = el.getBoundingClientRect();
var elemTop = rect.top;
var elemBottom = rect.bottom;
// Only completely visible elements return true:
var isVisible = (elemTop >= 0) && (elemBottom <= window.innerHeight);
// Partially visible elements return true:
//isVisible = elemTop < window.innerHeight && elemBottom >= 0;
if (isVisible) el.focus();
}
<body onscroll = "handleScroll()" style = "overflow: scroll;">
<input id = "hello" type = "email" placeholder = "[email protected]" style = "margin-top: 500px; margin-bottom: 200px;" />
</body>
Еще одна вещь @prime: допустим, ввод находится в области просмотра. Он имеет фокус. Пользователь не заинтересован, поэтому он щелкает за пределами ввода, чтобы выйти из фокуса. Тогда каждая маленькая прокрутка (даже на 1 пиксель!) снова возвращает фокус на ввод, это может раздражать пользователя! У вас есть идея по этому делу? «Если ввод уже был в окне просмотра раньше, но теперь у него нет фокуса, это, вероятно, потому, что пользователь вышел из фокуса, поэтому давайте не будем снова фокусироваться».
Действительно хорошее решение! Может быть, мы можем
.blur()
это, если это не видно. Пример: вы прокручиваете мышью, вы видите ввод, вы прокручиваете мышью ниже. Затем вы больше не можете прокручивать стрелки клавиатуры (ввод вне области просмотра по-прежнему имеет фокус).