2011-03-15 6 views
9

Estoy construyendo un sitio web de un buscapersonas. P.ej. cada página (5 en total) está en una página grande con el menú principal fijo en la parte superior. Cuando hace clic en un enlace de menú, lo desliza hacia la etiqueta de anclaje de esas páginas y el elemento de menú cliqueado obtiene una clase de CSS "activa".jQuery cambiar hash (identificador de fragmento) mientras se desplaza hacia abajo página

Lo que me gustaría hacer ahora es permitir al usuario desplazarse por sí mismo pero aún tener el elemento "activo" de menú y el hash de URL cambian a medida que lo hacen.

Así que mi pregunta básicamente es cómo sé cuando el usuario se ha desplazado a una página diferente para poder actualizar el menú y hash URL (identificador de fragmento).

Gracias

+1

mejor manera hasta a la fecha de hacer esto es usar la API de historial de HTML5. Consulte [esta pregunta relacionada] (https://stackoverflow.com/questions/1397329/how-to-remove-the-hash-from-window-location-with-javascript-without-page-refresh/5298684#answer-5298684) para más detalles. – rugk

Respuesta

18

su posible pero hay un requisito a la página (para mi solución al trabajo):

su página tiene que ser separados en divs (o partes de lo que sea) con los identificadores únicos (espero que no utiliza el ancla <a> 's)

que puede utilizar código como este:

$(document).bind('scroll',function(e){ 
    $('section').each(function(){ 
     if (
      $(this).offset().top < window.pageYOffset + 10 
//begins before top 
     && $(this).offset().top + $(this).height() > window.pageYOffset + 10 
//but ends in visible area 
//+ 10 allows you to change hash before it hits the top border 
     ) { 
      window.location.hash = $(this).attr('id'); 
     } 
    }); 
}); 

con html como esto

<section id="home"> 
    Home 
</section> 
<section id="works"> 
    Works 
</section> 
<section id="about"> 
    About 
</section> 
+0

Podría publicar el código que iría a la parte "window.location.hash". Usé window.location.hash = $ (this) .attr ('href'), pero obtengo #undefinido para cada hash. Gracias – suludi

+0

@suludi esas secciones no tienen un 'href' pero' id' – Valerij

+0

Lo siento, lo noté de inmediato. Pero la cuestión es que no me permite desplazarme en absoluto. No pude desplazarme por el sitio web en el que estoy trabajando, pero hay demasiados guiones (desplazándolos), así que pensé que quizás era un conflicto. Así que creé una página simple y limpia con 4 secciones, y todavía no me permite desplazarme. Aquí está el enlace, ayuda muy apreciada: http://madebym.me/test/scroll-hash – suludi

1

con jQuery se puede utilizar el método scrollTop para encontrar la posición de desplazamiento y luego compararlo decir, la posición de los elementos de la página para hacer ejercicio dónde están en la página y actualizar en consecuencia.

2

Tengo el mismo problema de esto para el contenido de la sección de altura de corrección que cambiará Hash de acuerdo con el desplazamiento. De alguna manera este código no funciona en otro navegador aparte de Chrome. Y también manipular DOM en el rollo, entonces tiene que tomar mucho tiempo para ese evento para obtener proceso se refiere http://www.smashingmagazine.com/2013/06/10/pinterest-paint-performance-case-study/ Aquí hay código de ejemplo de cómo puedo solucionar este

(function() { 
    // Find all top,bottom and Hash of each sections, 
    // Do this only if the section height remain the same always 
    // Move this into the step() if your section height does change. 
    // e.g. browser resize 
    // 
    var section = $.map($("section"), function (e) { 
     var $e = $(e); 
     var pos = $e.position(); 
     return { 
      top: pos.top, 
      bottom: pos.top + $e.height(), 
      hash: $e.attr('id') 
     }; 
    }); 

    //Checking scroll 
    var top = null; 
    var changed = false; 
    var currentHash = null; 

    $(window).scroll(function() { 
     var newTop = $(document).scrollTop(); 

     changed = newTop != top; 
     if (changed) { 
      top = newTop; 
     } 

    }); 

    // You wouldn't want to keep checking the scroll state as 
    // it affects the browser performance when it's accessing 
    // DOM and reduce your FPS (Frame per Seconds) for scrolling 
    // 
    function step() { 
     if (!changed) { 
      // Top did not change 
      return setTimeout(step, 200); 
     } 
     var count = section.length; 
     var p; 

     while (p = section[--count]) { 
      if (p.top >= top || p.bottom <= top) { 
       continue; 
      } 
      if (currentHash == p.hash) { 
       break; 
      } 
      var scrollTop = $(document).scrollTop(); 
      window.location.hash = currentHash = p.hash; 
      // prevent browser to scroll 
      $(document).scrollTop(scrollTop); 
     } 
     setTimeout(step, 200); 
    } 
    setTimeout(step, 200); 
})(); 

Demo

Cuestiones relacionadas