comparison docs/tutorial/jquery.sticky-kit.js @ 3376:aad37ffd7d58

doc: import the training support Import the training support which was stored in a private-repository before.
author Boris Feld <boris.feld@octobus.net>
date Mon, 08 Jan 2018 11:46:53 +0100
parents
children
comparison
equal deleted inserted replaced
3375:1cb549cd6236 3376:aad37ffd7d58
1 // Generated by CoffeeScript 1.9.2
2
3 /**
4 @license Sticky-kit v1.1.2 | WTFPL | Leaf Corcoran 2015 | http://leafo.net
5 */
6
7 (function() {
8 var $, win;
9
10 $ = this.jQuery || window.jQuery;
11
12 win = $(window);
13
14 $.fn.stick_in_parent = function(opts) {
15 var doc, elm, enable_bottoming, fn, i, inner_scrolling, len, manual_spacer, offset_top, parent_selector, recalc_every, sticky_class;
16 if (opts == null) {
17 opts = {};
18 }
19 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;
20 if (offset_top == null) {
21 offset_top = 0;
22 }
23 if (parent_selector == null) {
24 parent_selector = void 0;
25 }
26 if (inner_scrolling == null) {
27 inner_scrolling = true;
28 }
29 if (sticky_class == null) {
30 sticky_class = "is_stuck";
31 }
32 doc = $(document);
33 if (enable_bottoming == null) {
34 enable_bottoming = true;
35 }
36 fn = function(elm, padding_bottom, parent_top, parent_height, top, height, el_float, detached) {
37 var bottomed, detach, fixed, last_pos, last_scroll_height, offset, parent, recalc, recalc_and_tick, recalc_counter, spacer, tick;
38 if (elm.data("sticky_kit")) {
39 return;
40 }
41 elm.data("sticky_kit", true);
42 last_scroll_height = doc.height();
43 parent = elm.parent();
44 if (parent_selector != null) {
45 parent = parent.closest(parent_selector);
46 }
47 if (!parent.length) {
48 throw "failed to find stick parent";
49 }
50 fixed = false;
51 bottomed = false;
52 spacer = manual_spacer != null ? manual_spacer && elm.closest(manual_spacer) : $("<div />");
53 if (spacer) {
54 spacer.css('position', elm.css('position'));
55 }
56 recalc = function() {
57 var border_top, padding_top, restore;
58 if (detached) {
59 return;
60 }
61 last_scroll_height = doc.height();
62 border_top = parseInt(parent.css("border-top-width"), 10);
63 padding_top = parseInt(parent.css("padding-top"), 10);
64 padding_bottom = parseInt(parent.css("padding-bottom"), 10);
65 parent_top = parent.offset().top + border_top + padding_top;
66 parent_height = parent.height();
67 if (fixed) {
68 fixed = false;
69 bottomed = false;
70 if (manual_spacer == null) {
71 elm.insertAfter(spacer);
72 spacer.detach();
73 }
74 elm.css({
75 position: "",
76 top: "",
77 width: "",
78 bottom: ""
79 }).removeClass(sticky_class);
80 restore = true;
81 }
82 top = elm.offset().top - (parseInt(elm.css("margin-top"), 10) || 0) - offset_top;
83 height = elm.outerHeight(true);
84 el_float = elm.css("float");
85 if (spacer) {
86 spacer.css({
87 width: elm.outerWidth(true),
88 height: height,
89 display: elm.css("display"),
90 "vertical-align": elm.css("vertical-align"),
91 "float": el_float
92 });
93 }
94 if (restore) {
95 return tick();
96 }
97 };
98 recalc();
99 if (height === parent_height) {
100 return;
101 }
102 last_pos = void 0;
103 offset = offset_top;
104 recalc_counter = recalc_every;
105 tick = function() {
106 var css, delta, recalced, scroll, will_bottom, win_height;
107 if (detached) {
108 return;
109 }
110 recalced = false;
111 if (recalc_counter != null) {
112 recalc_counter -= 1;
113 if (recalc_counter <= 0) {
114 recalc_counter = recalc_every;
115 recalc();
116 recalced = true;
117 }
118 }
119 if (!recalced && doc.height() !== last_scroll_height) {
120 recalc();
121 recalced = true;
122 }
123 scroll = win.scrollTop();
124 if (last_pos != null) {
125 delta = scroll - last_pos;
126 }
127 last_pos = scroll;
128 if (fixed) {
129 if (enable_bottoming) {
130 will_bottom = scroll + height + offset > parent_height + parent_top;
131 if (bottomed && !will_bottom) {
132 bottomed = false;
133 elm.css({
134 position: "fixed",
135 bottom: "",
136 top: offset
137 }).trigger("sticky_kit:unbottom");
138 }
139 }
140 if (scroll < top) {
141 fixed = false;
142 offset = offset_top;
143 if (manual_spacer == null) {
144 if (el_float === "left" || el_float === "right") {
145 elm.insertAfter(spacer);
146 }
147 spacer.detach();
148 }
149 css = {
150 position: "",
151 width: "",
152 top: ""
153 };
154 elm.css(css).removeClass(sticky_class).trigger("sticky_kit:unstick");
155 }
156 if (inner_scrolling) {
157 win_height = win.height();
158 if (height + offset_top > win_height) {
159 if (!bottomed) {
160 offset -= delta;
161 offset = Math.max(win_height - height, offset);
162 offset = Math.min(offset_top, offset);
163 if (fixed) {
164 elm.css({
165 top: offset + "px"
166 });
167 }
168 }
169 }
170 }
171 } else {
172 if (scroll > top) {
173 fixed = true;
174 css = {
175 position: "fixed",
176 top: offset
177 };
178 css.width = elm.css("box-sizing") === "border-box" ? elm.outerWidth() + "px" : elm.width() + "px";
179 elm.css(css).addClass(sticky_class);
180 if (manual_spacer == null) {
181 elm.after(spacer);
182 if (el_float === "left" || el_float === "right") {
183 spacer.append(elm);
184 }
185 }
186 elm.trigger("sticky_kit:stick");
187 }
188 }
189 if (fixed && enable_bottoming) {
190 if (will_bottom == null) {
191 will_bottom = scroll + height + offset > parent_height + parent_top;
192 }
193 if (!bottomed && will_bottom) {
194 bottomed = true;
195 if (parent.css("position") === "static") {
196 parent.css({
197 position: "relative"
198 });
199 }
200 return elm.css({
201 position: "absolute",
202 bottom: padding_bottom,
203 top: "auto"
204 }).trigger("sticky_kit:bottom");
205 }
206 }
207 };
208 recalc_and_tick = function() {
209 recalc();
210 return tick();
211 };
212 detach = function() {
213 detached = true;
214 win.off("touchmove", tick);
215 win.off("scroll", tick);
216 win.off("resize", recalc_and_tick);
217 $(document.body).off("sticky_kit:recalc", recalc_and_tick);
218 elm.off("sticky_kit:detach", detach);
219 elm.removeData("sticky_kit");
220 elm.css({
221 position: "",
222 bottom: "",
223 top: "",
224 width: ""
225 });
226 parent.position("position", "");
227 if (fixed) {
228 if (manual_spacer == null) {
229 if (el_float === "left" || el_float === "right") {
230 elm.insertAfter(spacer);
231 }
232 spacer.remove();
233 }
234 return elm.removeClass(sticky_class);
235 }
236 };
237 win.on("touchmove", tick);
238 win.on("scroll", tick);
239 win.on("resize", recalc_and_tick);
240 $(document.body).on("sticky_kit:recalc", recalc_and_tick);
241 elm.on("sticky_kit:detach", detach);
242 return setTimeout(tick, 0);
243 };
244 for (i = 0, len = this.length; i < len; i++) {
245 elm = this[i];
246 fn($(elm));
247 }
248 return this;
249 };
250
251 }).call(this);