aboutsummaryrefslogtreecommitdiffstats
path: root/library/sticky-kit/sticky-kit.js
diff options
context:
space:
mode:
Diffstat (limited to 'library/sticky-kit/sticky-kit.js')
-rw-r--r--library/sticky-kit/sticky-kit.js265
1 files changed, 265 insertions, 0 deletions
diff --git a/library/sticky-kit/sticky-kit.js b/library/sticky-kit/sticky-kit.js
new file mode 100644
index 000000000..eb2ea8a26
--- /dev/null
+++ b/library/sticky-kit/sticky-kit.js
@@ -0,0 +1,265 @@
+// Generated by CoffeeScript 1.10.0
+
+/**
+@license Sticky-kit v1.1.3 | MIT | Leaf Corcoran 2015 | http://leafo.net
+ */
+
+(function() {
+ var $, win;
+
+ $ = window.jQuery;
+
+ win = $(window);
+
+ $.fn.stick_in_parent = function(opts) {
+ var doc, elm, enable_bottoming, fn, i, inner_scrolling, len, manual_spacer, offset_top, outer_width, parent_selector, recalc_every, sticky_class;
+ if (opts == null) {
+ opts = {};
+ }
+ sticky_class = opts.sticky_class, inner_scrolling = opts.inner_scrolling, recalc_every = opts.recalc_every, parent_selector = opts.parent, offset_top = opts.offset_top, manual_spacer = opts.spacer, enable_bottoming = opts.bottoming;
+ if (offset_top == null) {
+ offset_top = 0;
+ }
+ if (parent_selector == null) {
+ parent_selector = void 0;
+ }
+ if (inner_scrolling == null) {
+ inner_scrolling = true;
+ }
+ if (sticky_class == null) {
+ sticky_class = "is_stuck";
+ }
+ doc = $(document);
+ if (enable_bottoming == null) {
+ enable_bottoming = true;
+ }
+ outer_width = function(el) {
+ var _el, computed, w;
+ if (window.getComputedStyle) {
+ _el = el[0];
+ computed = window.getComputedStyle(el[0]);
+ w = parseFloat(computed.getPropertyValue("width")) + parseFloat(computed.getPropertyValue("margin-left")) + parseFloat(computed.getPropertyValue("margin-right"));
+ if (computed.getPropertyValue("box-sizing") !== "border-box") {
+ w += parseFloat(computed.getPropertyValue("border-left-width")) + parseFloat(computed.getPropertyValue("border-right-width")) + parseFloat(computed.getPropertyValue("padding-left")) + parseFloat(computed.getPropertyValue("padding-right"));
+ }
+ return w;
+ } else {
+ return el.outerWidth(true);
+ }
+ };
+ fn = function(elm, padding_bottom, parent_top, parent_height, top, height, el_float, detached) {
+ var bottomed, detach, fixed, last_pos, last_scroll_height, offset, parent, recalc, recalc_and_tick, recalc_counter, spacer, tick;
+ if (elm.data("sticky_kit")) {
+ return;
+ }
+ elm.data("sticky_kit", true);
+ last_scroll_height = doc.height();
+ parent = elm.parent();
+ if (parent_selector != null) {
+ parent = parent.closest(parent_selector);
+ }
+ if (!parent.length) {
+ throw "failed to find stick parent";
+ }
+ fixed = false;
+ bottomed = false;
+ spacer = manual_spacer != null ? manual_spacer && elm.closest(manual_spacer) : $("<div />");
+ if (spacer) {
+ spacer.css('position', elm.css('position'));
+ }
+ recalc = function() {
+ var border_top, padding_top, restore;
+ if (detached) {
+ return;
+ }
+ last_scroll_height = doc.height();
+ border_top = parseInt(parent.css("border-top-width"), 10);
+ padding_top = parseInt(parent.css("padding-top"), 10);
+ padding_bottom = parseInt(parent.css("padding-bottom"), 10);
+ parent_top = parent.offset().top + border_top + padding_top;
+ parent_height = parent.outerHeight(true);
+ if (fixed) {
+ fixed = false;
+ bottomed = false;
+ if (manual_spacer == null) {
+ elm.insertAfter(spacer);
+ spacer.detach();
+ }
+ elm.css({
+ position: "",
+ top: "",
+ width: "",
+ bottom: ""
+ }).removeClass(sticky_class);
+ restore = true;
+ }
+ top = elm.offset().top - (parseInt(elm.css("margin-top"), 10) || 0) - offset_top;
+ height = elm.outerHeight(true);
+ el_float = elm.css("float");
+ if (spacer) {
+ spacer.css({
+ width: outer_width(elm),
+ height: height,
+ display: elm.css("display"),
+ "vertical-align": elm.css("vertical-align"),
+ "float": el_float
+ });
+ }
+ if (restore) {
+ return tick();
+ }
+ };
+ recalc();
+ if (height === parent_height) {
+ return;
+ }
+ last_pos = void 0;
+ offset = offset_top;
+ recalc_counter = recalc_every;
+ tick = function() {
+ var css, delta, recalced, scroll, will_bottom, win_height;
+ if (detached) {
+ return;
+ }
+ recalced = false;
+ if (recalc_counter != null) {
+ recalc_counter -= 1;
+ if (recalc_counter <= 0) {
+ recalc_counter = recalc_every;
+ recalc();
+ recalced = true;
+ }
+ }
+ if (!recalced && doc.height() !== last_scroll_height) {
+ recalc();
+ recalced = true;
+ }
+ scroll = win.scrollTop();
+ if (last_pos != null) {
+ delta = scroll - last_pos;
+ }
+ last_pos = scroll;
+ if (fixed) {
+ if (enable_bottoming) {
+ will_bottom = scroll + height + offset > parent_height + parent_top;
+ if (bottomed && !will_bottom) {
+ bottomed = false;
+ elm.css({
+ position: "fixed",
+ bottom: "",
+ top: offset
+ }).trigger("sticky_kit:unbottom");
+ }
+ }
+ if (scroll < top) {
+ fixed = false;
+ offset = offset_top;
+ if (manual_spacer == null) {
+ if (el_float === "left" || el_float === "right") {
+ elm.insertAfter(spacer);
+ }
+ spacer.detach();
+ }
+ css = {
+ position: "",
+ width: "",
+ top: ""
+ };
+ elm.css(css).removeClass(sticky_class).trigger("sticky_kit:unstick");
+ }
+ if (inner_scrolling) {
+ win_height = win.height();
+ if (height + offset_top > win_height) {
+ if (!bottomed) {
+ offset -= delta;
+ offset = Math.max(win_height - height, offset);
+ offset = Math.min(offset_top, offset);
+ if (fixed) {
+ elm.css({
+ top: offset + "px"
+ });
+ }
+ }
+ }
+ }
+ } else {
+ if (scroll > top) {
+ fixed = true;
+ css = {
+ position: "fixed",
+ top: offset
+ };
+ css.width = elm.css("box-sizing") === "border-box" ? elm.outerWidth() + "px" : elm.width() + "px";
+ elm.css(css).addClass(sticky_class);
+ if (manual_spacer == null) {
+ elm.after(spacer);
+ if (el_float === "left" || el_float === "right") {
+ spacer.append(elm);
+ }
+ }
+ elm.trigger("sticky_kit:stick");
+ }
+ }
+ if (fixed && enable_bottoming) {
+ if (will_bottom == null) {
+ will_bottom = scroll + height + offset > parent_height + parent_top;
+ }
+ if (!bottomed && will_bottom) {
+ bottomed = true;
+ if (parent.css("position") === "static") {
+ parent.css({
+ position: "relative"
+ });
+ }
+ return elm.css({
+ position: "absolute",
+ bottom: padding_bottom,
+ top: "auto"
+ }).trigger("sticky_kit:bottom");
+ }
+ }
+ };
+ recalc_and_tick = function() {
+ recalc();
+ return tick();
+ };
+ detach = function() {
+ detached = true;
+ win.off("touchmove", tick);
+ win.off("scroll", tick);
+ win.off("resize", recalc_and_tick);
+ $(document.body).off("sticky_kit:recalc", recalc_and_tick);
+ elm.off("sticky_kit:detach", detach);
+ elm.removeData("sticky_kit");
+ elm.css({
+ position: "",
+ bottom: "",
+ top: "",
+ width: ""
+ });
+ parent.position("position", "");
+ if (fixed) {
+ if (manual_spacer == null) {
+ if (el_float === "left" || el_float === "right") {
+ elm.insertAfter(spacer);
+ }
+ spacer.remove();
+ }
+ return elm.removeClass(sticky_class);
+ }
+ };
+ win.on("touchmove", tick);
+ win.on("scroll", tick);
+ win.on("resize", recalc_and_tick);
+ $(document.body).on("sticky_kit:recalc", recalc_and_tick);
+ elm.on("sticky_kit:detach", detach);
+ return setTimeout(tick, 0);
+ };
+ for (i = 0, len = this.length; i < len; i++) {
+ elm = this[i];
+ fn($(elm));
+ }
+ return this;
+ };
+
+}).call(this);