Aquí tiene, bastante similares:
http://jsfiddle.net/AlienWebguy/mvtP7/1/
HTML:
<div id="header1" class="header fixed">
<h2>Header1</h2>
</div>
<div id="header1_content">
<p>Lorem ipsum dolor sit amet...</p>
</div>
<div id="header2" class="header relative">
<h2>Header2</h2>
</div>
<div id="header2_content">
<p>Lorem ipsum dolor sit amet...</p>
</div>
<div id="header3" class="header relative">
<h2>Header3</h2>
</div>
<div id="header3_content">
<p>Lorem ipsum dolor sit amet...</p>
</div>
CSS:
p {
background-color:#F0F0F0;
}
.header {
background-color:#CCC;
width:100%;
top:0;
left:0;
}
.header h2 {
margin:20px;
}
.fixed {
position:fixed;
}
.relative {
position:static;
}
#header1_content {
margin-top:80px;
}
JQuery:
$(function(){
var lastScrollTop = 0;
$(window).scroll(function(event){
var currentScrollTop = $(this).scrollTop();
if (currentScrollTop > lastScrollTop){
// Scrolling down
$('.header').each(function(){
if($(this).hasClass('fixed'))
{
var _next_header = $(this).nextUntil('.header').next('.header');
if($(_next_header).length > 0)
{
if(($(this).offset().top + $(this).height()) >= $(_next_header).offset().top)
{
// Bottom of header hit top of next header
$(this).removeClass('fixed').addClass('relative');
$(_next_header).removeClass('relative').addClass('fixed');
}
}
}
});
}
else
{
// Scrolling up
$('.header').each(function(){
if($(this).hasClass('fixed'))
{
var _prev_header = $(this).prevUntil('.header').prev('.header');
if($(_prev_header).length > 0)
{
if($(this).offset().top <= ($('#' + $(_prev_header).attr('id') + '_content').offset().top + $(this).height()))
{
// Top of header hit bottom of previous content box
$(this).removeClass('fixed').addClass('relative');
$(_prev_header).removeClass('relative').addClass('fixed');
}
}
}
});
}
lastScrollTop = currentScrollTop;
});
});
Así que, esencialmente lo que estamos haciendo es crear algo de la detección básica de colisión. Cuando nos desplazamos hacia abajo, detectamos si la parte inferior del encabezado actual colisiona con la parte superior del siguiente encabezado. Si lo hace, lo cambiamos. Cuando nos desplazamos hacia arriba, detectamos si la parte superior del encabezado actual colisiona con la parte inferior del contenedor de contenido anterior y realiza el intercambio.
Llevando esto al siguiente nivel para emular con mayor precisión el menú del iPhone, probablemente desee volver a colocar los encabezados dentro del DOM sobre la marcha cuando colisionen, lo que daría la ilusión de que uno "empuja al otro fuera del camino ", una vez que el anterior está fuera de la pantalla, aplicaría el posicionamiento fijo al nuevo encabezado. Esta demo debería llevarlo por el camino correcto al menos :)
Espero que esto ayude!
Ha intentado nada – meo
el mejor que he encontrado: http://polarblau.github.io/stickySectionHeaders/ – tborychowski