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 })()