bookclub-advr

DSLC Advanced R Book Club
git clone https://git.eamoncaddigan.net/bookclub-advr.git
Log | Files | Refs | README | LICENSE

scroll.js (2047B)


      1 (function() {
      2 
      3   // Polyfill for scrollIntoViewIfNeeded()
      4   // From https://gist.github.com/jocki84/6ffafd003387179a988e
      5   // License: ISC
      6   if (!Element.prototype.scrollIntoViewIfNeeded) {
      7     Element.prototype.scrollIntoViewIfNeeded = function (centerIfNeeded) {
      8       "use strict";
      9 
     10       function makeRange(start, length) {
     11         return {"start": start, "length": length, "end": start + length};
     12       }
     13 
     14       function coverRange(inner, outer) {
     15         if (
     16           false === centerIfNeeded ||
     17           (outer.start < inner.end && inner.start < outer.end)
     18         ) {
     19           return Math.max(
     20               inner.end - outer.length,
     21               Math.min(outer.start, inner.start)
     22           );
     23         }
     24         return (inner.start + inner.end - outer.length) / 2;
     25       }
     26 
     27       function makePoint(x, y) {
     28         return {
     29           "x": x,
     30           "y": y,
     31           "translate": function translate(dX, dY) {
     32             return makePoint(x + dX, y + dY);
     33           }
     34         };
     35       }
     36 
     37       function absolute(elem, pt) {
     38         while (elem) {
     39           pt = pt.translate(elem.offsetLeft, elem.offsetTop);
     40           elem = elem.offsetParent;
     41         }
     42         return pt;
     43       }
     44 
     45       var target = absolute(this, makePoint(0, 0)),
     46           extent = makePoint(this.offsetWidth, this.offsetHeight),
     47           elem = this.parentNode,
     48           origin;
     49 
     50       while (elem instanceof HTMLElement) {
     51         // Apply desired scroll amount.
     52         origin = absolute(elem, makePoint(elem.clientLeft, elem.clientTop));
     53         elem.scrollLeft = coverRange(
     54           makeRange(target.x - origin.x, extent.x),
     55           makeRange(elem.scrollLeft, elem.clientWidth)
     56         );
     57         elem.scrollTop = coverRange(
     58           makeRange(target.y - origin.y, extent.y),
     59           makeRange(elem.scrollTop, elem.clientHeight)
     60         );
     61 
     62         // Determine actual scroll amount by reading back scroll properties.
     63         target = target.translate(-elem.scrollLeft, -elem.scrollTop);
     64         elem = elem.parentNode;
     65       }
     66     };
     67   }
     68 
     69 })()