/** * @fileoverview syncscroll - scroll several areas simultaniously * @version 0.0.2 * * @license MIT, see http://github.com/asvd/intence * @copyright 2015 asvd */ (function (root, factory) { if (typeof define === 'function' && define.amd) { define(['exports'], factory); } else if (typeof exports !== 'undefined') { factory(exports); } else { factory((root.syncscroll = {})); } }(this, function (exports) { var Width = 'Width'; var Height = 'Height'; var Top = 'Top'; var Left = 'Left'; var scroll = 'scroll'; var client = 'client'; var names = []; var reset = function() { var elems = document.getElementsByClassName('syncscroll'); var i, j, el, found, name; for (name in names) { if (Object.prototype.hasOwnProperty.call(names, name)) { for (i = 0; i < names[name].length; i++) { names[name][i].removeEventListener( 'scroll', names[name][i].syn, 0 ); } } } for (i = 0; i < elems.length; i++) { found = 0; el = elems[i]; if (!(name = el.getAttribute('name'))) { continue; } el = el.scroller||el; if (!names[name]) { names[name] = []; } for (j = 0; j < names[name].length; j++) { if (names[name][j] == el) { found = 1; } } if (!found) { names[name].push(el); } el.eX = el.eY = 0; (function(el, name) { el.addEventListener( 'scroll', el.syn = function() { var elems = names[name]; var scrollX = el[scroll+Left]; var scrollY = el[scroll+Top]; var xRate = scrollX / (el[scroll+Width] - el[client+Width]); var yRate = scrollY / (el[scroll+Height] - el[client+Height]); var updateX = 0; var updateY = 0; var otherEl, i; if (scrollX != el.eX) { updateX = 1; el.eX = scrollX; } if (scrollY != el.eY) { updateY = 1; el.eY = scrollY; } for (i = 0; i < elems.length; i++) { otherEl = elems[i]; if (otherEl != el) { if (updateX) { scrollX = Math.round( xRate * (otherEl[scroll+Width] - otherEl[client+Width]) ); otherEl.eX = otherEl[scroll+Left] = scrollX; } if (updateY) { scrollY =Math.round( yRate * (otherEl[scroll+Height] - otherEl[client+Height]) ); otherEl.eY = otherEl[scroll+Top] = scrollY; } } } }, 0 ); })(el, name); } } if (document.readyState == "complete") { reset(); } else { window.addEventListener("load", reset, 0); } exports.reset = reset; }));