wishthis/semantic/dist/components/sticky.min.js
2022-02-23 22:46:34 +01:00

11 lines
No EOL
12 KiB
JavaScript

/*
* # Fomantic UI - 2.8.8
* https://github.com/fomantic/Fomantic-UI
* http://fomantic-ui.com/
*
* Copyright 2022 Contributors
* Released under the MIT license
* http://opensource.org/licenses/MIT
*
*/
!function(T,w,B,F){"use strict";T.isFunction=T.isFunction||function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},w=void 0!==w&&w.Math==Math?w:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")(),T.fn.sticky=function(b){var v,e=T(this),x=e.selector||"",C=(new Date).getTime(),S=[],y=b,k="string"==typeof y,z=[].slice.call(arguments,1);return e.each(function(){var t,s,r,e,l=T.isPlainObject(b)?T.extend(!0,{},T.fn.sticky.settings,b):T.extend({},T.fn.sticky.settings),o=l.className,u=l.namespace,d=l.error,n="."+u,h="module-"+u,i=T(this),g=T(w),a=T(l.scrollContext),c=i.data(h),p=w.requestAnimationFrame||w.mozRequestAnimationFrame||w.webkitRequestAnimationFrame||w.msRequestAnimationFrame||function(e){setTimeout(e,0)},f=this,m={initialize:function(){m.determineContainer(),m.determineContext(),m.verbose("Initializing sticky",l,t),m.save.positions(),m.checkErrors(),m.bind.events(),l.observeChanges&&m.observeChanges(),m.instantiate()},instantiate:function(){m.verbose("Storing instance of module",m),c=m,i.data(h,m)},destroy:function(){m.verbose("Destroying previous instance"),m.reset(),r&&r.disconnect(),e&&e.disconnect(),g.off("load"+n,m.event.load).off("resize"+n,m.event.resize),a.off("scrollchange"+n,m.event.scrollchange),i.removeData(h)},observeChanges:function(){"MutationObserver"in w&&(r=new MutationObserver(m.event.documentChanged),e=new MutationObserver(m.event.changed),r.observe(B,{childList:!0,subtree:!0}),e.observe(f,{childList:!0,subtree:!0}),e.observe(s[0],{childList:!0,subtree:!0}),m.debug("Setting up mutation observer",e))},determineContainer:function(){t=l.container?T(l.container):i.offsetParent()},determineContext:function(){0===(s=l.context?T(l.context):t).length&&m.error(d.invalidContext,l.context,i)},checkErrors:function(){m.is.hidden()&&m.error(d.visible,i),m.cache.element.height>m.cache.context.height&&(m.reset(),m.error(d.elementSize,i))},bind:{events:function(){g.on("load"+n,m.event.load).on("resize"+n,m.event.resize),a.off("scroll"+n).on("scroll"+n,m.event.scroll).on("scrollchange"+n,m.event.scrollchange)}},event:{changed:function(e){clearTimeout(m.timer),m.timer=setTimeout(function(){m.verbose("DOM tree modified, updating sticky menu",e),m.refresh()},100)},documentChanged:function(e){[].forEach.call(e,function(e){e.removedNodes&&[].forEach.call(e.removedNodes,function(e){(e==f||0<T(e).find(f).length)&&(m.debug("Element removed from DOM, tearing down events"),m.destroy())})})},load:function(){m.verbose("Page contents finished loading"),p(m.refresh)},resize:function(){m.verbose("Window resized"),p(m.refresh)},scroll:function(){p(function(){a.triggerHandler("scrollchange"+n,a.scrollTop())})},scrollchange:function(e,t){m.stick(t),l.onScroll.call(f)}},refresh:function(e){m.reset(),l.context||m.determineContext(),e&&m.determineContainer(),m.save.positions(),m.stick(),l.onReposition.call(f)},supports:{sticky:function(){var e=T("<div/>");return e.addClass(o.supported),e.css("position").match("sticky")}},save:{lastScroll:function(e){m.lastScroll=e},elementScroll:function(e){m.elementScroll=e},positions:function(){var e={height:a.height()},t={margin:{top:parseInt(i.css("margin-top"),10),bottom:parseInt(i.css("margin-bottom"),10)},offset:i.offset(),width:i.outerWidth(),height:i.outerHeight()},o={offset:s.offset(),height:s.outerHeight()};m.is.standardScroll()||(m.debug("Non-standard scroll. Removing scroll offset from element offset"),e.top=a.scrollTop(),e.left=a.scrollLeft(),t.offset.top+=e.top,o.offset.top+=e.top,t.offset.left+=e.left,o.offset.left+=e.left),m.cache={fits:t.height+l.offset<=e.height,sameHeight:t.height==o.height,scrollContext:{height:e.height},element:{margin:t.margin,top:t.offset.top-t.margin.top,left:t.offset.left,width:t.width,height:t.height,bottom:t.offset.top+t.height},context:{top:o.offset.top,height:o.height,bottom:o.offset.top+o.height}},m.set.containerSize(),m.stick(),m.debug("Caching element positions",m.cache)}},get:{direction:function(e){var t="down";return e=e||a.scrollTop(),m.lastScroll!==F&&(m.lastScroll<e?t="down":m.lastScroll>e&&(t="up")),t},scrollChange:function(e){return e=e||a.scrollTop(),m.lastScroll?e-m.lastScroll:0},currentElementScroll:function(){return m.elementScroll||(m.is.top()?Math.abs(parseInt(i.css("top"),10))||0:Math.abs(parseInt(i.css("bottom"),10))||0)},elementScroll:function(e){e=e||a.scrollTop();var t=m.cache.element,o=m.cache.scrollContext,e=m.get.scrollChange(e),t=t.height-o.height+l.offset,o=m.get.currentElementScroll(),e=o+e;return o=m.cache.fits||e<0?0:t<e?t:e}},remove:{lastScroll:function(){delete m.lastScroll},elementScroll:function(e){delete m.elementScroll},minimumSize:function(){t.css("min-height","")},offset:function(){i.css("margin-top","")}},set:{offset:function(){m.verbose("Setting offset on element",l.offset),i.css("margin-top",l.offset)},containerSize:function(){var e=t.get(0).tagName;"HTML"===e||"body"==e?m.determineContainer():Math.abs(t.outerHeight()-m.cache.context.height)>l.jitter&&(m.debug("Context has padding, specifying exact height for container",m.cache.context.height),t.css({height:m.cache.context.height}))},minimumSize:function(){var e=m.cache.element;t.css("min-height",e.height)},scroll:function(e){m.debug("Setting scroll on element",e),m.elementScroll!=e&&(m.is.top()&&i.css("bottom","").css("top",-e),m.is.bottom()&&i.css("top","").css("bottom",e))},size:function(){0!==m.cache.element.height&&0!==m.cache.element.width&&(f.style.setProperty("width",m.cache.element.width+"px","important"),f.style.setProperty("height",m.cache.element.height+"px","important"))}},is:{standardScroll:function(){return a[0]==w},top:function(){return i.hasClass(o.top)},bottom:function(){return i.hasClass(o.bottom)},initialPosition:function(){return!m.is.fixed()&&!m.is.bound()},hidden:function(){return!i.is(":visible")},bound:function(){return i.hasClass(o.bound)},fixed:function(){return i.hasClass(o.fixed)}},stick:function(e){var t=e||a.scrollTop(),o=m.cache,n=o.fits,i=o.sameHeight,s=o.element,r=o.scrollContext,o=o.context,c=m.is.bottom()&&l.pushing?l.bottomOffset:l.offset,e={top:t+c,bottom:t+c+r.height},t=n?0:m.get.elementScroll(e.top),c=!n;0===s.height||i||(m.is.initialPosition()?e.top>=o.bottom?(m.debug("Initial element position is bottom of container"),m.bindBottom()):e.top>s.top&&(s.height+e.top-t>=o.bottom?(m.debug("Initial element position is bottom of container"),m.bindBottom()):(m.debug("Initial element position is fixed"),m.fixTop())):m.is.fixed()?m.is.top()?e.top<=s.top?(m.debug("Fixed element reached top of container"),m.setInitialPosition()):s.height+e.top-t>=o.bottom?(m.debug("Fixed element reached bottom of container"),m.bindBottom()):c&&(m.set.scroll(t),m.save.lastScroll(e.top),m.save.elementScroll(t)):m.is.bottom()&&(e.bottom-s.height<=s.top?(m.debug("Bottom fixed rail has reached top of container"),m.setInitialPosition()):e.bottom>=o.bottom?(m.debug("Bottom fixed rail has reached bottom of container"),m.bindBottom()):c&&(m.set.scroll(t),m.save.lastScroll(e.top),m.save.elementScroll(t))):m.is.bottom()&&(e.top<=s.top?(m.debug("Jumped from bottom fixed to top fixed, most likely used home/end button"),m.setInitialPosition()):l.pushing?m.is.bound()&&e.bottom<=o.bottom&&(m.debug("Fixing bottom attached element to bottom of browser."),m.fixBottom()):m.is.bound()&&e.top<=o.bottom-s.height&&(m.debug("Fixing bottom attached element to top of browser."),m.fixTop())))},bindTop:function(){m.debug("Binding element to top of parent container"),m.remove.offset(),i.css({left:"",top:"",marginBottom:""}).removeClass(o.fixed).removeClass(o.bottom).addClass(o.bound).addClass(o.top),l.onTop.call(f),l.onUnstick.call(f)},bindBottom:function(){m.debug("Binding element to bottom of parent container"),m.remove.offset(),i.css({left:"",top:""}).removeClass(o.fixed).removeClass(o.top).addClass(o.bound).addClass(o.bottom),l.onBottom.call(f),l.onUnstick.call(f)},setInitialPosition:function(){m.debug("Returning to initial position"),m.unfix(),m.unbind()},fixTop:function(){m.debug("Fixing element to top of page"),l.setSize&&m.set.size(),m.set.minimumSize(),m.set.offset(),i.css({left:m.cache.element.left,bottom:"",marginBottom:""}).removeClass(o.bound).removeClass(o.bottom).addClass(o.fixed).addClass(o.top),l.onStick.call(f)},fixBottom:function(){m.debug("Sticking element to bottom of page"),l.setSize&&m.set.size(),m.set.minimumSize(),m.set.offset(),i.css({left:m.cache.element.left,bottom:"",marginBottom:""}).removeClass(o.bound).removeClass(o.top).addClass(o.fixed).addClass(o.bottom),l.onStick.call(f)},unbind:function(){m.is.bound()&&(m.debug("Removing container bound position on element"),m.remove.offset(),i.removeClass(o.bound).removeClass(o.top).removeClass(o.bottom))},unfix:function(){m.is.fixed()&&(m.debug("Removing fixed position on element"),m.remove.minimumSize(),m.remove.offset(),i.removeClass(o.fixed).removeClass(o.top).removeClass(o.bottom),l.onUnstick.call(f))},reset:function(){m.debug("Resetting elements position"),m.unbind(),m.unfix(),m.resetCSS(),m.remove.offset(),m.remove.lastScroll()},resetCSS:function(){i.css({width:"",height:""}),t.css({height:""})},setting:function(e,t){if(T.isPlainObject(e))T.extend(!0,l,e);else{if(t===F)return l[e];l[e]=t}},internal:function(e,t){if(T.isPlainObject(e))T.extend(!0,m,e);else{if(t===F)return m[e];m[e]=t}},debug:function(){!l.silent&&l.debug&&(l.performance?m.performance.log(arguments):(m.debug=Function.prototype.bind.call(console.info,console,l.name+":"),m.debug.apply(console,arguments)))},verbose:function(){!l.silent&&l.verbose&&l.debug&&(l.performance?m.performance.log(arguments):(m.verbose=Function.prototype.bind.call(console.info,console,l.name+":"),m.verbose.apply(console,arguments)))},error:function(){l.silent||(m.error=Function.prototype.bind.call(console.error,console,l.name+":"),m.error.apply(console,arguments))},performance:{log:function(e){var t,o;l.performance&&(o=(t=(new Date).getTime())-(C||t),C=t,S.push({Name:e[0],Arguments:[].slice.call(e,1)||"",Element:f,"Execution Time":o})),clearTimeout(m.performance.timer),m.performance.timer=setTimeout(m.performance.display,0)},display:function(){var e=l.name+":",o=0;C=!1,clearTimeout(m.performance.timer),T.each(S,function(e,t){o+=t["Execution Time"]}),e+=" "+o+"ms",x&&(e+=" '"+x+"'"),(console.group!==F||console.table!==F)&&0<S.length&&(console.groupCollapsed(e),console.table?console.table(S):T.each(S,function(e,t){console.log(t.Name+": "+t["Execution Time"]+"ms")}),console.groupEnd()),S=[]}},invoke:function(n,e,t){var i,s,o,r=c;return e=e||z,t=f||t,"string"==typeof n&&r!==F&&(n=n.split(/[\. ]/),i=n.length-1,T.each(n,function(e,t){var o=e!=i?t+n[e+1].charAt(0).toUpperCase()+n[e+1].slice(1):n;if(T.isPlainObject(r[o])&&e!=i)r=r[o];else{if(r[o]!==F)return s=r[o],!1;{if(!T.isPlainObject(r[t])||e==i)return r[t]!==F&&(s=r[t]),!1;r=r[t]}}})),T.isFunction(s)?o=s.apply(t,e):s!==F&&(o=s),Array.isArray(v)?v.push(o):v!==F?v=[v,o]:o!==F&&(v=o),s}};k?(c===F&&m.initialize(),m.invoke(y)):(c!==F&&c.invoke("destroy"),m.initialize())}),v!==F?v:this},T.fn.sticky.settings={name:"Sticky",namespace:"sticky",silent:!1,debug:!1,verbose:!0,performance:!0,pushing:!1,context:!1,container:!1,scrollContext:w,offset:0,bottomOffset:0,jitter:5,setSize:!0,observeChanges:!1,onReposition:function(){},onScroll:function(){},onStick:function(){},onUnstick:function(){},onTop:function(){},onBottom:function(){},error:{container:"Sticky element must be inside a relative container",visible:"Element is hidden, you must call refresh after element becomes visible. Use silent setting to surpress this warning in production.",method:"The method you called is not defined.",invalidContext:"Context specified does not exist",elementSize:"Sticky element is larger than its container, cannot create sticky."},className:{bound:"bound",fixed:"fixed",supported:"native",top:"top",bottom:"bottom"}}}(jQuery,window,document);