Wenn ein mobiler Browser eine Tastatur aufruft, versucht er, die Bildlaufleisten so zu verschieben, dass die Eingabe immer noch sichtbar ist.
Bei iOS Safari scheint dies richtig zu sein, indem das übergeordnete nächste - Bildlauf gesucht wird.
Bei einem Android-basierten oder Chrome-Browser scheint es, das Body-Element einfach auszuprobieren und dann aufzugeben, sodass die fokussierte Eingabe unter der Tastatur verborgen ist.
Legen Sie overflow-y: hidden
für das body-Element fest. Erstellen Sie einen scrollbaren Container und fügen Sie dort ein Formular ein.
Wenn Sie ein Element am unteren Rand Ihres Bildschirms auswählen, wird dieses durch die Tastatur verdeckt.
http://dominictobias.com/Android-scroll-bug/
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no"/>
<title>Android scroll/focus bug</title>
<style>
html, body {
margin: 0;
padding: 0;
height: 100%;
overflow: hidden;
}
.scroll {
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
overflow-y: scroll;
}
input {
margin-bottom: 20px;
width: 100%;
}
</style>
</head>
<body>
<div class="scroll">
<input type="text" value="Input 1">
<input type="text" value="Input 2">
<input type="text" value="Input 3">
<input type="text" value="Input 4">
<input type="text" value="Input 5">
<input type="text" value="Input 6">
<input type="text" value="Input 7">
<input type="text" value="Input 8">
<input type="text" value="Input 9">
<input type="text" value="Input 10">
<input type="text" value="Input 11">
<input type="text" value="Input 12">
<input type="text" value="Input 13">
<input type="text" value="Input 14">
<input type="text" value="Input 15">
<input type="text" value="Input 16">
<input type="text" value="Input 17">
<input type="text" value="Input 18">
<input type="text" value="Input 19">
<input type="text" value="Input 20">
</div>
</body>
</html>
Irgendwelche Ideen, wie man das beheben kann? Benötigt es einige Browsererkennung und unordentliche Hacks?
Dies ist ein Fehler im Android-Browser. Die Eingabe wird übrigens in die Ansicht gescrollt, nachdem ein Zeichen auf der Soft-Tastatur eingegeben wurde.
Das folgende Code-Snippet, das irgendwo auf der Seite platziert wird, sollte helfen:
if(/Android 4\.[0-3]/.test(navigator.appVersion)){
window.addEventListener("resize", function(){
if(document.activeElement.tagName=="INPUT"){
window.setTimeout(function(){
document.activeElement.scrollIntoViewIfNeeded();
},0);
}
})
}
Die Antwort von Serge ist großartig, aber ich hatte ein paar Modifikationen, die mich verbessert haben.
Das Problem erschien auch auf Android 6 für mich, also habe ich es zum Check hinzugefügt und brauchte die Korrektur, um sowohl für Textareas als auch für Eingaben zu arbeiten.
if(/Android [4-6]/.test(navigator.appVersion)) {
window.addEventListener("resize", function() {
if(document.activeElement.tagName=="INPUT" || document.activeElement.tagName=="TEXTAREA") {
window.setTimeout(function() {
document.activeElement.scrollIntoViewIfNeeded();
},0);
}
})
}
Wenn jemand das Update in Angular 1 benötigt, ist hier das, was ich dort verwendet habe.
angular.module('<module name>').run(function ($window, $timeout) {
if(/Android [4-6]/.test($window.navigator.appVersion)){
$window.addEventListener("resize", function(){
if(document.activeElement.tagName=="INPUT" || document.activeElement.tagName=="TEXTAREA"){
$timeout(function() {
document.activeElement.scrollIntoViewIfNeeded();
});
}
});
}
});
Eine kleine Überarbeitung bietet, wenn es jemandem etwas Zeit spart:
MDN rät von .scrollIntoViewIfNeeded
bc der Browser-Inkompatibilität ab => .scrollIntoView
ist ein funktionsfähiger Ersatz mit etwas mehr Browserkompatibilität
if(/Android/.test(navigator.appVersion)) {
window.addEventListener("resize", function() {
if(document.activeElement.tagName=="INPUT" || document.activeElement.tagName=="TEXTAREA") {
document.activeElement.scrollIntoView();
}
})
}
Etwas anders betrachtet scheint der Fehler durch die Suggestions-Funktion des Browsers verursacht zu sein. Da ich die Vorschläge sowieso nicht wirklich will, habe ich verwendet:
if(/Android/.test(navigator.appVersion)){
$('input[type="text"]').attr('autocomplete', "off");
}
was eine viel glattere Erfahrung gibt.