-
Notifications
You must be signed in to change notification settings - Fork 57
/
fixto.min.js
3 lines (3 loc) · 5.45 KB
/
fixto.min.js
1
2
3
/*! fixto - v0.1.7 - 2013-02-02
* http://github.com/bbarakaci/fixto/*/
var fixto=function(a,b,c){function h(b,c,d){this.child=b,this._$child=a(b),this.parent=c,this._replacer=new e.MimicNode(b),this._ghostNode=this._replacer.replacer,this.options=a.extend({className:"fixto-fixed"},d),this.options.mind&&(this._$mind=a(this.options.mind)),this.options.zIndex&&(this.child.style.zIndex=this.options.zIndex),this._saveStyles(),this._saveViewportHeight(),this._proxied_onscroll=this._bind(this._onscroll,this),this._proxied_onresize=this._bind(this._onresize,this),this.start()}var d=function(){var a={getAll:function(a){return c.defaultView.getComputedStyle(a)},get:function(a,b){return this.getAll(a)[b]},toFloat:function(a){return parseFloat(a,10)||0},getFloat:function(a,b){return this.toFloat(this.get(a,b))},_getAllCurrentStyle:function(a){return a.currentStyle}};return c.documentElement.currentStyle&&(a.getAll=a._getAllCurrentStyle),a}(),e=function(){function b(a){this.element=a,this.replacer=c.createElement("div"),this.replacer.style.visibility="hidden",this.hide(),a.parentNode.insertBefore(this.replacer,a)}b.prototype={replace:function(){var a=this.replacer.style,b=d.getAll(this.element);a.width=this._width(),a.height=this._height(),a.marginTop=b.marginTop,a.marginBottom=b.marginBottom,a.marginLeft=b.marginLeft,a.marginRight=b.marginRight,a.cssFloat=b.cssFloat,a.styleFloat=b.styleFloat,a.position=b.position,a.top=b.top,a.right=b.right,a.bottom=b.bottom,a.left=b.left,a.display=b.display},hide:function(){this.replacer.style.display="none"},_width:function(){return this.element.getBoundingClientRect().width+"px"},_widthOffset:function(){return this.element.offsetWidth+"px"},_height:function(){return this.element.getBoundingClientRect().height+"px"},_heightOffset:function(){return this.element.offsetHeight+"px"},destroy:function(){a(this.replacer).remove();for(var b in this)this.hasOwnProperty(b)&&(this[b]=null)}};var e=c.documentElement.getBoundingClientRect();return e.width||(b.prototype._width=b.prototype._widthOffset,b.prototype._height=b.prototype._heightOffset),{MimicNode:b,computedStyle:d}}(),f=navigator.appName==="Microsoft Internet Explorer",g;f&&(g=parseFloat(navigator.appVersion.split("MSIE")[1])),h.prototype={_bind:function(a,b){return function(){return a.call(b)}},_toresize:g===8?c.documentElement:b,_mindtop:function(){var b=0;return this._$mind&&a(this._$mind).each(function(){b+=a(this).outerHeight(!0)}),b},_onscroll:function(){this._scrollTop=c.documentElement.scrollTop||c.body.scrollTop,this._parentBottom=this.parent.offsetHeight+this._fullOffset("offsetTop",this.parent)-d.getFloat(this.parent,"paddingBottom");if(!this.fixed)this._scrollTop<this._parentBottom&&this._scrollTop>this._fullOffset("offsetTop",this.child)-d.getFloat(this.child,"marginTop")-this._mindtop()&&this._viewportHeight>this.child.offsetHeight+d.getFloat(this.child,"marginTop")+d.getFloat(this.child,"marginBottom")&&(this._fix(),this._adjust());else{if(this._scrollTop>this._parentBottom||this._scrollTop<this._fullOffset("offsetTop",this._ghostNode)-d.getFloat(this._ghostNode,"marginTop")-this._mindtop()){this._unfix();return}this._adjust()}},_adjust:function(){var a=this._parentBottom-this._scrollTop-(this.child.offsetHeight+d.getFloat(this.child,"marginTop")+d.getFloat(this.child,"marginBottom")+this._mindtop()),b=this._mindtop();a<0?this.child.style.top=a+b+"px":this.child.style.top=0+b+"px"},_fullOffset:function(a,b){var c=b[a];while(b.offsetParent!==null)b=b.offsetParent,c=c+b[a];return c},_fix:function(){var a=this.child,b=a.style;this._saveStyles();if(c.documentElement.currentStyle){var e=d.getAll(a);b.left=this._fullOffset("offsetLeft",a)-d.getFloat(a,"marginLeft")+"px",b.width=a.offsetWidth-(d.toFloat(e.paddingLeft)+d.toFloat(e.paddingRight)+d.toFloat(e.borderLeftWidth)+d.toFloat(e.borderRightWidth))+"px"}else b.width=d.get(a,"width"),b.left=a.getBoundingClientRect().left-d.getFloat(a,"marginLeft")+"px";this._replacer.replace(),b.position="fixed",b.top=this._mindtop()+"px",this._$child.addClass(this.options.className),this.fixed=!0},_unfix:function(){var a=this.child.style;this._replacer.hide(),a.position=this._childOriginalPosition,a.top=this._childOriginalTop,a.width=this._childOriginalWidth,a.left=this._childOriginalLeft,this._$child.removeClass(this.options.className),this.fixed=!1},_saveStyles:function(){var a=this.child.style;this._childOriginalPosition=a.position,this._childOriginalTop=a.top,this._childOriginalWidth=a.width,this._childOriginalLeft=a.left},_onresize:function(){this._saveViewportHeight(),this._unfix(),this._onscroll()},_saveViewportHeight:function(){this._viewportHeight=b.innerHeight||c.documentElement.clientHeight},stop:function(){this._unfix(),a(b).unbind("scroll",this._proxied_onscroll),a(this._toresize).unbind("resize",this._proxied_onresize),this._running=!1},start:function(){this._running||(this._onscroll(),a(b).bind("scroll",this._proxied_onscroll),a(this._toresize).bind("resize",this._proxied_onresize),this._running=!0)},destroy:function(){this.stop(),this._$child.removeData("fixto-instance"),this._replacer.destroy();for(var a in this)this.hasOwnProperty(a)&&(this[a]=null)}};var i=function(a,b,c){return new h(a,b,c)},j="ontouchstart"in b;if(j||g<8)i=function(){return"not supported"};return a.fn.fixTo=function(b,c){var d=a(b),e=0;return this.each(function(){var f=a(this).data("fixto-instance");if(!f)a(this).data("fixto-instance",i(this,d[e],c));else{var g=b;f[g].call(f)}e++})},{FixToContainer:h,fixTo:i,computedStyle:d,mimicNode:e}}(window.jQuery,window,document);