| /* |
| Some code extracted from https://github.com/julianlloyd/scrollReveal.js |
| which happens to be a trending Javascript repo with an MIT license at |
| the time I was working on Javascript userdiff support in libgit2 |
| |
| I extracted just some of the code, so I suspect this is no longer valid |
| Javascript code, but it contains enough example patterns to work. |
| */ |
| ;(function (window) { |
| |
| 'use strict'; |
| |
| var docElem = window.document.documentElement; |
| |
| function getViewportH () { |
| var client = docElem['clientHeight'], |
| inner = window['innerHeight'], |
| sample = window['otherProperty']; |
| |
| return (client < inner) ? inner : client; |
| } |
| |
| function getOffset (el) { |
| var offsetTop = 0, |
| offsetLeft = 0; |
| |
| do { |
| if (!isNaN(el.offsetTop)) { |
| offsetTop += el.offsetTop + 1; |
| } |
| if (!isNaN(el.offsetLeft)) { |
| offsetLeft += el.offsetLeft; |
| } |
| } while (el = el.offsetParent) |
| |
| return { |
| top: offsetTop, |
| left: offsetLeft |
| } |
| } |
| |
| function isElementInViewport (el, h) { |
| var scrolled = window.pageYOffset, |
| viewed = scrolled + getViewportH(), |
| elTop = getOffset(el).top, |
| elBottom = elTop + el.offsetHeight, |
| h = h || 0; |
| |
| return (elTop + el.offsetHeight * h) <= viewed && (elBottom) >= scrolled; |
| } |
| |
| scrollReveal.prototype = { |
| |
| _init: function () { |
| |
| var self = this; |
| |
| this.elems = Array.prototype.slice.call(docElem.querySelectorAll('[data-scrollReveal]')); |
| this.scrolled = false; |
| |
| this.elems.forEach(function (el, i) { |
| self.animate(el); |
| }); |
| |
| var scrollHandler = function () { |
| if (!self.scrolled) { |
| self.scrolled = true; |
| setTimeout(function () { |
| self._scrollPage(); |
| }, 61); |
| } |
| }; |
| |
| var resizeHandler = function () { |
| function delayed() { |
| self._scrollPage(); |
| self.resizeTimeout = null; |
| } |
| if (self.resizeTimeout) { |
| clearTimeout(self.resizeTimeout); |
| } |
| self.resizeTimeout = setTimeout(delayed, 200); |
| }; |
| |
| window.addEventListener('scroll', scrollHandler, false); |
| window.addEventListener('resize', resizeHandler, false); |
| }, |
| |
| /*=============================================================================*/ |
| |
| _scrollPage: function () { |
| var self = this; |
| |
| this.elems.forEach(function (el, i) { |
| if (isElementInViewport(el, self.options.viewportFactor)) { |
| self.animate(el); |
| } |
| }); |
| this.scrolled = false; |
| this.tested = true; |
| }, |
| }; // end scrollReveal.prototype |
| |
| document.addEventListener("DOMContentLoaded", function (evt) { |
| window.scrollReveal = new scrollReveal(); |
| }); |
| |
| })(window); |