Actualmente estoy desarrollando un sitio receptivo usando Twitter Bootstrap.
El sitio tiene una imagen de fondo de pantalla completa en dispositivos móviles / tabletas / computadoras de escritorio. Estas imágenes rotan y se desvanecen a través de cada una, usando dos divs.
Es casi perfecto, excepto un problema. Al usar iOS Safari, el navegador de Android o Chrome en Android, el fondo salta ligeramente cuando un usuario se desplaza hacia abajo en la página y hace que la barra de direcciones se oculte.
El sitio está aquí: http://lt2.daveclarke.me/
Visítelo en un dispositivo móvil y desplácese hacia abajo y debería ver que la imagen cambia de tamaño / se mueve.
El código que estoy usando para el DIV de fondo es el siguiente:
#bg1 {
background-color: #3d3d3f;
background-repeat:no-repeat;
background-attachment:fixed;
background-position:center center;
-webkit-background-size: cover;
-moz-background-size: cover;
-o-background-size: cover;
background-size: cover; position:fixed;
width:100%;
height:100%;
left:0px;
top:0px;
z-index:-1;
display:none;
}
Todas las sugerencias son bienvenidas, ¡esto ha estado haciendo mi cabeza por un tiempo!
position: fixed
.Respuestas:
Este problema se debe a que las barras de URL se reducen / se deslizan y cambian el tamaño de los divs # bg1 y # bg2, ya que tienen un 100% de altura y están "fijos". Dado que la imagen de fondo está configurada para "cubrir", ajustará el tamaño / posición de la imagen a medida que el área que contiene es más grande.
Según la naturaleza receptiva del sitio, el fondo debe escalar. Considero dos posibles soluciones:
1) Establezca la altura # bg1, # bg2 a 100vh. En teoría, esta es una solución elegante. Sin embargo, iOS tiene un error vh ( http://thatemil.com/blog/2013/06/13/viewport-relative-unit-strangeness-in-ios-6/ ). Intenté usar una altura máxima para evitar el problema, pero se mantuvo.
2) El tamaño de la ventana gráfica, cuando lo determina Javascript, no se ve afectado por la barra de URL. Por lo tanto, Javascript se puede usar para establecer una altura estática en # bg1 y # bg2 en función del tamaño de la ventana gráfica. Esta no es la mejor solución, ya que no es CSS puro y hay un ligero salto de imagen en la carga de la página. Sin embargo, es la única solución viable que veo teniendo en cuenta los errores "vh" de iOS (que no parecen estar solucionados en iOS 7).
En una nota al margen, he visto muchos problemas con estas barras de URL de cambio de tamaño en iOS y Android. Entiendo el propósito, pero realmente necesitan pensar en la extraña funcionalidad y el caos que traen a los sitios web. El último cambio es que ya no puede "ocultar" la barra de URL en la carga de la página en iOS o Chrome con trucos de desplazamiento.
EDITAR: Si bien el script anterior funciona perfectamente para evitar que el fondo cambie de tamaño, causa un vacío notable cuando los usuarios se desplazan hacia abajo. Esto se debe a que mantiene el tamaño del fondo al 100% de la altura de la pantalla menos la barra de URL. Si agregamos 60 px a la altura, como sugiere suizo, este problema desaparece. Significa que no podemos ver los 60 píxeles inferiores de la imagen de fondo cuando la barra de URL está presente, pero evita que los usuarios vean un vacío.
fuente
bg.height(jQuery(window).height() + 60);
que funciona maravillosamente en todos mis dispositivos! Gracias :)vh
unidades y, por supuesto,100vh
es más grande cuando la barra de direcciones está oculta. Es estúpido que este salto ocurra después de que se detiene el desplazamiento. Simplemente se ve con errores. Terminé usando la transición en la altura para que parezca intencional.body
un contenedor que<div>
envolvía el contenido de toda la página. ¡Sin saltos de fondos en iOS o Android!Descubrí que la respuesta de Jason no estaba funcionando para mí y que todavía estaba dando un salto. El Javascript garantizaba que no hubiera ningún espacio en la parte superior de la página, pero el fondo seguía saltando cada vez que la barra de direcciones desaparecía / reaparecía. Entonces, además de la corrección de Javascript, apliqué
transition: height 999999s
al div. Esto crea una transición con una duración tan larga que prácticamente congela el elemento.fuente
vw
ovh
para establecer el tamaño de fuente dentro de ese contenedor principal.Tengo un problema similar en un encabezado de nuestro sitio web.
Esto terminará en una experiencia de desplazamiento irregular en Android Chrome, porque .header-container volverá a escalar después de que la barra de direcciones se oculte y se quite el dedo de la pantalla.
Solución CSS:
Si agrega las dos líneas siguientes, evitará que la barra de direcciones se oculte y que aún sea posible el desplazamiento vertical:
fuente
El problema se puede resolver con una consulta de medios y algunas matemáticas. Aquí hay una solución para una orientación de retrato:
Dado que vh cambiará cuando la barra de URL desaparezca, debe determinar la altura de otra manera. Afortunadamente, el ancho de la ventana gráfica es constante y los dispositivos móviles solo tienen algunas relaciones de aspecto diferentes; si puede determinar el ancho y la relación de aspecto, un poco de matemática le dará la altura de la ventana gráfica exactamente como debería funcionar. Aquí está el proceso.
1) Cree una serie de consultas de medios para las relaciones de aspecto que desea orientar.
use la relación de aspecto del dispositivo en lugar de la relación de aspecto porque este último cambiará de tamaño cuando la barra de URL desaparezca
Agregué 'max' a la relación de aspecto del dispositivo para apuntar a cualquier relación de aspecto que suceda entre las más populares. No serán tan precisos, pero serán solo para una minoría de usuarios y seguirán siendo bastante cercanos al vh adecuado.
recuerde la consulta de medios usando horizontal / vertical, por lo que para portait necesitará voltear los números
2) para cada consulta de medios, multiplique el porcentaje de altura vertical que desee que tenga el elemento en vw por el reverso de la relación de aspecto.
3) Tienes que determinar la altura de la barra de URL, y luego menos eso desde la altura. No he encontrado medidas exactas, pero uso el 9% para dispositivos móviles en paisajes y eso parece funcionar bastante bien.
Esta no es una solución muy elegante, pero las otras opciones tampoco son muy buenas, considerando que son:
Que su sitio web parezca defectuoso para el usuario,
tener elementos de tamaño incorrecto, o
Usando javascript para algunos estilos básicos ,
El inconveniente es que algunos dispositivos pueden tener diferentes alturas de barra de URL o relaciones de aspecto que los más populares. Sin embargo, usar este método si solo un pequeño número de dispositivos sufre la suma / resta de unos pocos píxeles, eso me parece mucho mejor que todos los que tienen un tamaño de sitio web al deslizar.
Para hacerlo más fácil, también creé un mix de SASS:
fuente
@mixin vh-fix($vh: 100)
=>height: calc(100vw * (1.333 * $vh / 100) - 9%)
height: calc(100vw * (1.333 * #{$vh} / 100) - 9%)
-9%
.Todas las respuestas aquí están usando la
window
altura, que se ve afectada por la barra de URL. ¿Se han olvidado todos de lascreen
altura?Aquí está mi solución jQuery:
Agregar la
.css()
parte está cambiando el elemento de posición absoluta inevitablemente alineado por arriba a alineado por abajo, por lo que no hay ningún salto en absoluto. Aunque, supongo que no hay razón para no agregarlo directamente al CSS normal.Necesitamos el sniffer de agente de usuario porque la altura de la pantalla en los escritorios no sería útil.
Además, todo esto supone
#background
es un elemento de posición fija que llena la ventana.Para los puristas de JavaScript (advertencia - no probado):
EDITAR: Lamento que esto no responda directamente a su problema específico con más de un fondo. Pero este es uno de los primeros resultados cuando se busca este problema de fondos fijos saltando en dispositivos móviles.
fuente
También me encontré con este problema cuando intentaba crear una pantalla de entrada que cubriera toda la ventana gráfica. Lamentablemente, la respuesta aceptada ya no funciona.
1) Elementos con la altura configurada para
100vh
cambiar su tamaño cada vez que cambia el tamaño de la ventana gráfica, incluidos aquellos casos en los que es causada por (des) aparecer la barra de URL.2)
$(window).height()
devuelve valores también afectados por el tamaño de la barra de URL.Una solución es "congelar" el elemento utilizando
transition: height 999999s
como se sugiere en la respuesta de AlexKempton . La desventaja es que esto deshabilita efectivamente la adaptación a todos los cambios de tamaño de la vista, incluidos los causados por la rotación de la pantalla.Entonces, mi solución es administrar los cambios de la vista manualmente usando JavaScript. Eso me permite ignorar los pequeños cambios que probablemente sean causados por la barra de URL y reaccionar solo en los grandes.
EDITAR: en realidad uso esta técnica junto con
height: 100vh
. La página se representa correctamente desde el principio y luego se activa JavaScript y comienza a administrar la altura manualmente. De esta manera, no hay parpadeo alguno mientras se carga la página (o incluso después).fuente
height: 100vh
en el CSS inicial, configurémin-height:100vh
y luego en el cambio de tamaño de la ventana calculomin-height
y lo configuro a la altura del puerto de vista. Esto es útil cuando su sitio se ve en pantallas pequeñas y el contenido es demasiado grande para caber en la ventana gráfica. Un tiempo de espera en el evento de cambio de tamaño ayuda a mejorar el rendimiento en algunos navegadores (el cambio de tamaño tiende a dispararse muy a menudo)min-height
lugar, pero luego me encontré con un problema cuando necesitaba centrar verticalmente el contenido interno. De alguna manera, el centrado vertical puede ser complicado cuando el elemento externo se haheight
establecido enauto
. Así que se me ocurrió una altura mínima fija que debería ser suficiente para contener cualquier tipo de contenido posible y configurarlo en el CSS inicial. Comomin-height
tiene una prioridad más alta queheight
, funciona bastante bien.display: table
y luego configurando el contenedor internodisplay: table-cell
convertical-align: middle
. Trabajado como un encanto.La solución actualmente estoy usando es comprobar el
userAgent
sobre$(document).ready
para ver si se trata de uno de los navegadores ofensivos. Si es así, siga estos pasos:$(window).resize
, solo actualice los valores de altura relevantes si la nueva dimensión de la vista horizontal es diferente de su valor inicialOpcionalmente, también puede probar si permite cambiar el tamaño vertical solo cuando están más allá de la altura de la (s) barra (s) de direcciones.
Ah, y la barra de direcciones sí afecta
$(window).height
. Consulte: La barra de direcciones del navegador Mobile Webkit (Chrome) cambia $ (ventana) .height (); haciendo tamaño de fondo: ¿reescalar la cubierta cada vez que JS "Ventana" ancho-alto frente a "pantalla" ancho-alto?fuente
Encontré una solución realmente fácil sin el uso de Javascript:
Todo lo que hace es retrasar el movimiento para que sea increíblemente lento y no se note.
fuente
100%
,100vh
. IE8 es el único navegador importante que no admite transiciones.Mi solución implicó un poco de javascript. Mantenga el 100% o 100vh en el div (esto evitará que el div no aparezca en la carga de la página inicial). Luego, cuando se carga la página, tome la altura de la ventana y aplíquela al elemento en cuestión. Evita el salto porque ahora tienes una altura estática en tu div.
fuente
Creé una solución javascript de vainilla para usar unidades VH. El uso de VH prácticamente en cualquier lugar se realiza mediante barras de direcciones que minimizan el desplazamiento. Para arreglar el jank que se muestra cuando la página se vuelve a dibujar, tengo este js aquí que tomará todos sus elementos usando unidades VH (si les da la clase
.vh-fix
) y les dará alturas de píxeles en línea. Esencialmente congelarlos a la altura que queremos. Puede hacer esto en rotación o en el cambio de tamaño de la vista para mantenerse receptivo.Esto ha resuelto todos mis casos de uso, espero que ayude.
fuente
Esta es mi solución para resolver este problema, he agregado comentarios directamente en el código. He probado esta solución y funciona bien. Espero que seamos útiles para que todos tengan el mismo problema.
fuente
Esta es la mejor solución (la más simple) por encima de todo lo que he probado.
... ¡Y esto no mantiene la experiencia nativa de la barra de direcciones !
Puede establecer la altura con CSS al 100%, por ejemplo, y luego establecer la altura a 0.9 * de la altura de la ventana en px con javascript, cuando se carga el documento.
Por ejemplo con jQuery:
$("#element").css("height", 0.9*$(window).height());
)
Desafortunadamente, no hay nada que funcione con CSS: P puro, pero también tenga cuidado
vh
y tengavw
errores en los iPhones: use porcentajes.fuente
Configuré mi elemento de ancho, con javascript. Después configuré el de vh.
html
css
javascript
Esto funciona para mi. No uso jquery ect. porque quiero que se cargue lo antes posible.
fuente
Tomó algunas horas comprender todos los detalles de este problema y descubrir la mejor implementación. Resulta que a partir de abril de 2016 solo iOS Chrome tiene este problema. Probé en Android Chrome y iOS Safari, ambos estaban bien sin esta solución. Entonces, la solución para iOS Chrome que estoy usando es:
fuente
Respuesta simple si su fondo lo permite, ¿por qué no establece el tamaño del fondo: en algo que solo cubra el ancho del dispositivo con consultas de medios y use junto con: después de la posición: fijo; piratear aquí .
IE: tamaño de fondo: 901px; para cualquier pantalla <900px? No es perfecto ni receptivo, pero funcionó a las mil maravillas en dispositivos móviles de <480 píxeles, ya que estoy usando un BG abstracto.
fuente
Estoy usando esta solución: corrija la altura de bg1 en la carga de la página:
Luego, adjunte un detector de eventos de cambio de tamaño a Window que haga esto: si la diferencia de altura después del cambio de tamaño es inferior a 60 píxeles (algo más que la altura de la barra de URL), no haga nada y, si es mayor de 60 píxeles, ¡vuelva a establecer la altura de bg1 a la altura de sus padres! código completo:
PD: ¡Este error es muy irritante!
fuente
Similar a la respuesta de @AlexKempton. (no puedo comentar lo siento)
He estado usando largos retrasos de transición para evitar que el elemento cambie de tamaño.
p.ej:
La desventaja con esto es que evita el cambio de tamaño del elemento, incluso en la rotación del dispositivo, sin embargo, podría usar algunos JS para detectar
orientationchange
y restablecer la altura si esto fuera un problema.fuente
Para aquellos que deseen escuchar la altura interna real y el desplazamiento vertical de la ventana mientras el navegador móvil Chrome hace la transición de la barra de URL de mostrada a oculta y viceversa, la única solución que encontré es establecer una función de intervalo, y Mida la discrepancia de la
window.innerHeight
con su valor anterior.Esto introduce este código:
Espero que esto sea útil. ¿Alguien sabe una mejor solución?
fuente
La solución que se me ocurrió cuando tuve un problema similar fue establecer la altura del elemento
window.innerHeight
cada veztouchmove
que se disparaba un evento.Esto hace que el elemento abarque exactamente el 100% de la pantalla disponible en todo momento, ni más ni menos. Incluso durante la barra de direcciones oculta o muestra.
Sin embargo, es una pena que tengamos que crear ese tipo de parches, donde lo simple
position: fixed
debería funcionar.fuente
Con el soporte de las propiedades personalizadas de CSS (variables) en iOS, puede configurarlas con JS y usarlas solo en iOS.
fuente
Mi respuesta es que todos los que vienen aquí (como lo hice yo) encuentren una respuesta para un error causado por la interfaz oculta / interfaz del navegador.
La barra de direcciones oculta hace que se active el evento resize. Pero a diferencia de otros eventos de cambio de tamaño, como cambiar al modo horizontal, esto no cambia el ancho de la ventana. Entonces, mi solución es conectar con el evento de cambio de tamaño y verificar si el ancho es el mismo.
fuente