Выделение пунктов меню при прокрутке страницы

JS
Вариант v2.2 - с плавной прокруткой до блока
Код
      /*
 * USED:
 * $('class_блока').selectionMenuItemsScrollPage();
 * *
 * Параметры по умолчанию:
 * offsetTop: 60           — расстояние до блока
 * speedScroll: 500        — скорости прокрутки
 * activeClass: 'active'   — класс для активного пункта
 * start: 0,               — расстояние сверху до блока
 * end: 0                  — расстояние до конца блока
 * element: 'li'           — класс элемента для которого присваивать класс актив
*/

 $.fn.selectionMenuItemsScrollPage = function(options) {
    var elem = this;
    options = $.extend({
        offsetTop: 60,
        speedScroll: 500,
        activeClass: 'active',
        start: 0,
        end: 0,
        element: 'li'
    }, options);
    return this.each(function() {
        elem.find('a[href^="#"]').click(function() {
            var el = $(this).attr('href');
            $('body, html').animate({
                scrollTop: $(el).offset().top - options.offsetTop
            }, options.speedScroll);
            return false;
        });
        function callSelectionItems() {
            var scrollTop = $(document).scrollTop();
            elem.find(options.element).each(function() {
                var hash = $(this).find('a').attr("href");
                var target = $(hash);
                if (target.offset().top - options.start <= scrollTop && target.offset().top + target.outerHeight() - options.end > scrollTop) {
                    elem.find(options.element).removeClass(options.activeClass);
                    $(this).addClass(options.activeClass);
                } else {
                    $(this).removeClass(options.activeClass);
                }
            });
        }
        callSelectionItems();
        $(document).on("scroll", function() {
            callSelectionItems();
        });
    });
}

    
Вариант v2.1 - с плавной прокруткой до блока
Код
      /*
 * USED:
 * $('class_блока').selectionMenuItemsScrollPage();
 * *
 * Параметры по умолчанию:
 * offsetTop: 60           — расстояние до блока
 * speedScroll: 500        — скорости прокрутки
 * activeClass: 'active'   — класс для активного пункта
 * start: 0,               — расстояние сверху до блока
 * end: 0                  — расстояние до конца блока
 * element: 'li'           — класс элемента для которого присваивать класс актив
*/

 $.fn.selectionMenuItemsScrollPage = function(options) {
    var elem = this;
    options = $.extend({
        offsetTop: 60,
        speedScroll: 500,
        activeClass: 'active',
        start: 0,
        end: 0,
        element: 'li'
    }, options);
    return this.each(function() {
        elem.find('a[href^="#"]').click(function() {
            var el = $(this).attr('href');
            $('body, html').animate({
                scrollTop: $(el).offset().top - options.offsetTop
            }, options.speedScroll);
            return false;
        });
        $(document).on("scroll", function(){
            var scroll_top = $(document).scrollTop();
            elem.find(options.element).each(function(){
                var hash = $(this).find('a').attr("href");
                var target = $(hash);
                if (target.offset().top - options.start <= scroll_top && target.offset().top + target.outerHeight() - options.end > scroll_top) {
                    elem.find(options.element).removeClass(options.activeClass);
                    $(this).addClass(options.activeClass);
                } else {
                    $(this).removeClass(options.activeClass);
                }
            });
        });
    });
}

    
Вариант v2.0
Код
      /*
 * USED:
 * $('class_блока').selectionMenuItemsScrollPage();
 * *
 * Параметры по умолчанию:
 * activeClass: 'active'   — класс для активного пункта
 * start: 0,               — расстояние сверху до блока
 * end: 0                  — расстояние до конца блока
*/

$.fn.selectionMenuItemsScrollPage = function(options) {
  var elem = this;
  options = $.extend({
    activeClass: 'active',
    start: 0,
    end: 0
  }, options);
  return this.each(function() {
    $(document).on("scroll", function(){
      var scroll_top = $(document).scrollTop();
      elem.find('li').each(function(){
        var hash = $(this).find('a').attr("href");
        var target = $(hash);
        if (target.offset().top - options.start <= scroll_top && target.offset().top + target.outerHeight() - options.end > scroll_top) {
          elem.find('li').removeClass(options.activeClass);
          $(this).addClass(options.activeClass);
        } else {
          $(this).removeClass(options.activeClass);
        }
      });
    });
  });
}

    
Вариант v1.0
Код
      /*
 * USED:
 * $('class_блока').selectionMenuItemsScrollPage();
*/

$.fn.selectionMenuItemsScrollPage = function() {
  var elem = this;
  if (elem.length) {
    $(document).on("scroll", on_Scroll_page_navigation);
    function on_Scroll_page_navigation(){
      var scroll_top = $(document).scrollTop();
      elem.find('li').each(function(){
        var hash = $(this).find('a').attr("href");
        var target = $(hash);
        if (target.offset().top - 100 <= scroll_top && target.offset().top + target.outerHeight() + 100 > scroll_top) {
          elem.find('li').removeClass("active");
          $(this).addClass("active");
        } else {
          $(this).removeClass("active");
        }
      });
    }
  }
}