Это то, что вы хотите?
(function($) {
$.fn.stalker = function(options) {
var defaults = {
fix : true, // false if you don't want it to fix the parent element
endless : false // true if you don't want it to stop
};
var options = $.extend(defaults, options);
return this.each(function() {
var item = $(this);
var parent = item.parent();
// fix
if(options.fix)
parent.css('position', 'relative');
// item
var itemOffset = item.offset();
var itemPos = item.position();
var itemHeight = item.outerHeight(true);
var itemWidth = item.width();
var itemMarginTop = parseInt(item.css('margin-top'));
// parent
var parHeight = parent.height();
var parPaddingTop = parseInt(parent.css('padding-top'));
var parOffset = parent.offset();
// general
var scrollStart = itemOffset.top - itemMarginTop;
var scrollEnd = parHeight + parPaddingTop + parOffset.top - itemHeight;
var cssEnd = parHeight + parPaddingTop - itemHeight;
$(window).scroll(function() {
var dy = $(window).scrollTop(),
newTop;
if(dy >= scrollStart && dy <= scrollEnd) {
item.css({
'position' : 'fixed',
'left' : itemOffset.left + 'px',
'top' : '0px',
'width' : itemWidth + 'px'
});
} else {
if(!options.endless) {
newTop = (dy <= scrollStart) ? itemPos.top : cssEnd;
item.css({
'position' : 'absolute',
'left' : itemPos.left + 'px',
'top' : newTop + 'px',
'width' : itemWidth + 'px'
});
} else {
if(dy <= scrollStart) {
item.css({
'position' : 'absolute',
'left' : itemPos.left + 'px',
'top' : itemPos.top + 'px',
'width' : itemWidth + 'px'
});
}
}
}
})
});
};
})(jQuery);