-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathscroll-fixer.min.js
executable file
·7 lines (7 loc) · 3.13 KB
/
scroll-fixer.min.js
1
2
3
4
5
6
7
/*! scroll-fixer v1.0.1 | ©2012-2018 GestiXi | Licensed under the MIT license */
!function(d){d.fn.scrollFixer=function(a){this.each(function(){var b=d(this),c=b.data("scrollFixerData");if(c)c.didScroll();else{var e=d.extend({},d.fn.scrollFixer.defaults,"object"==typeof a&&a);b.data("scrollFixerData",c=new f(this,e));d(window).on("touchmove",function(a){c.didScroll()});d(window).on("scroll",function(a){c.scheduleUpdate()});d(window).on("resize",function(a){c.scheduleUpdate()});c.didScroll(!0)}})};d.fn.scrollFixer.defaults={didFix:function(){},didUnfix:function(){},canFix:function(){return!0},
marginTop:0,boxShadow:"0 2px 10px rgba(0,0,0,0.25)",zIndex:100};var f=function(a,b){this.element=a;this.options=b;var c=this.$element=d(a);this._initialTop=c.offset().top;this._initialCssTop=c.css("top");var e=this._initialCssPosition=c.css("position");this._initialBoxShadow=c.css("box-shadow");this._initialZIndex=c.css("z-index");this._placeholder=d('<div class="scroll-fixer-placeholder" style="position: '+e+'; z-index: -10; pointer-events: none;"></div>');c.before(this._placeholder)};d.fn.scrollFixer.Constructor=
f;f.prototype={constructor:f,element:null,options:null,fixedElements:[],didScroll:function(a){this._didScheduleUpdate=!1;var b=d(window),c=d(document);b=b.scrollTop();0>b||b>c.height()||(0<b&&b+this.fixedElementsHeight(this)>=this._placeholder.offset().top&&this.options.canFix.call(this)?this.fixElement(a):this.unfixElement())},fixElement:function(a){var b=this.$element,c=this.options,e=this.fixedElements,f=this.fixedElementsHeight(this),g=d(window).scrollTop();c.boxShadow&&(!this._hasDropShadow||
0>=g)&&(this.resetBoxShadow(),0<g&&(this._hasDropShadow=!0,b.css({"box-shadow":c.boxShadow})));this.isFixed?this.updateElementTopIfNeeded(f):(this.isFixed=!0,e.push(this),this._elementTop=f,e=b.height(),b.css({position:"fixed",top:f,"z-index":(parseInt(this._initialZIndex)||0)+c.zIndex}),this._placeholder.css("height",e),a&&window.location.hash.replace("#","")&&window.scrollTo(0,g-(f+e)),this.options.didFix.call(this))},unfixElement:function(){var a=this.$element;if(this.isFixed){this.isFixed=!1;
this.resetBoxShadow();var b=this.fixedElements;b.splice(d.inArray(this,b),1);a.css({position:this._initialCssPosition,top:this._initialCssTop,"z-index":this._initialZIndex});this._placeholder.css("height",0);this.options.didUnfix.call(this)}},fixedElementsHeight:function(){var a=this.fixedElements,b=0;if(a)for(var c=0;c<a.length;c++){var d=a[c];d._initialTop<this._initialTop&&this.isVisibleOnScreen(d.$element)&&(b+=a[c].$element.height())}return b+=this.options.marginTop},resetBoxShadow:function(){for(var a=
this.fixedElements,b=0;b<a.length;b++)a[b].$element.css({"box-shadow":a[b]._initialBoxShadow}),a[b]._hasDropShadow=!1},updateElementTopIfNeeded:function(a){a!==this._elementTop&&(this.$element.css({top:a}),this._elementTop=a)},isVisibleOnScreen:function(a){var b=d(window).scrollTop(),c=b+d(window).height(),e=a.offset().top;return e+a.height()<=c&&e>=b},scheduleUpdate:function(){if(!this._didScheduleUpdate)if(window.requestAnimationFrame){var a=this;this._didScheduleUpdate=!0;requestAnimationFrame(function(){a.didScroll()})}else this.didScroll()}}}(window.jQuery);