gumshoejs
Advanced tools
Comparing version 5.0.1 to 5.1.0
/*! | ||
* gumshoejs v5.0.1 | ||
* gumshoejs v5.1.0 | ||
* A simple, framework-agnostic scrollspy script. | ||
@@ -137,14 +137,51 @@ * (c) 2019 Chris Ferdinandi | ||
/** | ||
* Determine if an element is in the viewport | ||
* Get the document element's height | ||
* @private | ||
* @returns {Number} | ||
*/ | ||
var getDocumentHeight = function () { | ||
return Math.max( | ||
document.body.scrollHeight, document.documentElement.scrollHeight, | ||
document.body.offsetHeight, document.documentElement.offsetHeight, | ||
document.body.clientHeight, document.documentElement.clientHeight | ||
); | ||
}; | ||
/** | ||
* Determine if an element is in view | ||
* @param {Node} elem The element | ||
* @param {Object} settings The settings for this instantiation | ||
* @param {Boolean} bottom If true, check if element is above bottom of viewport instead | ||
* @return {Boolean} Returns true if element is in the viewport | ||
*/ | ||
var isInViewport = function (elem, settings) { | ||
var isInView = function (elem, settings, bottom) { | ||
var bounds = elem.getBoundingClientRect(); | ||
var offset = getOffset(settings); | ||
return parseInt(bounds.top, 10) <= offset && parseInt(bounds.bottom, 10) > offset; | ||
if (bottom) { | ||
return parseInt(bounds.bottom, 10) < (window.innerHeight || document.documentElement.clientHeight); | ||
} | ||
return parseInt(bounds.top, 10) <= offset; | ||
}; | ||
/** | ||
* Check if at the bottom of the viewport | ||
* @return {Boolean} If true, page is at the bottom of the viewport | ||
*/ | ||
var isAtBottom = function () { | ||
if (window.innerHeight + window.pageYOffset >= getDocumentHeight()) return true; | ||
return false; | ||
}; | ||
/** | ||
* Check if the last item should be used (even if not at the top of the page) | ||
* @param {Object} item The last item | ||
* @param {Object} settings The settings for this instantiation | ||
* @return {Boolean} If true, use the last item | ||
*/ | ||
var useLastItem = function (item, settings) { | ||
if (isAtBottom() && isInView(item.content, settings, true)) return true; | ||
return false; | ||
}; | ||
/** | ||
* Get the active content | ||
@@ -156,4 +193,6 @@ * @param {Array} contents The content areas | ||
var getActive = function (contents, settings) { | ||
var last = contents[contents.length-1]; | ||
if (useLastItem(last, settings)) return last; | ||
for (var i = contents.length - 1; i >= 0; i--) { | ||
if (isInViewport(contents[i].content, settings)) return contents[i]; | ||
if (isInView(contents[i].content, settings)) return contents[i]; | ||
} | ||
@@ -160,0 +199,0 @@ }; |
@@ -1,2 +0,2 @@ | ||
/*! gumshoejs v5.0.1 | (c) 2019 Chris Ferdinandi | MIT License | http://github.com/cferdinandi/gumshoe */ | ||
!(function(t,e){"function"==typeof define&&define.amd?define([],(function(){return e(t)})):"object"==typeof exports?module.exports=e(t):t.Gumshoe=e(t)})("undefined"!=typeof global?global:"undefined"!=typeof window?window:this,(function(t){"use strict";var e={navClass:"active",contentClass:"active",nested:!1,nestedClass:"active",offset:0,reflow:!1,events:!0},n=function(t,e,n){if(n.settings.events){var o=new CustomEvent(t,{bubbles:!0,cancelable:!0,detail:n});e.dispatchEvent(o)}},o=function(t){var e=0;if(t.offsetParent)for(;t;)e+=t.offsetTop,t=t.offsetParent;return e>=0?e:0},s=function(t){t.sort((function(t,e){return o(t.content)<o(e.content)?-1:1}))},r=function(t,e){var n=t.getBoundingClientRect(),o=(function(t){return"function"==typeof t.offset?parseFloat(t.offset()):parseFloat(t.offset)})(e);return parseInt(n.top,10)<=o&&parseInt(n.bottom,10)>o},a=function(t,e){if(e.nested){var n=t.parentNode.closest("li");n&&(n.classList.remove(e.nestedClass),a(n,e))}},i=function(t,e){if(t){var o=t.nav.closest("li");o&&(o.classList.remove(e.navClass),t.content.classList.remove(e.contentClass),a(o,e),n("gumshoeDeactivate",o,{link:t.nav,content:t.content,settings:e}))}},c=function(t,e){if(e.nested){var n=t.parentNode.closest("li");n&&(n.classList.add(e.nestedClass),c(n,e))}};return function(o,a){var l,f,u,d,v,p={};p.setup=function(){l=document.querySelectorAll(o),f=[],Array.prototype.forEach.call(l,(function(t){var e=document.getElementById(decodeURIComponent(t.hash.substr(1)));e&&f.push({nav:t,content:e})})),s(f)},p.detect=function(){var t=(function(t,e){for(var n=t.length-1;n>=0;n--)if(r(t[n].content,e))return t[n]})(f,v);t?u&&t.content===u.content||(i(u,v),(function(t,e){if(t){var o=t.nav.closest("li");o&&(o.classList.add(e.navClass),t.content.classList.add(e.contentClass),c(o,e),n("gumshoeActivate",o,{link:t.nav,content:t.content,settings:e}))}})(t,v),u=t):u&&(i(u,v),u=null)};var m=function(e){d&&t.cancelAnimationFrame(d),d=t.requestAnimationFrame(p.detect)},y=function(e){d&&t.cancelAnimationFrame(d),d=t.requestAnimationFrame((function(){s(),p.detect()}))};p.destroy=function(){u&&i(u),t.removeEventListener("scroll",m,!1),v.reflow&&t.removeEventListener("resize",y,!1),f=null,l=null,u=null,d=null,v=null};return v=(function(){var t={};return Array.prototype.forEach.call(arguments,(function(e){for(var n in e){if(!e.hasOwnProperty(n))return;t[n]=e[n]}})),t})(e,a||{}),p.setup(),p.detect(),t.addEventListener("scroll",m,!1),v.reflow&&t.addEventListener("resize",y,!1),p}})); | ||
/*! gumshoejs v5.1.0 | (c) 2019 Chris Ferdinandi | MIT License | http://github.com/cferdinandi/gumshoe */ | ||
!(function(t,e){"function"==typeof define&&define.amd?define([],(function(){return e(t)})):"object"==typeof exports?module.exports=e(t):t.Gumshoe=e(t)})("undefined"!=typeof global?global:"undefined"!=typeof window?window:this,(function(t){"use strict";var e={navClass:"active",contentClass:"active",nested:!1,nestedClass:"active",offset:0,reflow:!1,events:!0},n=function(t,e,n){if(n.settings.events){var o=new CustomEvent(t,{bubbles:!0,cancelable:!0,detail:n});e.dispatchEvent(o)}},o=function(t){var e=0;if(t.offsetParent)for(;t;)e+=t.offsetTop,t=t.offsetParent;return e>=0?e:0},s=function(t){t.sort((function(t,e){return o(t.content)<o(e.content)?-1:1}))},c=function(e,n,o){var s=e.getBoundingClientRect(),c=(function(t){return"function"==typeof t.offset?parseFloat(t.offset()):parseFloat(t.offset)})(n);return o?parseInt(s.bottom,10)<(t.innerHeight||document.documentElement.clientHeight):parseInt(s.top,10)<=c},i=function(){return t.innerHeight+t.pageYOffset>=Math.max(document.body.scrollHeight,document.documentElement.scrollHeight,document.body.offsetHeight,document.documentElement.offsetHeight,document.body.clientHeight,document.documentElement.clientHeight)},r=function(t,e){var n=t[t.length-1];if(function(t,e){return!(!i()||!c(t.content,e,!0))}(n,e))return n;for(var o=t.length-1;o>=0;o--)if(c(t[o].content,e))return t[o]},a=function(t,e){if(e.nested){var n=t.parentNode.closest("li");n&&(n.classList.remove(e.nestedClass),a(n,e))}},l=function(t,e){if(t){var o=t.nav.closest("li");o&&(o.classList.remove(e.navClass),t.content.classList.remove(e.contentClass),a(o,e),n("gumshoeDeactivate",o,{link:t.nav,content:t.content,settings:e}))}},u=function(t,e){if(e.nested){var n=t.parentNode.closest("li");n&&(n.classList.add(e.nestedClass),u(n,e))}};return function(o,c){var i,a,f,d,v,m={};m.setup=function(){i=document.querySelectorAll(o),a=[],Array.prototype.forEach.call(i,(function(t){var e=document.getElementById(decodeURIComponent(t.hash.substr(1)));e&&a.push({nav:t,content:e})})),s(a)},m.detect=function(){var t=r(a,v);t?f&&t.content===f.content||(l(f,v),(function(t,e){if(t){var o=t.nav.closest("li");o&&(o.classList.add(e.navClass),t.content.classList.add(e.contentClass),u(o,e),n("gumshoeActivate",o,{link:t.nav,content:t.content,settings:e}))}})(t,v),f=t):f&&(l(f,v),f=null)};var p=function(e){d&&t.cancelAnimationFrame(d),d=t.requestAnimationFrame(m.detect)},h=function(e){d&&t.cancelAnimationFrame(d),d=t.requestAnimationFrame((function(){s(),m.detect()}))};m.destroy=function(){f&&l(f),t.removeEventListener("scroll",p,!1),v.reflow&&t.removeEventListener("resize",h,!1),a=null,i=null,f=null,d=null,v=null};return v=(function(){var t={};return Array.prototype.forEach.call(arguments,(function(e){for(var n in e){if(!e.hasOwnProperty(n))return;t[n]=e[n]}})),t})(e,c||{}),m.setup(),m.detect(),t.addEventListener("scroll",p,!1),v.reflow&&t.addEventListener("resize",h,!1),m}})); |
/*! | ||
* gumshoejs v5.0.1 | ||
* gumshoejs v5.1.0 | ||
* A simple, framework-agnostic scrollspy script. | ||
@@ -176,14 +176,51 @@ * (c) 2019 Chris Ferdinandi | ||
/** | ||
* Determine if an element is in the viewport | ||
* Get the document element's height | ||
* @private | ||
* @returns {Number} | ||
*/ | ||
var getDocumentHeight = function () { | ||
return Math.max( | ||
document.body.scrollHeight, document.documentElement.scrollHeight, | ||
document.body.offsetHeight, document.documentElement.offsetHeight, | ||
document.body.clientHeight, document.documentElement.clientHeight | ||
); | ||
}; | ||
/** | ||
* Determine if an element is in view | ||
* @param {Node} elem The element | ||
* @param {Object} settings The settings for this instantiation | ||
* @param {Boolean} bottom If true, check if element is above bottom of viewport instead | ||
* @return {Boolean} Returns true if element is in the viewport | ||
*/ | ||
var isInViewport = function (elem, settings) { | ||
var isInView = function (elem, settings, bottom) { | ||
var bounds = elem.getBoundingClientRect(); | ||
var offset = getOffset(settings); | ||
return parseInt(bounds.top, 10) <= offset && parseInt(bounds.bottom, 10) > offset; | ||
if (bottom) { | ||
return parseInt(bounds.bottom, 10) < (window.innerHeight || document.documentElement.clientHeight); | ||
} | ||
return parseInt(bounds.top, 10) <= offset; | ||
}; | ||
/** | ||
* Check if at the bottom of the viewport | ||
* @return {Boolean} If true, page is at the bottom of the viewport | ||
*/ | ||
var isAtBottom = function () { | ||
if (window.innerHeight + window.pageYOffset >= getDocumentHeight()) return true; | ||
return false; | ||
}; | ||
/** | ||
* Check if the last item should be used (even if not at the top of the page) | ||
* @param {Object} item The last item | ||
* @param {Object} settings The settings for this instantiation | ||
* @return {Boolean} If true, use the last item | ||
*/ | ||
var useLastItem = function (item, settings) { | ||
if (isAtBottom() && isInView(item.content, settings, true)) return true; | ||
return false; | ||
}; | ||
/** | ||
* Get the active content | ||
@@ -195,4 +232,6 @@ * @param {Array} contents The content areas | ||
var getActive = function (contents, settings) { | ||
var last = contents[contents.length-1]; | ||
if (useLastItem(last, settings)) return last; | ||
for (var i = contents.length - 1; i >= 0; i--) { | ||
if (isInViewport(contents[i].content, settings)) return contents[i]; | ||
if (isInView(contents[i].content, settings)) return contents[i]; | ||
} | ||
@@ -199,0 +238,0 @@ }; |
@@ -1,2 +0,2 @@ | ||
/*! gumshoejs v5.0.1 | (c) 2019 Chris Ferdinandi | MIT License | http://github.com/cferdinandi/gumshoe */ | ||
Element.prototype.closest||(Element.prototype.matches||(Element.prototype.matches=Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector),Element.prototype.closest=function(t){var e=this;if(!document.documentElement.contains(this))return null;do{if(e.matches(t))return e;e=e.parentElement}while(null!==e);return null}),(function(){if("function"==typeof window.CustomEvent)return!1;function t(t,e){e=e||{bubbles:!1,cancelable:!1,detail:void 0};var n=document.createEvent("CustomEvent");return n.initCustomEvent(t,e.bubbles,e.cancelable,e.detail),n}t.prototype=window.Event.prototype,window.CustomEvent=t})(),(function(t,e){"function"==typeof define&&define.amd?define([],(function(){return e(t)})):"object"==typeof exports?module.exports=e(t):t.Gumshoe=e(t)})("undefined"!=typeof global?global:"undefined"!=typeof window?window:this,(function(t){"use strict";var e={navClass:"active",contentClass:"active",nested:!1,nestedClass:"active",offset:0,reflow:!1,events:!0},n=function(t,e,n){if(n.settings.events){var o=new CustomEvent(t,{bubbles:!0,cancelable:!0,detail:n});e.dispatchEvent(o)}},o=function(t){var e=0;if(t.offsetParent)for(;t;)e+=t.offsetTop,t=t.offsetParent;return e>=0?e:0},s=function(t){t.sort((function(t,e){return o(t.content)<o(e.content)?-1:1}))},r=function(t,e){var n=t.getBoundingClientRect(),o=(function(t){return"function"==typeof t.offset?parseFloat(t.offset()):parseFloat(t.offset)})(e);return parseInt(n.top,10)<=o&&parseInt(n.bottom,10)>o},c=function(t,e){if(e.nested){var n=t.parentNode.closest("li");n&&(n.classList.remove(e.nestedClass),c(n,e))}},i=function(t,e){if(t){var o=t.nav.closest("li");o&&(o.classList.remove(e.navClass),t.content.classList.remove(e.contentClass),c(o,e),n("gumshoeDeactivate",o,{link:t.nav,content:t.content,settings:e}))}},a=function(t,e){if(e.nested){var n=t.parentNode.closest("li");n&&(n.classList.add(e.nestedClass),a(n,e))}};return function(o,c){var l,u,f,d,v,m={};m.setup=function(){l=document.querySelectorAll(o),u=[],Array.prototype.forEach.call(l,(function(t){var e=document.getElementById(decodeURIComponent(t.hash.substr(1)));e&&u.push({nav:t,content:e})})),s(u)},m.detect=function(){var t=(function(t,e){for(var n=t.length-1;n>=0;n--)if(r(t[n].content,e))return t[n]})(u,v);t?f&&t.content===f.content||(i(f,v),(function(t,e){if(t){var o=t.nav.closest("li");o&&(o.classList.add(e.navClass),t.content.classList.add(e.contentClass),a(o,e),n("gumshoeActivate",o,{link:t.nav,content:t.content,settings:e}))}})(t,v),f=t):f&&(i(f,v),f=null)};var p=function(e){d&&t.cancelAnimationFrame(d),d=t.requestAnimationFrame(m.detect)},E=function(e){d&&t.cancelAnimationFrame(d),d=t.requestAnimationFrame((function(){s(),m.detect()}))};m.destroy=function(){f&&i(f),t.removeEventListener("scroll",p,!1),v.reflow&&t.removeEventListener("resize",E,!1),u=null,l=null,f=null,d=null,v=null};return v=(function(){var t={};return Array.prototype.forEach.call(arguments,(function(e){for(var n in e){if(!e.hasOwnProperty(n))return;t[n]=e[n]}})),t})(e,c||{}),m.setup(),m.detect(),t.addEventListener("scroll",p,!1),v.reflow&&t.addEventListener("resize",E,!1),m}})); | ||
/*! gumshoejs v5.1.0 | (c) 2019 Chris Ferdinandi | MIT License | http://github.com/cferdinandi/gumshoe */ | ||
Element.prototype.closest||(Element.prototype.matches||(Element.prototype.matches=Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector),Element.prototype.closest=function(t){var e=this;if(!document.documentElement.contains(this))return null;do{if(e.matches(t))return e;e=e.parentElement}while(null!==e);return null}),(function(){if("function"==typeof window.CustomEvent)return!1;function t(t,e){e=e||{bubbles:!1,cancelable:!1,detail:void 0};var n=document.createEvent("CustomEvent");return n.initCustomEvent(t,e.bubbles,e.cancelable,e.detail),n}t.prototype=window.Event.prototype,window.CustomEvent=t})(),(function(t,e){"function"==typeof define&&define.amd?define([],(function(){return e(t)})):"object"==typeof exports?module.exports=e(t):t.Gumshoe=e(t)})("undefined"!=typeof global?global:"undefined"!=typeof window?window:this,(function(t){"use strict";var e={navClass:"active",contentClass:"active",nested:!1,nestedClass:"active",offset:0,reflow:!1,events:!0},n=function(t,e,n){if(n.settings.events){var o=new CustomEvent(t,{bubbles:!0,cancelable:!0,detail:n});e.dispatchEvent(o)}},o=function(t){var e=0;if(t.offsetParent)for(;t;)e+=t.offsetTop,t=t.offsetParent;return e>=0?e:0},s=function(t){t.sort((function(t,e){return o(t.content)<o(e.content)?-1:1}))},c=function(e,n,o){var s=e.getBoundingClientRect(),c=(function(t){return"function"==typeof t.offset?parseFloat(t.offset()):parseFloat(t.offset)})(n);return o?parseInt(s.bottom,10)<(t.innerHeight||document.documentElement.clientHeight):parseInt(s.top,10)<=c},r=function(){return t.innerHeight+t.pageYOffset>=Math.max(document.body.scrollHeight,document.documentElement.scrollHeight,document.body.offsetHeight,document.documentElement.offsetHeight,document.body.clientHeight,document.documentElement.clientHeight)},i=function(t,e){var n=t[t.length-1];if(function(t,e){return!(!r()||!c(t.content,e,!0))}(n,e))return n;for(var o=t.length-1;o>=0;o--)if(c(t[o].content,e))return t[o]},l=function(t,e){if(e.nested){var n=t.parentNode.closest("li");n&&(n.classList.remove(e.nestedClass),l(n,e))}},a=function(t,e){if(t){var o=t.nav.closest("li");o&&(o.classList.remove(e.navClass),t.content.classList.remove(e.contentClass),l(o,e),n("gumshoeDeactivate",o,{link:t.nav,content:t.content,settings:e}))}},u=function(t,e){if(e.nested){var n=t.parentNode.closest("li");n&&(n.classList.add(e.nestedClass),u(n,e))}};return function(o,c){var r,l,f,d,m,v={};v.setup=function(){r=document.querySelectorAll(o),l=[],Array.prototype.forEach.call(r,(function(t){var e=document.getElementById(decodeURIComponent(t.hash.substr(1)));e&&l.push({nav:t,content:e})})),s(l)},v.detect=function(){var t=i(l,m);t?f&&t.content===f.content||(a(f,m),(function(t,e){if(t){var o=t.nav.closest("li");o&&(o.classList.add(e.navClass),t.content.classList.add(e.contentClass),u(o,e),n("gumshoeActivate",o,{link:t.nav,content:t.content,settings:e}))}})(t,m),f=t):f&&(a(f,m),f=null)};var p=function(e){d&&t.cancelAnimationFrame(d),d=t.requestAnimationFrame(v.detect)},h=function(e){d&&t.cancelAnimationFrame(d),d=t.requestAnimationFrame((function(){s(),v.detect()}))};v.destroy=function(){f&&a(f),t.removeEventListener("scroll",p,!1),m.reflow&&t.removeEventListener("resize",h,!1),l=null,r=null,f=null,d=null,m=null};return m=(function(){var t={};return Array.prototype.forEach.call(arguments,(function(e){for(var n in e){if(!e.hasOwnProperty(n))return;t[n]=e[n]}})),t})(e,c||{}),v.setup(),v.detect(),t.addEventListener("scroll",p,!1),m.reflow&&t.addEventListener("resize",h,!1),v}})); |
{ | ||
"name": "gumshoejs", | ||
"version": "5.0.1", | ||
"version": "5.1.0", | ||
"description": "A simple, framework-agnostic scrollspy script.", | ||
@@ -5,0 +5,0 @@ "main": "./dist/gumshoe.min.js", |
@@ -52,2 +52,10 @@ # Gumshoe [![Build Status](https://travis-ci.org/cferdinandi/gumshoe.svg)](https://travis-ci.org/cferdinandi/gumshoe) | ||
**NPM** | ||
You can also use NPM (or your favorite package manager). | ||
```bash | ||
npm install gumshoejs | ||
``` | ||
### 2. Add the markup to your HTML. | ||
@@ -54,0 +62,0 @@ |
@@ -129,14 +129,51 @@ (function (root, factory) { | ||
/** | ||
* Determine if an element is in the viewport | ||
* Get the document element's height | ||
* @private | ||
* @returns {Number} | ||
*/ | ||
var getDocumentHeight = function () { | ||
return Math.max( | ||
document.body.scrollHeight, document.documentElement.scrollHeight, | ||
document.body.offsetHeight, document.documentElement.offsetHeight, | ||
document.body.clientHeight, document.documentElement.clientHeight | ||
); | ||
}; | ||
/** | ||
* Determine if an element is in view | ||
* @param {Node} elem The element | ||
* @param {Object} settings The settings for this instantiation | ||
* @param {Boolean} bottom If true, check if element is above bottom of viewport instead | ||
* @return {Boolean} Returns true if element is in the viewport | ||
*/ | ||
var isInViewport = function (elem, settings) { | ||
var isInView = function (elem, settings, bottom) { | ||
var bounds = elem.getBoundingClientRect(); | ||
var offset = getOffset(settings); | ||
return parseInt(bounds.top, 10) <= offset && parseInt(bounds.bottom, 10) > offset; | ||
if (bottom) { | ||
return parseInt(bounds.bottom, 10) < (window.innerHeight || document.documentElement.clientHeight); | ||
} | ||
return parseInt(bounds.top, 10) <= offset; | ||
}; | ||
/** | ||
* Check if at the bottom of the viewport | ||
* @return {Boolean} If true, page is at the bottom of the viewport | ||
*/ | ||
var isAtBottom = function () { | ||
if (window.innerHeight + window.pageYOffset >= getDocumentHeight()) return true; | ||
return false; | ||
}; | ||
/** | ||
* Check if the last item should be used (even if not at the top of the page) | ||
* @param {Object} item The last item | ||
* @param {Object} settings The settings for this instantiation | ||
* @return {Boolean} If true, use the last item | ||
*/ | ||
var useLastItem = function (item, settings) { | ||
if (isAtBottom() && isInView(item.content, settings, true)) return true; | ||
return false; | ||
}; | ||
/** | ||
* Get the active content | ||
@@ -148,4 +185,6 @@ * @param {Array} contents The content areas | ||
var getActive = function (contents, settings) { | ||
var last = contents[contents.length-1]; | ||
if (useLastItem(last, settings)) return last; | ||
for (var i = contents.length - 1; i >= 0; i--) { | ||
if (isInViewport(contents[i].content, settings)) return contents[i]; | ||
if (isInView(contents[i].content, settings)) return contents[i]; | ||
} | ||
@@ -152,0 +191,0 @@ }; |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
75251
1440
298
21