/* 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']; return (client < inner) ? inner : client; } function getOffset (el) { var offsetTop = 0, offsetLeft = 0; do { if (!isNaN(el.offsetTop)) { offsetTop += el.offsetTop; } 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(), elH = el.offsetHeight, elTop = getOffset(el).top, elBottom = elTop + elH, h = h || 0; return (elTop + elH * h) <= viewed && (elBottom) >= scrolled; } scrollReveal.prototype = { _init: function () { var self = this; this.elems = Array.prototype.slice.call(docElem.querySelectorAll('[data-scrollReveal]')); this.scrolled = false; // Initialize all scrollreveals, triggering all // reveals on visible elements. this.elems.forEach(function (el, i) { self.animate(el); }); var scrollHandler = function () { if (!self.scrolled) { self.scrolled = true; setTimeout(function () { self._scrollPage(); }, 60); } }; 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; }, }; // end scrollReveal.prototype document.addEventListener("DOMContentLoaded", function (evt) { window.scrollReveal = new scrollReveal(); }); })(window);