Actualicé mi iPhone 6 plus a la versión beta de iOS 10 y acabo de descubrir que en el safari móvil, puede hacer zoom en cualquier página web tocando dos veces o pellizcando IGNORE el user-scalable=no
código en la metaetiqueta. No sé si es un error o una característica. Si se considera como una característica, ¿cómo deshabilitamos el zoom de viewport Safari para iOS 10?
actualizado en iOS 11/12, iOS 11 y iOS 12 safari todavía NO respetan la user-scalable=no
metaetiqueta.
Respuestas:
Es posible evitar el escalado de la página web en Safari en iOS 10, pero implicará más trabajo de su parte. Supongo que el argumento es que un cierto grado de dificultad debería evitar que los desarrolladores de culto de carga dejen "escalable por el usuario = no" en cada etiqueta de ventana gráfica y dificulten innecesariamente las cosas para los usuarios con discapacidad visual.
Aún así, me gustaría ver a Apple cambiar su implementación para que haya una forma simple (metaetiqueta) de desactivar el doble toque para hacer zoom. La mayoría de las dificultades se relacionan con esa interacción.
Puede detener pellizcar para hacer zoom con algo como esto:
Tenga en cuenta que si algún objetivo más profundo llama a stopPropagation en el evento, el evento no alcanzará el documento y este escucha no impedirá el comportamiento de escala.
Deshabilitar el doble toque para hacer zoom es similar. Deshabilita cualquier toque en el documento que ocurra dentro de los 300 milisegundos del toque anterior:
Si no configura correctamente los elementos de su formulario, al enfocar en una entrada se aplicará un zoom automático, y dado que en su mayoría ha desactivado el zoom manual, ahora será casi imposible quitar el zoom. Asegúrese de que el tamaño de la fuente de entrada sea> = 16px.
Si está tratando de resolver esto en un WKWebView en una aplicación nativa, la solución dada anteriormente es viable, pero esta es una mejor solución: https://stackoverflow.com/a/31943976/661418 . Y como se menciona en otras respuestas, en iOS 10 beta 6, Apple ahora ha proporcionado una bandera para honrar la metaetiqueta.
Actualización de mayo de 2017: reemplacé el antiguo método 'comprobar toques de longitud en el inicio táctil' para deshabilitar el pellizco-zoom con un enfoque más simple 'comprobar evento.escala en movimiento táctil'. Debería ser más confiable para todos.
fuente
<meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
y si el navegador no respeta la metaetiqueta, es un diseño de navegador muy malo. El otro diseño muy malo es la acción de retroceso / avance deslizante, que no se puede evitar en iOS 9/10. Rompe severamente arrastrando acciones dentro de la aplicación web.preventDefault
encendidotouchmove
. No puede (completamente) deshabilitar el zoom sin deshabilitar el desplazamiento.If you don't set up your form elements right, focusing on an input will auto-zoom, and since you have mostly disabled manual zoom, it will now be almost impossible to unzoom. Make sure the input font size is >= 16px.
Esta es una nueva característica en iOS 10.
De las notas de lanzamiento de iOS 10 beta 1:
Espero que veamos un complemento JS pronto para deshabilitarlo de alguna manera.
fuente
He podido arreglar esto usando la
touch-action
propiedad css en elementos individuales. Intente configurartouch-action: manipulation;
elementos en los que comúnmente se hace clic, como enlaces o botones.fuente
touch-action: none;
para controlar todos los gestos tú mismo.touch-action: none
solo proporcionamanipulatoin
, lo que deja el problema de pellizco y zoom tal como está.Parece que este comportamiento supuestamente ha cambiado en la última versión beta, que al momento de escribir este artículo es beta 6.
De las notas de la versión para iOS 10 Beta 6:
Sin embargo, en mis pruebas (muy limitadas), todavía no puedo confirmar que este sea el caso.
Editar: verificado, iOS 10 Beta 6 me respeta
user-scalable=no
de manera predeterminada.fuente
WKWebView
no a Safari. Fuente: Una de nuestras aplicaciones mapa se rompió y no tenemos ninguna idea de cómo solucionarlo.WKWebView
y supuse que la pregunta original se hacíaWKWebView
al escribir mi respuesta. Así que supongo que durante una de las primeras versiones beta, Apple cambió el comportamiento de ambosWKWebView
y Safari móvil, luego en beta 6, revirtió el comportamiento de Safari,WKWebView
pero lo mantuvo.user-scalable=no
. No estoy seguro de por qué alguna vez deshacerían esto, solo para recuperarlo, solo para eliminarlo nuevamente.La solución que funciona en Safari Mobile en este momento de la escritura, es tener el tercer argumento a
addEventListener
sea{ passive: false }
, por lo que las miradas de solución completos como este:Es posible que desee verificar si las opciones son compatibles para seguir siendo compatibles con versiones anteriores.
fuente
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
.<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, viewport-fit=cover, user-scalable=no, shrink-to-fit=no" />
y<meta name="HandheldFriendly" content="true">
Pasé aproximadamente una hora buscando una opción de JavaScript más robusta, y no encontré una. Da la casualidad de que en los últimos días he estado jugando con hammer.js (Hammer.js es una biblioteca que te permite manipular todo tipo de eventos táctiles fácilmente) y sobre todo fallando en lo que estaba tratando de hacer.
Con esa advertencia, y entendiendo que de ninguna manera soy un experto en JavaScript, esta es una solución que se me ocurrió que básicamente aprovecha hammer.js para capturar los eventos pinch-zoom y doble toque y luego registrarlos y descartarlos.
Asegúrese de incluir hammer.js en su página y luego intente pegar este javascript en la cabeza en alguna parte:
fuente
.preventDefault
a todos los manejadores de gestos de martillo. Estoy usando deslizar / pellizcar / desplazar / tocar juntos, lo he agregado a todos los controladores, no sé si hay uno específico que esté haciendo el trabajo.Intenté la respuesta anterior sobre pellizcar para hacer zoom
sin embargo, en algún momento la pantalla aún se amplía cuando event.touches.length> 1 descubrí que la mejor manera es usar el evento touchmove para evitar que se mueva un dedo en la pantalla. El código será algo como esto:
Espero que ayude.
fuente
Verifique el factor de escala en el evento táctil y luego evite el evento táctil.
fuente
Podemos obtener todo lo que queremos inyectando una regla de estilo e interceptando eventos de zoom:
✔ Desactiva el zoom de pellizco.
✔ Desactiva el zoom de doble toque.
✔ El desplazamiento no se ve afectado.
✔ Desactiva el toque de resaltado (que se activa, en iOS, por la regla de estilo).
AVISO: modifique la detección de iOS a su gusto. Más sobre eso aquí .
Disculpas a lukejackson y Piotr Kowalski , cuyas respuestas aparecen en forma modificada en el código anterior.
fuente
addEventListener
respuestas basadas y pasando{ passive: false }
comooptions
parámetro en lugar defalse
. Sin embargo, para la compatibilidad con versiones anteriores, debe pasar afalse
menos que elpassive
campo de opción sea compatible. Ver developer.mozilla.org/en-US/docs/Web/API/EventTarget/…Se me ocurrió una solución bastante ingenua, pero parece funcionar. Mi objetivo era evitar que los doble toques accidentales se interpretaran como acercamiento, mientras mantenía el pellizco para hacer zoom trabajando para la accesibilidad.
La idea es medir el tiempo entre el primero
touchstart
y el segundotouchend
con un doble toque y luego interpretar el últimotouchend
como un clic si el retraso es demasiado pequeño. Mientras evita el acercamiento accidental, este método parece mantener el desplazamiento de la lista sin verse afectado, lo cual es bueno. Sin embargo, no estoy seguro si no me he perdido nada.Inspirado por una esencia de mutewinter y la respuesta de Joseph .
fuente
En mi caso particular, estoy usando Babylon.js para crear una escena 3D y toda mi página consta de un lienzo de pantalla completa. El motor 3D tiene su propia funcionalidad de zoom, pero en iOS la pizca de zoom interfiere con eso. Actualicé la respuesta de @Joseph para superar mi problema. Para deshabilitarlo, descubrí que necesito pasar el {pasivo: falso} como una opción al oyente del evento. El siguiente código funciona para mí:
fuente
Por extraño que parezca, al menos para Safari en iOS 10.2, tocar dos veces para hacer zoom está mágicamente desactivado si su elemento o alguno de sus antepasados tiene uno de los siguientes:
cursor: pointer
conjunto en CSSfuente
El acercamiento involuntario tiende a ocurrir cuando:
Para evitar el comportamiento de doble toque , he encontrado dos soluciones muy simples:
Ambos evitan que Safari (iOS 10.3.2) amplíe el botón. Como puede ver, uno es solo JavaScript, el otro es solo CSS. Use apropiadamente.
Aquí hay una demostración: https://codepen.io/lukejacksonn/pen/QMELXQ
No he intentado evitar el comportamiento de pellizco (todavía), principalmente porque tiendo a no crear interfaces multitáctiles para la web y, en segundo lugar, he llegado a la idea de que quizás todas las interfaces, incluida la interfaz de usuario de la aplicación nativa, deberían ser "pellizcar para hacer zoom" -able en lugares. Todavía diseñaría para evitar que el usuario tenga que hacer esto para que su IU sea accesible para ellos, a toda costa.
fuente
Encontré este simple trabajo que parece evitar el doble clic para hacer zoom:
fuente
Según lo solicitado, he transferido mi comentario a una respuesta para que la gente pueda votarlo:
Esto funciona el 90% del tiempo para iOS 13:
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, viewport-fit=cover, user-scalable=no, shrink-to-fit=no" />
y
<meta name="HandheldFriendly" content="true">
fuente
Revisé todas las respuestas anteriores en la práctica con mi página en iOS (iPhone 6, iOS 10.0.2), pero sin éxito. Esta es mi solución de trabajo:
fuente
esto funcionó para mí:
fuente