-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathsmooth-scroll.min.js
More file actions
16 lines (16 loc) · 7.07 KB
/
smooth-scroll.min.js
File metadata and controls
16 lines (16 loc) · 7.07 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
(function(root,factory){if(typeof define==='function'&&define.amd){define([],factory(root))}else if(typeof exports==='object'){module.exports=factory(root)}else{root.smoothScroll=factory(root)}})(typeof global!=='undefined'?global:this.window||this.global,function(root){'use strict';var smoothScroll={};var supports='querySelector' in document&&'addEventListener' in root;var settings,eventTimeout,fixedHeader,headerHeight;var defaults={selector:'[data-scroll]',selectorHeader:'[data-scroll-header]',speed:500,easing:'easeInOutCubic',offset:0,updateURL:!0,callback:function(){}};var extend=function(){var extended={};var deep=!1;var i=0;var length=arguments.length;if(Object.prototype.toString.call(arguments[0])==='[object Boolean]'){deep=arguments[0];i++}
var merge=function(obj){for(var prop in obj){if(Object.prototype.hasOwnProperty.call(obj,prop)){if(deep&&Object.prototype.toString.call(obj[prop])==='[object Object]'){extended[prop]=extend(!0,extended[prop],obj[prop])}else{extended[prop]=obj[prop]}}}};for(;i<length;i++){var obj=arguments[i];merge(obj)}
return extended};var getHeight=function(elem){return Math.max(elem.scrollHeight,elem.offsetHeight,elem.clientHeight)};var getClosest=function(elem,selector){var firstChar=selector.charAt(0);var supports='classList' in document.documentElement;var attribute,value;if(firstChar==='['){selector=selector.substr(1,selector.length-2);attribute=selector.split('=');if(attribute.length>1){value=!0;attribute[1]=attribute[1].replace(/"/g,'').replace(/'/g,'')}}
for(;elem&&elem!==document;elem=elem.parentNode){if(firstChar==='.'){if(supports){if(elem.classList.contains(selector.substr(1))){return elem}}else{if(new RegExp('(^|\\s)'+selector.substr(1)+'(\\s|$)').test(elem.className)){return elem}}}
if(firstChar==='#'){if(elem.id===selector.substr(1)){return elem}}
if(firstChar==='['){if(elem.hasAttribute(attribute[0])){if(value){if(elem.getAttribute(attribute[0])===attribute[1]){return elem}}else{return elem}}}
if(elem.tagName.toLowerCase()===selector){return elem}}
return null};var escapeCharacters=function(id){var string=String(id);var length=string.length;var index=-1;var codeUnit;var result='';var firstCodeUnit=string.charCodeAt(0);while(++index<length){codeUnit=string.charCodeAt(index);if(codeUnit===0x0000){throw new InvalidCharacterError('Invalid character: the input contains U+0000.')}
if((codeUnit>=0x0001&&codeUnit<=0x001F)||codeUnit==0x007F||(index===0&&codeUnit>=0x0030&&codeUnit<=0x0039)||(index===1&&codeUnit>=0x0030&&codeUnit<=0x0039&&firstCodeUnit===0x002D)){result+='\\'+codeUnit.toString(16)+' ';continue}
if(codeUnit>=0x0080||codeUnit===0x002D||codeUnit===0x005F||codeUnit>=0x0030&&codeUnit<=0x0039||codeUnit>=0x0041&&codeUnit<=0x005A||codeUnit>=0x0061&&codeUnit<=0x007A){result+=string.charAt(index);continue}
result+='\\'+string.charAt(index)}
return result};var easingPattern=function(type,time){var pattern;if(type==='easeInQuad')pattern=time*time;if(type==='easeOutQuad')pattern=time*(2-time);if(type==='easeInOutQuad')pattern=time<0.5?2*time*time:-1+(4-2*time)*time;if(type==='easeInCubic')pattern=time*time*time;if(type==='easeOutCubic')pattern=(--time)*time*time+1;if(type==='easeInOutCubic')pattern=time<0.5?4*time*time*time:(time-1)*(2*time-2)*(2*time-2)+1;if(type==='easeInQuart')pattern=time*time*time*time;if(type==='easeOutQuart')pattern=1-(--time)*time*time*time;if(type==='easeInOutQuart')pattern=time<0.5?8*time*time*time*time:1-8*(--time)*time*time*time;if(type==='easeInQuint')pattern=time*time*time*time*time;if(type==='easeOutQuint')pattern=1+(--time)*time*time*time*time;if(type==='easeInOutQuint')pattern=time<0.5?16*time*time*time*time*time:1+16*(--time)*time*time*time*time;return pattern||time};var getEndLocation=function(anchor,headerHeight,offset){var location=0;if(anchor.offsetParent){do{location+=anchor.offsetTop;anchor=anchor.offsetParent}while(anchor)}
location=location-headerHeight-offset;return location>=0?location:0};var getDocumentHeight=function(){return Math.max(root.document.body.scrollHeight,root.document.documentElement.scrollHeight,root.document.body.offsetHeight,root.document.documentElement.offsetHeight,root.document.body.clientHeight,root.document.documentElement.clientHeight)};var getDataOptions=function(options){return!options||!(typeof JSON==='object'&&typeof JSON.parse==='function')?{}:JSON.parse(options)};var updateUrl=function(anchor,url){if(root.history.pushState&&(url||url==='true')&&root.location.protocol!=='file:'){root.history.pushState(null,null,[root.location.protocol,'//',root.location.host,root.location.pathname,root.location.search,anchor].join(''))}};var getHeaderHeight=function(header){return header===null?0:(getHeight(header)+header.offsetTop)};smoothScroll.animateScroll=function(toggle,anchor,options){var overrides=getDataOptions(toggle?toggle.getAttribute('data-options'):null);var settings=extend(settings||defaults,options||{},overrides);anchor='#'+escapeCharacters(anchor.substr(1));var anchorElem=anchor==='#'?root.document.documentElement:root.document.querySelector(anchor);var startLocation=root.pageYOffset;if(!fixedHeader){fixedHeader=root.document.querySelector(settings.selectorHeader)}
if(!headerHeight){headerHeight=getHeaderHeight(fixedHeader)}
var endLocation=getEndLocation(anchorElem,headerHeight,parseInt(settings.offset,10));var animationInterval;var distance=endLocation-startLocation;var documentHeight=getDocumentHeight();var timeLapsed=0;var percentage,position;updateUrl(anchor,settings.updateURL);var stopAnimateScroll=function(position,endLocation,animationInterval){var currentLocation=root.pageYOffset;if(position==endLocation||currentLocation==endLocation||((root.innerHeight+currentLocation)>=documentHeight)){clearInterval(animationInterval);anchorElem.focus();settings.callback(toggle,anchor)}};var loopAnimateScroll=function(){timeLapsed+=16;percentage=(timeLapsed/parseInt(settings.speed,10));percentage=(percentage>1)?1:percentage;position=startLocation+(distance*easingPattern(settings.easing,percentage));root.scrollTo(0,Math.floor(position));stopAnimateScroll(position,endLocation,animationInterval)};var startAnimateScroll=function(){animationInterval=setInterval(loopAnimateScroll,16)};if(root.pageYOffset===0){root.scrollTo(0,0)}
startAnimateScroll()};var eventHandler=function(event){var toggle=getClosest(event.target,settings.selector);if(toggle&&toggle.tagName.toLowerCase()==='a'){event.preventDefault();smoothScroll.animateScroll(toggle,toggle.hash,settings)}};var eventThrottler=function(event){if(!eventTimeout){eventTimeout=setTimeout(function(){eventTimeout=null;headerHeight=getHeaderHeight(fixedHeader)},66)}};smoothScroll.destroy=function(){if(!settings)return;root.document.removeEventListener('click',eventHandler,!1);root.removeEventListener('resize',eventThrottler,!1);settings=null;eventTimeout=null;fixedHeader=null;headerHeight=null};smoothScroll.init=function(options){if(!supports)return;smoothScroll.destroy();settings=extend(defaults,options||{});fixedHeader=root.document.querySelector(settings.selectorHeader);headerHeight=getHeaderHeight(fixedHeader);root.document.addEventListener('click',eventHandler,!1);if(fixedHeader){root.addEventListener('resize',eventThrottler,!1)}};return smoothScroll})