CSS3 100vh no constante en el navegador móvil

Resuelto Nereo Costacurta asked hace 8 años • 36 respuestas

Tengo un problema muy extraño... en cada navegador y versión móvil encontré este comportamiento:

  • Todos los navegadores tienen un menú superior cuando carga la página (que muestra la barra de direcciones, por ejemplo) que se desliza hacia arriba cuando comienza a desplazarse por la página.
  • A veces, 100vh se calcula solo en la parte visible de una ventana gráfica, por lo que cuando la barra del navegador se desliza hacia arriba, 100vh aumenta (en términos de píxeles).
  • todo el diseño se volvió a pintar y reajustar ya que las dimensiones han cambiado
  • un mal efecto de salto para la experiencia del usuario

¿Cómo se puede evitar este problema? Cuando escuché por primera vez sobre viewport-height me emocioné y pensé que podría usarlo para bloques de altura fija en lugar de usar javascript, pero ahora creo que la única forma de hacerlo es, de hecho, javascript con algún evento de cambio de tamaño...

Puedes ver el problema en: sitio de muestra.

¿Alguien puede ayudarme o sugerirme una solución CSS?


código de prueba simple:

Mostrar fragmento de código

Nereo Costacurta avatar May 09 '16 16:05 Nereo Costacurta
Aceptado

Desafortunadamente esto es intencional...

Este es un problema bien conocido (al menos en Safari Mobile), que es intencionado, ya que evita otros problemas. Benjamin Poulain respondió a un error del webkit :

Esto es completamente intencional. Nos costó bastante trabajo lograr este efecto. :)

El problema base es este: el área visible cambia dinámicamente a medida que se desplaza. Si actualizamos la altura de la ventana gráfica CSS en consecuencia, necesitamos actualizar el diseño durante el desplazamiento. No sólo eso parece una mierda, sino que hacerlo a 60 FPS es prácticamente imposible en la mayoría de las páginas (60 FPS es la velocidad de fotogramas básica en iOS).

Es difícil mostrarte la parte de "parece una mierda", pero imagina que mientras te desplazas, el contenido se mueve y lo que quieres en la pantalla cambia continuamente.

La actualización dinámica de la altura no funcionaba, teníamos algunas opciones: eliminar unidades de ventana gráfica en iOS, hacer coincidir el tamaño del documento como antes de iOS 8, usar el tamaño de vista pequeño, usar el tamaño de vista grande.

Según los datos que teníamos, usar un tamaño de vista más grande fue el mejor compromiso. La mayoría de los sitios web que utilizan unidades de ventana gráfica se ven geniales la mayor parte del tiempo.

Nicolas Hoizey ha investigado bastante esto: https://nicolas-hoizey.com/2015/02/viewport-height-is-taller-than-the-visible-part-of-the-document-in-some-mobile -navegadores.html

No hay ninguna solución prevista

En este punto, no hay mucho que pueda hacer excepto abstenerse de usar la altura de la ventana gráfica en dispositivos móviles. Chrome también cambió a esto en 2016:

  • https://groups.google.com/a/chromium.org/forum/#!topic/blink-dev/BK0oHURgmJ4
  • https://developers.google.com/web/updates/2016/12/url-bar-resizing
nils avatar May 09 '2016 10:05 nils

Puedes probar min-height: -webkit-fill-available;en tu CSS en lugar de 100vh. deberia estar solucionado

Saurabh Jain avatar Mar 05 '2019 13:03 Saurabh Jain

Contamos con nuevas unidades viewport lvh, svhy dvhal rescate. Esto quedó demostrado en el último vídeo de Google I/O 2022 sobre trabajos web.

Probablemente quieras seguir con dvhque el navegador se adapte a las pestañas ocultas del dispositivo móvil mientras te desplazas. Funciona de manera similar para ancho con y dvwunidades .lvwsvw

Aquí hay una clara ilustración del video: https://youtu.be/Xy9ZXRRgpLk?t=982

Google I/O 2022 en nuevas unidades de ventana gráfica

¿Puedo usar?

Esto estaba funcionando actualmente en mi Chrome Canary con la bandera "Funciones experimentales" habilitada.

m4n0 avatar May 15 '2022 02:05 m4n0

Actualización 2023 : consulte https://stackoverflow.com/a/72245072/4773272 , que es la mejor manera hoy en día.


Respuesta heredada: en mi aplicación lo hago así (mecanografiado y postcss anidado, así que cambie el código en consecuencia):

const appHeight = () => {
    const doc = document.documentElement
    doc.style.setProperty('--app-height', `${window.innerHeight}px`)
}
window.addEventListener('resize', appHeight)
appHeight()

en tu css:

:root {
    --app-height: 100%;
}

html,
body {
    padding: 0;
    margin: 0;
    overflow: hidden;
    width: 100vw;
    height: 100vh;

    @media not all and (hover:hover) {
        height: var(--app-height);
    }
}

Funciona al menos en Chrome Mobile y iPad. Lo que no funciona es cuando agregas tu aplicación a la pantalla de inicio en iOS y cambias la orientación varias veces; de alguna manera, los niveles de zoom interfieren con el valor de altura interna, podría publicar una actualización si encuentro una solución.

Manifestación

Andreas Herd avatar Jun 04 '2018 14:06 Andreas Herd