"use strict"; class Scroll{ constructor(){ this._lastPos = 0 this._flags = [] this._dead = false this.start() } scrollTop(){ return (this._target)?Math.max(this._target.scrollTop, this._target.scrollTop):Math.max(window.pageYOffset, document.documentElement.scrollTop, document.body.scrollTop) } addFlag(target, args = {}){ let flag = new Scroll.Flag(target, args, this) this.flags.push(flag) return flag } checkFlags(){ for(let i=0; i{self.step()}) } } start(){ var self = this window.requestAnimationFrame(()=>{self.step()}) } get lastPos(){ return this._lastPos } set lastPos(v){ this._lastPos = v } get flags(){ return this._flags } set flags(v){ this._flags = v } get dead(){ return this._dead } set dead(v){ this._dead = v } } Scroll.Flag = class{ constructor(target, args = {}, parent){ this._parent = parent this._target = target args.start = args.start || 0 args.duration = args.duration || 0 args.callback = args.callback || function(value, target){} args.debug = args.debug || false this._args = args; this._range = new Array(2) this.range[0] = args.start this.range[1] = this.range[0] + args.duration this._value = 0 this._callback = args.callback if(!args.startDirty){ this._dirty = false }else{ this._dirty = true this.update() } if(args.debug){ var hotspot = document.createElement('div') hotspot.style.display = 'block' hotspot.style.position = 'absolute' hotspot.style.right = 0 hotspot.style.width = '200px' hotspot.style.zIndex = '10000000' var r = Math.round((Math.random()*255)), g = Math.round((Math.random()*255)), b = Math.round((Math.random()*255)) hotspot.style.background = 'rgba('+r+','+g+','+b+',0.2)' hotspot.style.top = this.range[0]+'px' hotspot.style.height = (this.range[1] - this.range[0])+'px' hotspot.innerHTML = "Flag "+(this.parent.flags.length+1)+" Zone" document.body.appendChild(hotspot) } } inRange(){ var x = this.parent.scrollTop() return this.range[0]