Last active
March 29, 2022 06:14
-
-
Save mikeott/f8872eb1e230c342063a22b881182e5b to your computer and use it in GitHub Desktop.
Waypoints control
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <script> | |
| // Actual waypoint script. Save into waypoint.js | |
| /*! | |
| Waypoints - 4.0.0 | |
| Copyright © 2011-2015 Caleb Troughton | |
| Licensed under the MIT license. | |
| https://github.com/imakewebthings/waypoints/blob/master/licenses.txt | |
| */ | |
| ! function() { | |
| "use strict"; | |
| function t(o) { | |
| if (!o) throw new Error("No options passed to Waypoint constructor"); | |
| if (!o.element) throw new Error("No element option passed to Waypoint constructor"); | |
| if (!o.handler) throw new Error("No handler option passed to Waypoint constructor"); | |
| this.key = "waypoint-" + e, this.options = t.Adapter.extend({}, t.defaults, o), this.element = this.options.element, this.adapter = new t.Adapter(this.element), this.callback = o.handler, this.axis = this.options.horizontal ? "horizontal" : "vertical", this.enabled = this.options.enabled, this.triggerPoint = null, this.group = t.Group.findOrCreate({ | |
| name: this.options.group, | |
| axis: this.axis | |
| }), this.context = t.Context.findOrCreateByElement(this.options.context), t.offsetAliases[this.options.offset] && (this.options.offset = t.offsetAliases[this.options.offset]), this.group.add(this), this.context.add(this), i[this.key] = this, e += 1 | |
| } | |
| var e = 0, | |
| i = {}; | |
| t.prototype.queueTrigger = function(t) { | |
| this.group.queueTrigger(this, t) | |
| }, t.prototype.trigger = function(t) { | |
| this.enabled && this.callback && this.callback.apply(this, t) | |
| }, t.prototype.destroy = function() { | |
| this.context.remove(this), this.group.remove(this), delete i[this.key] | |
| }, t.prototype.disable = function() { | |
| return this.enabled = !1, this | |
| }, t.prototype.enable = function() { | |
| return this.context.refresh(), this.enabled = !0, this | |
| }, t.prototype.next = function() { | |
| return this.group.next(this) | |
| }, t.prototype.previous = function() { | |
| return this.group.previous(this) | |
| }, t.invokeAll = function(t) { | |
| var e = []; | |
| for (var o in i) e.push(i[o]); | |
| for (var n = 0, r = e.length; r > n; n++) e[n][t]() | |
| }, t.destroyAll = function() { | |
| t.invokeAll("destroy") | |
| }, t.disableAll = function() { | |
| t.invokeAll("disable") | |
| }, t.enableAll = function() { | |
| t.invokeAll("enable") | |
| }, t.refreshAll = function() { | |
| t.Context.refreshAll() | |
| }, t.viewportHeight = function() { | |
| return window.innerHeight || document.documentElement.clientHeight | |
| }, t.viewportWidth = function() { | |
| return document.documentElement.clientWidth | |
| }, t.adapters = [], t.defaults = { | |
| context: window, | |
| continuous: !0, | |
| enabled: !0, | |
| group: "default", | |
| horizontal: !1, | |
| offset: 0 | |
| }, t.offsetAliases = { | |
| "bottom-in-view": function() { | |
| return this.context.innerHeight() - this.adapter.outerHeight() | |
| }, | |
| "right-in-view": function() { | |
| return this.context.innerWidth() - this.adapter.outerWidth() | |
| } | |
| }, window.Waypoint = t | |
| }(), | |
| function() { | |
| "use strict"; | |
| function t(t) { | |
| window.setTimeout(t, 1e3 / 60) | |
| } | |
| function e(t) { | |
| this.element = t, this.Adapter = n.Adapter, this.adapter = new this.Adapter(t), this.key = "waypoint-context-" + i, this.didScroll = !1, this.didResize = !1, this.oldScroll = { | |
| x: this.adapter.scrollLeft(), | |
| y: this.adapter.scrollTop() | |
| }, this.waypoints = { | |
| vertical: {}, | |
| horizontal: {} | |
| }, t.waypointContextKey = this.key, o[t.waypointContextKey] = this, i += 1, this.createThrottledScrollHandler(), this.createThrottledResizeHandler() | |
| } | |
| var i = 0, | |
| o = {}, | |
| n = window.Waypoint, | |
| r = window.onload; | |
| e.prototype.add = function(t) { | |
| var e = t.options.horizontal ? "horizontal" : "vertical"; | |
| this.waypoints[e][t.key] = t, this.refresh() | |
| }, e.prototype.checkEmpty = function() { | |
| var t = this.Adapter.isEmptyObject(this.waypoints.horizontal), | |
| e = this.Adapter.isEmptyObject(this.waypoints.vertical); | |
| t && e && (this.adapter.off(".waypoints"), delete o[this.key]) | |
| }, e.prototype.createThrottledResizeHandler = function() { | |
| function t() { | |
| e.handleResize(), e.didResize = !1 | |
| } | |
| var e = this; | |
| this.adapter.on("resize.waypoints", function() { | |
| e.didResize || (e.didResize = !0, n.requestAnimationFrame(t)) | |
| }) | |
| }, e.prototype.createThrottledScrollHandler = function() { | |
| function t() { | |
| e.handleScroll(), e.didScroll = !1 | |
| } | |
| var e = this; | |
| this.adapter.on("scroll.waypoints", function() { | |
| (!e.didScroll || n.isTouch) && (e.didScroll = !0, n.requestAnimationFrame(t)) | |
| }) | |
| }, e.prototype.handleResize = function() { | |
| n.Context.refreshAll() | |
| }, e.prototype.handleScroll = function() { | |
| var t = {}, | |
| e = { | |
| horizontal: { | |
| newScroll: this.adapter.scrollLeft(), | |
| oldScroll: this.oldScroll.x, | |
| forward: "right", | |
| backward: "left" | |
| }, | |
| vertical: { | |
| newScroll: this.adapter.scrollTop(), | |
| oldScroll: this.oldScroll.y, | |
| forward: "down", | |
| backward: "up" | |
| } | |
| }; | |
| for (var i in e) { | |
| var o = e[i], | |
| n = o.newScroll > o.oldScroll, | |
| r = n ? o.forward : o.backward; | |
| for (var s in this.waypoints[i]) { | |
| var a = this.waypoints[i][s], | |
| l = o.oldScroll < a.triggerPoint, | |
| h = o.newScroll >= a.triggerPoint, | |
| p = l && h, | |
| u = !l && !h; | |
| (p || u) && (a.queueTrigger(r), t[a.group.id] = a.group) | |
| } | |
| } | |
| for (var c in t) t[c].flushTriggers(); | |
| this.oldScroll = { | |
| x: e.horizontal.newScroll, | |
| y: e.vertical.newScroll | |
| } | |
| }, e.prototype.innerHeight = function() { | |
| return this.element == this.element.window ? n.viewportHeight() : this.adapter.innerHeight() | |
| }, e.prototype.remove = function(t) { | |
| delete this.waypoints[t.axis][t.key], this.checkEmpty() | |
| }, e.prototype.innerWidth = function() { | |
| return this.element == this.element.window ? n.viewportWidth() : this.adapter.innerWidth() | |
| }, e.prototype.destroy = function() { | |
| var t = []; | |
| for (var e in this.waypoints) | |
| for (var i in this.waypoints[e]) t.push(this.waypoints[e][i]); | |
| for (var o = 0, n = t.length; n > o; o++) t[o].destroy() | |
| }, e.prototype.refresh = function() { | |
| var t, e = this.element == this.element.window, | |
| i = e ? void 0 : this.adapter.offset(), | |
| o = {}; | |
| this.handleScroll(), t = { | |
| horizontal: { | |
| contextOffset: e ? 0 : i.left, | |
| contextScroll: e ? 0 : this.oldScroll.x, | |
| contextDimension: this.innerWidth(), | |
| oldScroll: this.oldScroll.x, | |
| forward: "right", | |
| backward: "left", | |
| offsetProp: "left" | |
| }, | |
| vertical: { | |
| contextOffset: e ? 0 : i.top, | |
| contextScroll: e ? 0 : this.oldScroll.y, | |
| contextDimension: this.innerHeight(), | |
| oldScroll: this.oldScroll.y, | |
| forward: "down", | |
| backward: "up", | |
| offsetProp: "top" | |
| } | |
| }; | |
| for (var r in t) { | |
| var s = t[r]; | |
| for (var a in this.waypoints[r]) { | |
| var l, h, p, u, c, d = this.waypoints[r][a], | |
| f = d.options.offset, | |
| w = d.triggerPoint, | |
| y = 0, | |
| g = null == w; | |
| d.element !== d.element.window && (y = d.adapter.offset()[s.offsetProp]), "function" == typeof f ? f = f.apply(d) : "string" == typeof f && (f = parseFloat(f), d.options.offset.indexOf("%") > -1 && (f = Math.ceil(s.contextDimension * f / 100))), l = s.contextScroll - s.contextOffset, d.triggerPoint = y + l - f, h = w < s.oldScroll, p = d.triggerPoint >= s.oldScroll, u = h && p, c = !h && !p, !g && u ? (d.queueTrigger(s.backward), o[d.group.id] = d.group) : !g && c ? (d.queueTrigger(s.forward), o[d.group.id] = d.group) : g && s.oldScroll >= d.triggerPoint && (d.queueTrigger(s.forward), o[d.group.id] = d.group) | |
| } | |
| } | |
| return n.requestAnimationFrame(function() { | |
| for (var t in o) o[t].flushTriggers() | |
| }), this | |
| }, e.findOrCreateByElement = function(t) { | |
| return e.findByElement(t) || new e(t) | |
| }, e.refreshAll = function() { | |
| for (var t in o) o[t].refresh() | |
| }, e.findByElement = function(t) { | |
| return o[t.waypointContextKey] | |
| }, window.onload = function() { | |
| r && r(), e.refreshAll() | |
| }, n.requestAnimationFrame = function(e) { | |
| var i = window.requestAnimationFrame || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame || t; | |
| i.call(window, e) | |
| }, n.Context = e | |
| }(), | |
| function() { | |
| "use strict"; | |
| function t(t, e) { | |
| return t.triggerPoint - e.triggerPoint | |
| } | |
| function e(t, e) { | |
| return e.triggerPoint - t.triggerPoint | |
| } | |
| function i(t) { | |
| this.name = t.name, this.axis = t.axis, this.id = this.name + "-" + this.axis, this.waypoints = [], this.clearTriggerQueues(), o[this.axis][this.name] = this | |
| } | |
| var o = { | |
| vertical: {}, | |
| horizontal: {} | |
| }, | |
| n = window.Waypoint; | |
| i.prototype.add = function(t) { | |
| this.waypoints.push(t) | |
| }, i.prototype.clearTriggerQueues = function() { | |
| this.triggerQueues = { | |
| up: [], | |
| down: [], | |
| left: [], | |
| right: [] | |
| } | |
| }, i.prototype.flushTriggers = function() { | |
| for (var i in this.triggerQueues) { | |
| var o = this.triggerQueues[i], | |
| n = "up" === i || "left" === i; | |
| o.sort(n ? e : t); | |
| for (var r = 0, s = o.length; s > r; r += 1) { | |
| var a = o[r]; | |
| (a.options.continuous || r === o.length - 1) && a.trigger([i]) | |
| } | |
| } | |
| this.clearTriggerQueues() | |
| }, i.prototype.next = function(e) { | |
| this.waypoints.sort(t); | |
| var i = n.Adapter.inArray(e, this.waypoints), | |
| o = i === this.waypoints.length - 1; | |
| return o ? null : this.waypoints[i + 1] | |
| }, i.prototype.previous = function(e) { | |
| this.waypoints.sort(t); | |
| var i = n.Adapter.inArray(e, this.waypoints); | |
| return i ? this.waypoints[i - 1] : null | |
| }, i.prototype.queueTrigger = function(t, e) { | |
| this.triggerQueues[e].push(t) | |
| }, i.prototype.remove = function(t) { | |
| var e = n.Adapter.inArray(t, this.waypoints); | |
| e > -1 && this.waypoints.splice(e, 1) | |
| }, i.prototype.first = function() { | |
| return this.waypoints[0] | |
| }, i.prototype.last = function() { | |
| return this.waypoints[this.waypoints.length - 1] | |
| }, i.findOrCreate = function(t) { | |
| return o[t.axis][t.name] || new i(t) | |
| }, n.Group = i | |
| }(), | |
| function() { | |
| "use strict"; | |
| function t(t) { | |
| this.$element = e(t) | |
| } | |
| var e = window.jQuery, | |
| i = window.Waypoint; | |
| e.each(["innerHeight", "innerWidth", "off", "offset", "on", "outerHeight", "outerWidth", "scrollLeft", "scrollTop"], function(e, i) { | |
| t.prototype[i] = function() { | |
| var t = Array.prototype.slice.call(arguments); | |
| return this.$element[i].apply(this.$element, t) | |
| } | |
| }), e.each(["extend", "inArray", "isEmptyObject"], function(i, o) { | |
| t[o] = e[o] | |
| }), i.adapters.push({ | |
| name: "jquery", | |
| Adapter: t | |
| }), i.Adapter = t | |
| }(), | |
| function() { | |
| "use strict"; | |
| function t(t) { | |
| return function() { | |
| var i = [], | |
| o = arguments[0]; | |
| return t.isFunction(arguments[0]) && (o = t.extend({}, arguments[1]), o.handler = arguments[0]), this.each(function() { | |
| var n = t.extend({}, o, { | |
| element: this | |
| }); | |
| "string" == typeof n.context && (n.context = t(this).closest(n.context)[0]), i.push(new e(n)) | |
| }), i | |
| } | |
| } | |
| var e = window.Waypoint; | |
| window.jQuery && (window.jQuery.fn.waypoint = t(window.jQuery)), window.Zepto && (window.Zepto.fn.waypoint = t(window.Zepto)) | |
| }(); | |
| </script> | |
| ################ | |
| USAGE | |
| ################ | |
| <script type='text/javascript' src='jquery.waypoints.js' id='waypoint'></script> | |
| <script> | |
| // Method 01 | |
| $('#contact').waypoint(function(direction) { | |
| if(direction === 'up') { | |
| // Waypoint in view | |
| } else { | |
| // Waypoint out of view | |
| } | |
| }, | |
| { | |
| offset: '0%' | |
| }); | |
| // Method 02 | |
| var waypoint1 = new Waypoint({ | |
| element: document.getElementById('contact'), | |
| handler: function(direction) { | |
| // Waypoint out of view | |
| } | |
| }); | |
| var waypoint2 = new Waypoint({ | |
| element: document.getElementById('contact'), | |
| offset: '100%', | |
| handler: function(direction) { | |
| // Waypoint in view | |
| } | |
| }); | |
| </script> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment