A pesar de que el atributo CSS {position:fixed;}
parece (en su mayoría) que trabajan en los dispositivos IOS más nuevos, es posible tener la peculiaridad del dispositivo y vuelve a los {position:relative;}
en alguna ocasión y sin causa o motivo. Por lo general, borrar el caché ayudará, hasta que algo suceda y el capricho vuelva a suceder.
En concreto, desde la propia Apple Preparing Your Web Content for iPad:
Safari en el iPad y Safari en el iPhone no tienen ventanas de tamaño variable. En Safari en iPhone y iPad, el tamaño de la ventana se establece en el tamaño de la pantalla (menos los controles de la interfaz de usuario de Safari), y el usuario no puede cambiar . Para moverse por una página web, el usuario cambia el nivel de zoom y la posición de la ventana gráfica al hacer doble clic o pellizcar para acercar o , o tocando y arrastrando para desplazarse por la página. Cuando un usuario cambia el nivel de zoom y la posición de la ventana gráfica lo hace dentro de un área de contenido visible de tamaño fijo (es decir, la ventana). Esto significa que los elementos de la página web que tienen su posición "fija" en la ventana gráfica pueden terminar fuera del área de contenido visible, fuera de la pantalla.
Lo que es irónico, los dispositivos Android no parecen tener este problema. También es completamente posible utilizar {position:absolute;}
cuando en referencia a la etiqueta de cuerpo y no tiene ningún problema.
Encontré la causa raíz de esta peculiaridad; que es el evento de desplazamiento que no se juega bien cuando se usa junto con la etiqueta HTML o BODY. A veces no le gusta disparar el evento, o tendrá que esperar hasta que el evento de desplazamiento de desplazamiento finalice para recibir el evento. Específicamente, la ventana gráfica se vuelve a dibujar al final de este evento y los elementos fijos se pueden volver a colocar en otro lugar en la ventana gráfica.
Así que esto es lo que hago: (evitar el uso de la ventana, y seguir con el DOM!)
<html>
<style>
.fixed{
position:fixed;
/*you can set your other static attributes here too*/
/*like height and width, margin, etc.*/
}
.scrollableDiv{
position:relative;
overflow-y:scroll;
/*all children will scroll within this like the body normally would.*/
}
.viewportSizedBody{
position:relative;
overflow:hidden;
/*this will prevent the body page itself from scrolling.*/
}
</style>
<body class="viewportSizedBody">
<div id="myFixedContainer" class="fixed">
This part is fixed.
</div>
<div id="myScrollableBody" class="scrollableDiv">
This part is scrollable.
</div>
</body>
<script type="text/javascript" src="{your path to jquery}/jquery-1.7.2.min.js"></script>
<script>
var theViewportHeight=$(window).height();
$('.viewportSizedBody').css('height',theViewportHeight);
$('#myScrollableBody').css('height',theViewportHeight);
</script>
</html>
En esencia, esto hará que el cuerpo sea el tamaño de la ventana y no desplazable. El DIV desplazable anidado en el interior se desplazará como el CUERPO normalmente (menos el efecto de oscilación, por lo que el desplazamiento se detiene al tocar). La DIV fija permanece fija sin interferencia.
Como nota al margen, un alto valor z-index
en el DIV fijo es importante para mantener el DIV desplazable parece estar detrás de él. Normalmente agrego el tamaño de la ventana y los eventos de desplazamiento también para la compatibilidad de resolución de pantalla alternativa y entre navegadores.
Si todo lo demás falla, el código anterior también funcionará con los DIV fijos y desplazables establecidos en {position:absolute;}
.
Parece que jQuery Mobile 1.1 resuelve este problema: http://jquerymobile.com/blog/2012/04/13/announcing-jquery-mobile-1-1-0/ – Tower
posible duplicado de [posicionamiento fijo en Mobile Safari] (http://stackoverflow.com/questions/743123/fixed-positioning-in-mobile-safari) – Christian
Posible duplicado de varias preguntas de SO. Consulte https://gist.github.com/avesus/957889b4941239490c6c441adbe32398#gistcomment-2193547 para obtener más información. –