Mercurial > evolve
view docs/tutorial/jquery.sticky-kit.js @ 4327:9521698a9894
exthelper: support the option argument when registering a command
Largefiles uses this 5th argument with push and pull, so this will be tested in
the next commit. I assume the reason for unrolling and reforming the tuple in
each finalxxxsetup() is to validate that something proper was passed in when
registering. But it's better to explode when decorating than during the delayed
actual registration.
author | Matt Harbison <matt_harbison@yahoo.com> |
---|---|
date | Sun, 23 Dec 2018 21:54:56 -0500 |
parents | aad37ffd7d58 |
children |
line wrap: on
line source
// Generated by CoffeeScript 1.9.2 /** @license Sticky-kit v1.1.2 | WTFPL | Leaf Corcoran 2015 | http://leafo.net */ (function() { var $, win; $ = this.jQuery || window.jQuery; win = $(window); $.fn.stick_in_parent = function(opts) { var doc, elm, enable_bottoming, fn, i, inner_scrolling, len, manual_spacer, offset_top, 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; } 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.height(); 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: elm.outerWidth(true), 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);