Ver Mensaje Individual
  #2 (permalink)  
Antiguo 19/09/2014, 15:20
Avatar de Alexis88
Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 13 años
Puntos: 977
Respuesta: Menu autoselectivo en desplazamiento vertical

Puedes hacerlo incluso sin necesidad de echar mano de una librería. Este es un ejemplo que hice:

Código HTML:
Ver original
  1. <nav>
  2.     <li>Zona 1</li>
  3.     <li>Zona 2</li>
  4.     <li>Zona 3</li>
  5. </nav>
  6. <div>Zona 1</div>
  7. <div>Zona 2</div>
  8. <div>Zona 3</div>

Código CSS:
Ver original
  1. div{
  2.     height: 800px;
  3. }
  4.  
  5. nav{
  6.     background: lightsteelblue;
  7.     position: fixed;
  8.     width: 100%;
  9.     top: 0;
  10. }
  11.  
  12. nav li:hover, nav li:first-child{
  13.     background: steelblue;
  14. }

Código Javascript:
Ver original
  1. var divs = document.querySelectorAll("div"),
  2.     opts = document.querySelectorAll("nav li"),
  3.     totDivs = divs.length,
  4.     totOpts = opts.length,
  5.     fn = function(j){
  6.         for (var i = 0; i < totOpts; i++){
  7.             opts[i].style.background = i == j ? "steelblue" : "lightsteelblue";
  8.         }
  9.     };
  10.  
  11. window.addEventListener("scroll", function(e){
  12.     for (var i = 0; i < totDivs; i++){
  13.         if (this.scrollY > (divs[i].offsetTop - document.documentElement.clientHeight)){
  14.             fn(i);
  15.         }
  16.     }
  17. }, false);

Esto es sencillo. Tengo un menú con tres opciones y, abajo de este, tres divisiones. Dichas divisiones tienen una altura de 800 píxeles, mientras que coloreo a la primera opción del menú, para que, cuando cargue la página, dicha opción se encuentre marcada por defecto. En el código JS, obtengo al conjunto de divisiones y opciones del menú, obtengo el total de elementos que poseen y declaro una función que usaré más adelante. Cuando se haga scroll en la ventana (desplazamiento con la barra), recorro al conjunto de divisiones existentes. En cada iteración, realizo la siguiente condición: Si la cantidad de píxeles desplazados al hacer scroll es mayor que la resta de la distancia que hay entre la división actual en la iteración con respecto al elemento que lo contiene menos la altura del elemento raíz del documento (<html>), quiere decir que dicha división ya es visible y, por lo tanto, procedemos a ejecutar la función que declaramos al inicio, enviándole como parámetro el número de división equivalente en el bucle.

En la función, recorremos al conjunto de opciones del menú y, en cada iteración, iremos asignando un color de fondo a las opciones. Si el contador de dicho bucle es igual al valor recibido, querrá decir que el número de opción es equivalente al número de división que se está mostrando, por lo que le asigno el mismo color que asigné por defecto a la primera opción, caso contrario, le asigno el color de fondo del menú.

Para que no tengas problemas de compatibilidad con navegadores antiguos, básicamente las versiones anteriores a IE9, te sugiero leer la documentación de los métodos que he utilizado en este ejemplo:

DEMO

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand