iOS Chrome / Safari: desplazamiento no deseado al enfocar una entrada dentro del modal

Limon Monte

Probado en Safari y Chrome: el mismo resultado, así que creo que es un problema de iOS.

Esto sucede solo si hay una entrada dentro del modal y toco esa entrada. En el mismo momento, esa entrada se enfoca y el teclado nativo de iOS se vuelve visible.

La página debajo del modal en el mismo momento se desplaza automáticamente al 50% de su altura. Este comportamiento es totalmente indeseado y no tengo ni idea de cómo evitar esta "función" predeterminada de iOS.

Manifestación:


ACTUALIZACIÓN : la corrección de confirmación: limonte / sweetalert2 / commit / 4a2d36b

Jack

Nos enfrentamos a un problema similar en el trabajo y me topé con esta pregunta con su (excelente) página de demostración.

Como mencionaste, el desplazamiento es siempre ~ 50% de la altura de la página, lo que ocurre independientemente de dónde esté tu desplazamiento inicial.

En el pasado, cuando observé un "salto" similar con versiones anteriores de iOS (aunque, un salto mucho menos dramático), por lo general he solucionado esto aplicando position: fixed(o relative) al body( esto permite overflow: hiddenque funcione correctamente ).

Sin embargo, esto tiene la consecuencia desatendida de hacer que el usuario vuelva a la parte superior de la página, si se ha desplazado hacia abajo.

Entonces, si está abierto a abordar este problema con alguien JavaScript, aquí hay una solución / truco que he preparado:

// Tapping into swal events
onOpen: function () {
  var offset = document.body.scrollTop;
  document.body.style.top = (offset * -1) + 'px';
  document.body.classList.add('modal--opened');
},
onClose: function () {
  var offset = parseInt(document.body.style.top, 10);
  document.body.classList.remove('modal--opened');
  document.body.scrollTop = (offset * -1);
}

Y cómo se ve el CSS:

.modal--opened {
  position: fixed;
  left: 0;
  right: 0;
}

Aquí hay una bifurcación de su página de demostración, para ilustrar: https://jpattishall.github.io/sweetalert2/ios-bug.html

Y para aquellos que buscan una solución más general, puede hacer algo como lo siguiente al abrir / cerrar un modal:

function toggleModal() {
    var offset;
    if (document.body.classList.contains('modal--opened')) {
        offset = parseInt(document.body.style.top, 10);
        document.body.classList.remove('modal--opened');
        document.body.scrollTop = (offset * -1);
    } else {
        offset = document.body.scrollTop;
        document.body.style.top = (offset * -1) + 'px';
        document.body.classList.add('modal--opened');
    }
}

Editar: una cosa a tener en cuenta es que no aplicamos la solución a todos los dispositivos / plataformas a ciegas, solo iOS Safari. Noté en su otra pregunta que no era fanático del desbordamiento: oculto debido al cambio de página cuando la barra de desplazamiento aparece / desaparece (con lo que estoy totalmente de acuerdo). Sugeriría simplemente aplicar el JS solo a dispositivos iOS.

Este artículo se recopila de Internet, indique la fuente cuando se vuelva a imprimir.

En caso de infracción, por favor [email protected] Eliminar

Editado en
0

Déjame decir algunas palabras

0Comentarios
Iniciar sesiónRevisión de participación posterior

Artículos relacionados

iOS Safari / Chrome: desplazamiento no deseado al enfocar una entrada dentro del modal

Múltiples activadores para la misma base 6 Revelan una causa modal Desplazamiento no deseado al cerrar

Problemas de desplazamiento del cuerpo y div fijo en Safari / Chrome / Firefox para iOS

Enfocar un campo de entrada al hacer clic en un elemento, excepto si se resaltó algún texto dentro del contenedor

X-editable evita que el comportamiento predeterminado del cuadro de entrada se cierre al enfocar

jQuery al hacer clic / enfocar la entrada de texto, configurar los datos del portapapeles

Evite que la entrada dentro de un modal de arranque pierda el enfoque cuando haga clic en la barra de desplazamiento del modal

Cómo enfocar el siguiente campo de entrada al presionar una tecla

Cómo enfocar el siguiente campo de entrada al presionar una tecla

Relleno horizontal no deseado en Safari y Chrome entre imágenes dentro de div

ReactJs Usando referencias para enfocar una entrada

No puedo enfocar TextInput al navegar a una pantalla

Se muestra contenido no deseado al cerrar modal

Use reaccionar para enfocar el elemento de entrada con cursor de intercalación/texto al final del texto usando onKeyDown

¿La altura del CSS modal al 100% no cubre la pantalla después del desplazamiento?

iOS móvil: desplazamiento en iFrame dentro del elemento principal con capacidad de desplazamiento

Agregar una imagen dentro del texto del tipo de entrada

Desplazamiento del campo de entrada

Escribir dentro de una entrada de texto es extremadamente lento en iPad mini con iOS8 Mobile Safari y Safari 8

¿Cómo agregar desplazamiento vertical solo para div seleccionado dentro del modal de arranque?

Cómo enfocar la entrada del usuario con un fragmento

Problemas al mostrar una entrada en modal de arranque

Efecto no deseado en una barra de navegación al cambiar el tamaño del ancho del contenedor

Un inicializador de campo no puede hacer referencia al error de campo, método o propiedad no estático al intentar enfocar una entrada en xamarin.forms

Safari de iOS: el desplazamiento está roto dentro de la posición: fijo; elementos

¿Cómo enfocar una entrada de papel con Polymer 1.0?

evitar el teclado predeterminado del iPhone al enfocar un <input>

WPF: eliminación del estado de desplazamiento al usar el teclado dentro de un ComboBox

¿Cómo puedo mover una barra de desplazamiento del interior al exterior de una tabla?