Aquí está un ejemplo de trabajo: http://jsfiddle.net/YWnzc/7/
Y el código (bastante similar al de Rizzle, con un par de cambios que voy a explicar):
$('a').hover(function(){
var selector = $(this).data('section');
var scrollAmount = $(selector).offset().top + $('#wrapper')[0].scrollTop - 129;
$('#wrapper').animate({scrollTop: scrollAmount}, 250);
},function(){
$('#wrapper').animate({scrollTop: 0}, 250);
});
Primero, var selector = $(this).data('section');
bec ause en jsFiddle, el atributo href devolvía la ruta completa de la página + el hash. Así que lo cambié a un atributo de datos html5 (data-section
).
La siguiente línea es similar a la de rizzle, excepto que tomamos el desplazamiento de la sección y lo agregamos al valor actual scrollTop
del #wrapper
. Como él señaló, todavía hay algunos problemas de compensación extraños, y descubrí que restar 129 dio el truco. Si bien este número 129 podría parecer algo que probablemente se rompa, probé cambiando el tamaño de las secciones, haciendo que no fueran iguales, etc., y continuó funcionando. Estoy usando Chrome, y tal vez un navegador que no sea webkit necesitaría una constante diferente para restar. Pero parece que el número 129 es al menos algún tipo de constante.
El resto debe ser bastante autoexplicativo.
Una cosa a destacar: a medida que mueve el cursor sobre las <a>
etiquetas, el contenido de la #wrapper
div parecerá a saltar alrededor, pero eso es sólo porque la parte mouseleave del evento activable brevemente se desencadena como se mueve el cursor. Estoy seguro de que puedes resolverlo :):
Ten en cuenta que la mayoría de los navegadores Android y iOS anteriores no son compatibles con el desplazamiento de DIV – rizzle