File "sticky.js"
Full Path: /var/www/vhosts/hogsandbbqs.co.uk/httpdocs/addons/polaris/sticky.js
File size: 3.82 KB
MIME-type: text/plain
Charset: utf-8
/*! UIkit 2.8.0 | http://www.getuikit.com | (c) 2014 YOOtheme | MIT License */
(function(addon) {
var component;
if (jQuery && jQuery.UIkit) {
component = addon(jQuery, jQuery.UIkit);
}
if (typeof define == "function" && define.amd) {
define("uikit-sticky", ["uikit"], function(){
return component || addon(jQuery, jQuery.UIkit);
});
}
})(function($, UI){
var $win = UI.$win,
$doc = UI.$doc,
sticked = [];
UI.component('sticky', {
defaults: {
top : 0,
bottom : 0,
clsactive : 'uk-active',
clswrapper : 'uk-sticky',
getWidthFrom : ''
},
init: function() {
var stickyId = this.element.attr('id') || ("s"+Math.ceil(Math.random()*10000)),
wrapper = $('<div></div>').attr('id', 'sticky-'+stickyId).addClass(this.options.clswrapper);
wrapper = this.element.wrap(wrapper).parent().css('height', this.element.outerHeight());
if (this.element.css("float") != "none") {
wrapper.css({"float":this.element.css("float")});
this.element.css({"float":"none"});
}
sticked.push({
top: this.options.top,
bottom: this.options.bottom,
element: this.element,
currentTop: null,
wrapper: wrapper,
clsactive: this.options.clsactive,
getWidthFrom: this.options.getWidthFrom || wrapper
});
},
update: function() {
scroller();
}
});
function scroller() {
if (!sticked.length) return;
var scrollTop = $win.scrollTop(),
documentHeight = $doc.height(),
dwh = documentHeight - $win.height(),
extra = (scrollTop > dwh) ? dwh - scrollTop : 0;
for (var i = 0; i < sticked.length; i++) {
if (!sticked[i].element.is(":visible")) {
continue;
}
var sticky = sticked[i],
elementTop = sticky.wrapper.offset().top,
etse = elementTop - sticky.top - extra;
if (scrollTop <= etse) {
if (sticky.currentTop !== null) {
sticky.element.css({"position":"", "top":"", "width":"", "left":""});
sticky.wrapper.removeClass(sticky.clsactive);
sticky.currentTop = null;
}
} else {
var newTop = documentHeight - sticky.element.outerHeight() - sticky.top - sticky.bottom - scrollTop - extra;
newTop = newTop < 0 ? newTop + sticky.top : sticky.top;
if (sticky.currentTop != newTop) {
sticky.element.css({
"position" : "fixed",
"top" : newTop,
"width" : (typeof sticky.getWidthFrom !== 'undefined') ? $(sticky.getWidthFrom).width() : sticky.element.width(),
"left" : sticky.wrapper.offset().left
});
sticky.wrapper.addClass(sticky.clsactive);
sticky.currentTop = newTop;
}
}
}
}
// should be more efficient than using $win.scroll(scroller):
$doc.on('uk-scroll', scroller);
$doc.on("uk-domready", function(e) {
setTimeout(function(){
scroller();
$("[data-uk-sticky]").each(function(){
var $ele = $(this);
if(!$ele.data("sticky")) {
UI.sticky($ele, UI.Utils.options($ele.attr('data-uk-sticky')));
}
});
}, 0);
});
return $.fn.uksticky;
});