JS: ScrollMonitor
Seeable: https://github.com/Diokuz/seeable https://github.com/moagrius/isOnScreen
by Ico Dimchev
HTML
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
CSS
body {
width: 50%;
margin: 0 auto;
}
.item {
width: 100%;
height: 100px;
background-color: deeppink;
border-top: 1px solid darkorchid;
transform: scale(0);
transition: all 400ms;
}
.in-view { background-color: indigo; transform: scale(1); }
JavaScript
// http://www.appelsiini.net/projects/viewport
// http://remysharp.com/2009/01/26/element-in-view-event-plugin/
// https://github.com/cobbweb/jquery.scrollwatch
var WINDOW_WIDTH = window.innerWidth || document.documentElement.clientWidth;
var WINDOW_HEIGHT = window.innerHeight || document.documentElement.clientHeight;
var ScrollMonitor = function (options) {
this.items = [];
this.options = {};
for (var key in options) {
this.options[key] = options[key];
}
};
ScrollMonitor.prototype.add = function (node, options) {
var gap = options.gap || 0;
this.items.push({
node: node,
gap: +gap === gap ? [gap, gap, gap, gap] : gap,
callbacks: {
step: options.step || function (node, distance) {},
enter: options.enter || function (node, distance) {},
leave: options.leave || function (node, distance) {}
}
});
this.resize();
};
ScrollMonitor.prototype.resize = function () {
WINDOW_WIDTH = window.innerWidth || document.documentElement.clientWidth;
WINDOW_HEIGHT = window.innerHeight || document.documentElement.clientHeight;
for (var i = 0; i < this.items.length; i++) {
var node = this.items[i].node;
this.items[i].rect = {
top: node.offsetTop,
left: node.offsetLeft,
width: node.clientWidth,
height: node.clientHeight
};
}
};
ScrollMonitor.prototype.scroll = function (scrollX, scrollY) {
for (var i = 0; i < this.items.length; i++) {
var item = this.items[i];
var rect = item.rect;
var gap = item.gap;
var distance = {
top: (rect.top + rect.height) - scrollY,
left: (rect.left + rect.width) - scrollX,
right: rect.left - (WINDOW_WIDTH + scrollX),
bottom: rect.top - (WINDOW_HEIGHT + scrollY),
};
var inView = (distance.right < -gap[1] && distance.left > gap[3] && distance.bottom < -gap[2]...