Una app nativa incluye un layout consciente del teclado: cuando aparece el teclado, el campo enfocado se desplaza a la vista y nada queda oculto. Dentro de un WebView esa garantía desaparece. El WebView no redimensiona el viewport visual de forma independiente cuando aparece el IME; la página no ve la geometría del teclado; y en Android e iOS el input en el que el usuario escribe queda rutinariamente cubierto. Los formularios de login y pago se vuelven una caja ciega. Un runtime propio del host ofrece un puente consciente del teclado: el host reporta el rectángulo del IME a la página y mantiene el campo enfocado visible.

El WebView no ve el teclado

En Android, Chrome 108+ cambió el manejo del teclado para que el navegador redimensione solo el viewport visual y deje el layout intacto (resizes-visual). WebView fue explícitamente excluido de ese cambio. Un reporte de bug aún abierto en Chromium (issue 40287394) confirma que WebView "no puede redimensionar el Viewport Visual independientemente del Viewport de Layout", y la Virtual Keyboard API simplemente no funciona allí: el boundingRect queda en cero y el evento geometrychange nunca se dispara. Así, con adjustResize todo el layout salta; con adjustPan el layout se desplaza pero se recorta la parte superior; y la página no tiene señal fiable de dónde está el teclado.

iOS también oculta el campo

En iOS, WKWebView no desplaza automáticamente el input enfocado a la vista cuando aparece el teclado, y la API visualViewport se comporta de forma inconsistente entre versiones. El resultado es el mismo: el campo en el que el usuario escribe queda detrás del teclado, y la página no puede traerlo al frente porque nunca conoce el tamaño ni la posición del teclado.

Qué se rompe cuando el campo está oculto

  • El login falla en silencio. El campo de contraseña queda bajo el teclado; el usuario escribe a ciegas y envía credenciales erróneas.
  • Los pagos se estancan. Los inputs de tarjeta y OTP quedan cubiertos; el checkout no puede continuar.
  • El layout salta. adjustResize refluye toda la página; los elementos sticky y fixed se rompen.
  • Ruleta de versiones. WebView 139+ ahora redimensiona el viewport visual con el teclado, pero se ha observado que el evento resize borra el foco del input y vuelve a ocultar el teclado.
  • Sin API consistente. Las unidades dvh solo ayudan en motores nuevos; los WebView antiguos siguen calculando 100vh incluyendo el área del teclado.

La solución del runtime

Un runtime propio del host asume el control del teclado. El host escucha mostrar/ocultar del IME a nivel nativo, calcula el rectángulo del teclado y lo puentea a la página como una señal de inset del teclado. La página entonces mantiene el campo enfocado dentro del área visible — desplazándolo a la vista o dirigiendo el layout desde el inset — sin depender del redimensionado poco fiable del motor. Un comportamiento, todos los dispositivos, todas las versiones del SO.

DimensiónWebViewRuntime propio del host
Geometría del tecladoInvisible para la páginaEl puente reporta el rect IME
Redimensionado del viewport visualNo independiente (Android)Dirigido por el host, consistente
Campo enfocado en iOSNo se auto-desplazaEl host lo desplaza a la vista
Efectos de adjustResizeSalto de layoutNinguno — consciente del inset
Comportamiento entre versionesSe rompe por build de WebViewEstable
Foco del inputSe pierde en algunos redimensionadosPreservado

Una app nativa nunca deja que el teclado se coma el campo. Un WebView puro lo hace a menudo. Un runtime pone el teclado donde la página puede verlo — y el campo de vuelta donde el usuario puede verlo.

Fuentes