From cda49e03018d3dbbe8b9dc3927719471150c1608 Mon Sep 17 00:00:00 2001 From: Jeffrey Tse Date: Tue, 24 Sep 2019 14:10:57 +0800 Subject: update: perfect animation, compatibility issue --- assets/js/main.js | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 assets/js/main.js (limited to 'assets/js/main.js') diff --git a/assets/js/main.js b/assets/js/main.js new file mode 100644 index 0000000..231191b --- /dev/null +++ b/assets/js/main.js @@ -0,0 +1,57 @@ +// Fix DOM matches function +if (!Element.prototype.matches) { + Element.prototype.matches = + Element.prototype.matchesSelector || + Element.prototype.mozMatchesSelector || + Element.prototype.msMatchesSelector || + Element.prototype.oMatchesSelector || + Element.prototype.webkitMatchesSelector || + function(s) { + var matches = (this.document || this.ownerDocument).querySelectorAll(s), + i = matches.length; + while (--i >= 0 && matches.item(i) !== this) {} + return i > -1; + }; +} + +// Get Scroll position +function getScrollPos() { + var supportPageOffset = window.pageXOffset !== undefined; + var isCSS1Compat = ((document.compatMode || "") === "CSS1Compat"); + + var x = supportPageOffset ? window.pageXOffset : isCSS1Compat ? document.documentElement.scrollLeft : document.body.scrollLeft; + var y = supportPageOffset ? window.pageYOffset : isCSS1Compat ? document.documentElement.scrollTop : document.body.scrollTop; + + return { x: x, y: y }; +} + +var _scrollTimer = []; + +// Smooth scroll +function smoothScrollTo(y, time) { + time = time == undefined ? 500 : time; + + var scrollPos = getScrollPos(); + var count = 60; + var length = (y - scrollPos.y); + + function easeInOut(k) { + return .5 * (Math.sin((k - .5) * Math.PI) + 1); + } + + for (var i = _scrollTimer.length - 1; i >= 0; i--) { + clearTimeout(_scrollTimer[i]); + } + + for (var i = 0; i <= count; i++) { + (function() { + var cur = i; + _scrollTimer[cur] = setTimeout(function() { + window.scrollTo( + scrollPos.x, + scrollPos.y + length * easeInOut(cur/count) + ); + }, (time / count) * cur); + })(); + } +} -- cgit v1.2.3