<!DOCTYPE html>
<html ng-app="app">

<head>
   <script data-require="angularjs@1.5.3" data-semver="1.5.3" src="http://ajax.googleapis.com/ajax/libs/angularjs/1.5.3/angular.min.js"></script>
   <script src="https://rawgit.com/klumba12/vscroll/master/vscroll.js"></script>
   <link rel="stylesheet" href="style.css" />
</head>

<body ng-controller="vscrollList">

   <div vscroll style="height:300px; width: 100%; overflow-y: auto;">
      <ul vscroll-port-y="vscrollContext" style="list-style: none;margin:0;padding:0;">
         <li vscroll-row="{{::$index}}" ng-repeat="item in data | vscroll: vscrollContext track by $index" style="color: #{{item.color}}; width: 100%; height: {{item.height}}px; background-color: #{{item.code}}">
            {{item.height}}px: #{{item.code}}
         </li>
      </ul>
   </div>

   <script language="javascript">
      var app = angular.module('app', ['vscroll']);
      app.controller('vscrollList', ['$scope', 'vscroll', function($scope, vscroll) {
         $scope.data = [];

         var isLight = function(hexcolor) {
            var r = (hexcolor >> 16) & 0xFF,
               g = (hexcolor >> 8) & 0xFF,
               b = hexcolor & 0xFF;

            var a = 1 - (0.299 * r + 0.587 * g + 0.114 * b) / 255;
            return (a < 0.5);
         };

         for (var i = 0; i < 200; i++) {
            var code = Math.floor(Math.random() * 16777215);
            $scope.data[i] = {
               height: 20 + Math.round(Math.random() * 100),
               code: code.toString(16),
               color: isLight(code) ? '000' : 'fff'
            };
         }

         $scope.vscrollContext = vscroll({
            threshold: 30
         });

      }]);
   </script>
</body>

</html>