3

ユーザーがサイトのデータや画像をスクロールして、データを最初にループバックするか、進行中にビットをロードできるようにするさまざまな「無限スクロール」ソリューションをネットで調べてきました。たとえば、次のような選択ボックスで:

http://ivaynberg.github.com/select2/

私がやろうとしているのは似たようなことですが、配列内に200以上のレコードの完全なデータセットがすでにあり、それぞれをリストアイテムにレンダリングしています。一度に画面に収まるリスト項目は 5 つだけなので、そのセットの最後に到達するたびに、次のセットがスクロールされるのを待っています (タッチ/マウス イベントを使用)。

各データセットに移動するときに要素を追加/先頭に追加しようとしましたが、これはモバイル デバイスでは非常に遅くなります。私が次に試したことは次のようなものです:

1) 多数のプレースホルダーを作成します。

2) プレースホルダーが視覚的な境界の外にスクロールされたら、それらを元の位置に (新しいデータで) 押し戻し、シームレスなスクロールの錯覚を作成します。

3) ボックスの位置から、データを取得するページ インデックスを見つけます。すべてのプレースホルダーに新しいデータを再入力します。

タッチ/マウス移動イベント ハンドラー内:

ondrag: function(e) {
  var top, row, rows, delta = 1, prefix;

  if(e.direction === 'up') {
    e.distance = e.distance * -1;
  }

  rows = Math.floor(this._grid.scrollHeight / this._grid.ticketHeight); 

  // Use a simpler row-snap rule.
  top = (this._previous.top + e.distance) * delta;  // Top offset.
  row = Math.floor(top / this.rowHeight);  // Row position.

  // Makes the scroll infinite by seamlessly bouncing back.
  if(Math.abs(row) > rows) {                
     top = (e.distance * delta);        
  }

  elems = this.$el.find('.ticketRow');
  for(i = 0; i < elems.length; i++) {
    elems[i].style.webkitTransform = 'translate(0px,' + ((i * this.rowHeight) + top) + 'px)';       
  }

  if(this._offset !== Math.abs(row)) {
    this._offset = Math.abs(row);

    if(e.direction == 'down') {
      this._track--;
    } else {
      this._track++;
    }
    // Get new data from data source and apply it to the place holders.
    this.update(this._track);
  }
},

ただし、これは厄介なバウンス/ジッター効果を生み出します。また、各行の新しい位置を移動距離の倍数に設定しようとしましたが、それでもかなり不安定な結果が得られます。

私の質問は、これに正しく取り組んでいますか? すでに私のためにこれを行うものはありますか? さらに良いことに、上記の私の数学の欠陥はどこにありますか?

どんな助けでも大歓迎です!

注: 私は、hammer.jsを使用してタッチ ジェスチャをキャプチャしています。

4

1 に答える 1

0

display: none最初の5つを表示する初期化時にすべての項目を設定してからblock、scrollPositionを使用して表示を設定してみましたか?

于 2013-03-21T21:32:05.790 に答える