Закрепление блока при скроле

JS
Вариант v1.0
Код
      /*
* author: mihail-174
* v1.0
* github: https://github.com/mihail-174
*
* Закрепление блока (например: панель навигации по странице).
* Параметры:
* height: 50     — по умолчанию = высоте блока
*/

$.fn.sticky = function(options) {
    var elem = this;
    options = $.extend({
        height: elem.height()
    }, options);
    if (elem.length) {
        var positionBlock = this.offset().top + options.height;
        $(window).scroll(function() {
            var scroll = $(window).scrollTop();
            if (scroll > positionBlock) {
                elem.addClass('fixed');
            } else if (scroll <= positionBlock) {
                elem.removeClass('fixed');
            }
        });
    }
}
    
Вариант v1.1
Код
      /*
* author: mihail-174
* v1.1
* github: https://github.com/mihail-174
*
* Закрепление блока (например: панель навигации по странице).
*
* USED:
* $('class_блока').sticky();
* *
* Параметры по умолчанию:
* stickyoffsetTop: 0           — расстояние до блока когда его закреплять
* stickyClassName: 'sticky'    — класс для фиксации блока
*/

$.fn.sticky = function(options) {
    var elem = this;
    options = $.extend({
        stickyoffsetTop: 0,
        stickyClassName: 'sticky'
    }, options);
    return this.each(function() {
        if (elem.length) {
            var positionBlock = elem.offset().top;
            $(window).scroll(function() {
                var scroll = $(window).scrollTop();
                if (scroll > positionBlock - options.stickyoffsetTop) {
                    elem.addClass(options.stickyClassName);
                } else if (scroll < positionBlock) {
                    elem.removeClass(options.stickyClassName);
                }
            });
        }
    });
}

    
Вариант v1.2
Код
      /*
* author: mihail-174
* v1.2
* github: https://github.com/mihail-174
*
* Закрепление блока (например: панель навигации по странице).
*
* USED:
* $('class_блока').sticky();
* *
* Параметры по умолчанию:
* stickyoffsetTop: 0           — расстояние до блока когда его закреплять
* stickyClassName: 'sticky'    — класс для фиксации блока
*/

$.fn.sticky = function(options) {
    var elem = this;
    options = $.extend({
        stickyOffsetTop: 0,
        stickyClassName: 'sticky'
    }, options);
    return this.each(function() {
        if (elem.length) {
            var positionBlock = elem.parent().offset().top;
            $(window).scroll(function() {
                var scroll = $(window).scrollTop();
                if (scroll > positionBlock - options.stickyOffsetTop) {
                    elem.addClass(options.stickyClassName);
                    if (scroll > $('main').offset().top + $('main').height()) {
                        elem.removeClass(options.stickyClassName);
                    }
                } else if (scroll < positionBlock) {
                    elem.removeClass(options.stickyClassName);
                }
            });
            $(window).trigger('scroll');
            $(window).resize(function() {
                positionBlock = elem.parent().offset().top;
            });
        }
    });
}