code: function(e) {
        var self = this;
  
        if (self.isVirtual) {
          var itemHeight = self.itemHeight;
  
          // Grab the total height of the list
          var scrollHeight = e.target.scrollHeight;
  
          // Get the viewport height
          var viewportHeight = self.el.parentNode.offsetHeight;
  
          // High water is the pixel position of the first element to include (everything before
          // that will be removed)
          var highWater = Math.max(0, e.scrollTop + self.virtualRemoveThreshold);
  
          // Low water is the pixel position of the last element to include (everything after
          // that will be removed)
          var lowWater = Math.min(scrollHeight, Math.abs(e.scrollTop) + viewportHeight + self.virtualAddThreshold);
  
          // Get the first and last elements in the list based on how many can fit
          // between the pixel range of lowWater and highWater
          var first = parseInt(Math.abs(highWater / itemHeight), 10);
          var last = parseInt(Math.abs(lowWater / itemHeight), 10);
  
          // Get the items we need to remove
          self._virtualItemsToRemove = Array.prototype.slice.call(self.listEl.children, 0, first);
  
          self.renderViewport && self.renderViewport(highWater, lowWater, first, last);
        }
      }
docs: If we scrolled and have virtual mode enabled, compute the window
  of active elements in order to figure out the viewport to render.