code: function makeScrollEvents($el) {
    if ($el._data._scrollEvents) return;
    $el._data._scrollEvents = true;
  
    let ticking = false;
    let top = null;
  
    function tick() {
      let newTop = $el.scrollTop;
      if (newTop == top) { ticking = false; return; }
  
      top = newTop;
      $el.trigger('scroll', { top });
      // TODO Scroll should trigger mousemove events.
      window.requestAnimationFrame(tick);
    }
  
    function scroll() {
      if (!ticking) window.requestAnimationFrame(tick);
      ticking = true;
    }
  
    // Mouse Events
    let target = $el instanceof Elements.WindowElement ? window : $el._el;
    target.addEventListener('scroll', scroll);
  
    // Touch Events
    function touchStart() {
      window.addEventListener('touchmove', scroll);
      window.addEventListener('touchend', touchEnd);
    }
    function touchEnd() {
      window.removeEventListener('touchmove', scroll);
      window.removeEventListener('touchend', touchEnd);
    }
  
    $el._el.addEventListener('touchstart', function(e) {
      if (!e.handled) touchStart();
    });
  }
docs: ----------------------------------------------------------------------------- Scroll Events