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.
- 100vh a veces 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)
- Todos los diseños se vuelven a pintar y reajustar ya que las dimensiones han cambiado
- un mal efecto nervioso para la experiencia del usuario
¿Cómo puede evitar este problema? Cuando escuché por primera vez sobre viewport-height estaba emocionado 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 ...
puede ver el problema en: sitio de muestra
¿Alguien puede ayudarme / sugerir una solución CSS?
código de prueba simple:
html
css
viewport-units
Nereo Costacurta
fuente
fuente
transition: 0.5s
o menos, para que el cambio sea menos abrupto?Respuestas:
Lamentablemente esto es intencional ...
Este es un problema bien conocido (al menos en safari mobile), que es intencional, ya que evita otros problemas. Benjamin Poulain respondió a un error de webkit :
Nicolas Hoizey ha investigado esto bastante: https://nicolas-hoizey.com/2015/02/viewport-height-is-taller-than-the-visible-part-of-the-document-in-some-mobile -browsers.html
Sin arreglo planeado
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:
fuente
$(window).height()
este error no se ve afectado, así que iré por ese camino. ¡gracias!position:fixed
. Esto es similar a la implementación en Safari. Leer más: developers.google.com/web/updates/2016/12/url-bar-resizingvh
o la<html> 100%
altura después de la carga inicial. Esto es realmente genial, ya que la distribución / reflujo del diseño cuando las ocultaciones de la barra de URL pueden parecer terribles.Firefox
yEdge
Mobile
aún se actualizavh
y se<html>
eleva dinámicamente , lo que provoca muchos rasgaduras y cambios de tamaño de todos los componentes al desplazarse, especialmente malo si se usan SVG para imágenes de fondoPuedes probar
min-height: -webkit-fill-available;
en tu CSS en lugar de100vh
. Debe ser resueltofuente
min-height: 100vh;
como una alternativa donde-webkit-fill-available
no es compatible.min-height: 100vh;
allí, ya que de lo contrario se rompería en navegadores como Firefox (al menos en el escritorio, iOS usa webkit sin importar qué navegador).en mi aplicación lo hago así (mecanografiado y postcss anidado, así que cambie el código en consecuencia):
en tu css:
Funciona al menos en Chrome Mobile y iPad. Lo que no funciona es cuando agrega su aplicación a la pantalla de inicio en iOS y cambia la orientación varias veces; de alguna manera, los niveles de zoom se meten con el valor de la altura interna, podría publicar una actualización si encuentro una solución.
Manifestación
fuente
Para muchos de los sitios que construyo, el cliente solicitará un banner de 100vh y, tal como lo ha encontrado, resulta en una mala experiencia "nerviosa" en el móvil cuando comienza a desplazarse. Así es como resuelvo el problema para una experiencia uniforme y uniforme en todos los dispositivos:
Primero configuré mi elemento de banner CSS en
height:100vh
Luego uso jQuery para obtener la altura en píxeles de mi elemento de banner y aplicar un estilo en línea usando esta altura.
Hacer esto resuelve el problema en los dispositivos móviles, ya que cuando se carga la página, el elemento de banner se establece en 100vh usando CSS y luego jQuery anula esto al colocar CSS en línea en mi elemento de banner que evita que se redimensione cuando un usuario comienza a desplazarse.
Sin embargo, en el escritorio si un usuario cambia el tamaño de la ventana de su navegador, mi elemento de banner no cambiará de tamaño porque ahora tiene una altura fija establecida en píxeles debido a la jQuery anterior. Para abordar esto, uso Mobile Detect para agregar una clase 'móvil' al cuerpo de mi documento. Y luego envuelvo el jQuery anterior en una declaración if:
Como resultado, si un usuario está en un dispositivo móvil, la clase 'móvil' está presente en el cuerpo de mi página y se ejecuta jQuery anterior. Por lo tanto, mi elemento de banner solo obtendrá el CSS en línea aplicado en dispositivos móviles, mientras que en el escritorio la regla CSS original de 100vh permanece en su lugar.
fuente
$('.banner').css({ height: window.innerHeight });
, que es la altura "real" de la ventana gráfica. Ejemplo de cómo funciona innerHeightdocument.querySelector('.banner').style.height = window.innerHeight;
para personas que escriben JavaScript real.Mira esta respuesta: https://css-tricks.com/the-trick-to-viewport-units-on-mobile/
fuente
Se me ocurrió un componente React. Compruébalo si usas React o exploras el código fuente si no lo haces, para que puedas adaptarlo a tu entorno.
Establece la altura del div en pantalla completa
window.innerHeight
y luego la actualiza en los cambios de tamaño de la ventana.fuente
Como estaba buscando una solución algunos días, aquí está el mío para todos los que usan VueJS con Vuetify (mi solución usa v-app-bar, v-navigation-drawer y v-footer): creé App.scss (usado en la aplicación. vue) con el siguiente contenido:
fuente
Para mí, tal truco hizo un trabajo:
fuente
@nils lo explicó claramente.
¿Qué sigue entonces?
Acabo de volver a usar el 'clásico' relativo
%
(porcentaje) en CSS.A menudo es más esfuerzo implementar algo de lo que estaría usando
vh
, pero al menos, tiene una solución bastante estable que funciona en diferentes dispositivos y navegadores sin fallas extrañas en la interfaz de usuario.fuente
Acabo de encontrar una aplicación web que diseñé que tiene este problema con iPhones y iPads, y encontré un artículo que sugiere resolverlo utilizando consultas de medios dirigidas a dispositivos Apple específicos.
No sé si puedo compartir el código de ese artículo aquí, pero la dirección es esta: http://webdesignerwall.com/tutorials/css-fix-for-ios-vh-unit-bug
Citando el artículo: "solo haga coincidir la altura del elemento con la altura del dispositivo utilizando consultas de medios que se dirigen a las versiones anteriores de la resolución de iPhone y iPad".
Agregaron solo 6 consultas de medios para adaptar elementos de altura completa, y debería funcionar ya que está completamente implementado con CSS.
Editar pendiente: no puedo probarlo en este momento, pero volveré e informaré mis resultados.
fuente
Como soy nuevo, no puedo comentar sobre otras respuestas.
Si alguien está buscando una respuesta para que esto funcione (y puede usar JavaScript, ya que parece ser necesario para que esto funcione en este momento), este enfoque me ha funcionado bastante bien y también explica el cambio de orientación móvil. Yo uso Jquery para el código de ejemplo, pero debería ser factible con vanillaJS.
-Primero, uso una secuencia de comandos para detectar si el dispositivo es táctil o flotante. Ejemplo de huesos desnudos:
Esto agrega clase al elemento del cuerpo de acuerdo con el tipo de dispositivo (desplazamiento o toque) que se puede usar más adelante para el script de altura.
-A continuación, use este código para establecer la altura del dispositivo en la carga y en el cambio de orientación:
-El tiempo de espera está configurado para que el dispositivo calcule la nueva altura correctamente en el cambio de orientación. Si no hay tiempo de espera, en mi experiencia, la altura no será correcta. 500 ms puede ser una exageración, pero ha funcionado para mí.
-100vh en dispositivos de desplazamiento es una alternativa si el navegador anula el CSS 100vh.
fuente
El siguiente código resolvió el problema (con jQuery).
Y los otros elementos se usan
%
como una unidad para reemplazarvh
.fuente
Aquí hay una solución que usé para mi aplicación React.
iPhone 11 Pro y iPhone Pro Max - 120px
iPhone 8 - 80px
Es un compromiso pero una solución relativamente simple
fuente
Lo siguiente funcionó para mí:
El
body
tomará la altura de visualización visible y#your-app-container
conheight: 100%
hará que el contenedor de tomar la altura ventanas visibles.fuente
Con suerte, esta será una variable de entorno CSS definida por UA como se sugiere aquí: https://github.com/w3c/csswg-drafts/issues/2630#issuecomment-397536046
fuente
Debido a que no se ha solucionado, puede hacer algo como:
Para mí fue la solución más rápida y más pura que jugar con JavaScript, que no podía funcionar en muchos dispositivos y navegadores.
Simplemente use el valor adecuado
vh
que se ajuste a sus necesidades.fuente
El uso de vh en dispositivos móviles no funcionará con 100vh, debido a que sus opciones de diseño utilizan toda la altura del dispositivo sin incluir ninguna barra de direcciones, etc.
Si está buscando un diseño que incluya alturas div proporcionales a la altura de la vista real, uso la siguiente solución de CSS puro:
Tiene dos opciones para configurar la altura de la ventana gráfica, establezca manualmente --devHeight en una altura que funcione (pero deberá ingresar este valor para cada tipo de dispositivo para el que está codificando)
o
Use javascript para obtener la altura de la ventana y luego actualice --devheight al cargar y actualizar la ventana gráfica (sin embargo, esto requiere el uso de javascript y no es una solución pura de CSS)
Una vez que obtenga la altura de vista correcta, puede crear múltiples divisiones en un porcentaje exacto de la altura total de la vista simplemente cambiando el multiplicador en cada división a la que asigna la altura.
0.10 = 10% de la altura de la vista 0.57 = 57% de la altura de la vista
Espero que esto pueda ayudar a alguien;)
fuente
Puede hacer esto agregando el siguiente guión y estilo
Estilo
fuente
Pruebe
html, body { height: 100% }
algo en el sentido de 100vh en dispositivos móviles.fuente
Puedes intentar darle
position: fixed; top: 0; bottom: 0;
propiedades a tu contenedor.fuente