(function($) { var stickMe = function(options) { var defaults = { element: '.js-sticky', wrapper: '.js-stickyWrapper', classNameSticky: 'is-sticky', classNameSunk: 'is-sunk', classNameSunkWrapper: 'is-sunk-wrapper', offset: 150 // 상단에서 150px 간격 }; var settings = $.extend({}, defaults, options); var $element = $(settings.element); var $wrapper = $(settings.wrapper); var latestKnownScrollY = 0, ticking = false; function onScroll() { latestKnownScrollY = $(window).scrollTop(); requestTick(); } function requestTick() { if (!ticking) { requestAnimationFrame(update); } ticking = true; } function update() { ticking = false; var position = latestKnownScrollY; var wrapperTop = $wrapper.offset().top; var wrapperHeight = $wrapper.height(); var elementHeight = $element.height(); var topBoundary = wrapperTop - settings.offset; var bottomBoundary = wrapperTop + wrapperHeight - elementHeight - settings.offset; // 768px 이상에서만 고정 효과 적용 if (window.innerWidth >= 768) { if (position >= topBoundary) { if (position >= bottomBoundary) { unStick(); sink(); } else { stick(); unSink(); } } else { unStick(); } } else { unStick(); // 767px 이하에서는 고정 해제 } } function stick() { var elementWidth = $element.parent().width(); var elementLeft = $element.offset().left; $element.addClass(settings.classNameSticky).css({ top: settings.offset + 'px', position: 'fixed', width: elementWidth + 'px', left: elementLeft + 'px' }); } function unStick() { $element.removeClass(settings.classNameSticky).css({ top: '', position: '', width: '', left: '' }); } function sink() { $element.addClass(settings.classNameSunk); $wrapper.addClass(settings.classNameSunkWrapper); } function unSink() { $element.removeClass(settings.classNameSunk); $wrapper.removeClass(settings.classNameSunkWrapper); } $(window).on('scroll', onScroll); }; $(document).ready(function() { stickMe(); }); })(jQuery);