我一直在网上寻找各种“无限滚动”解决方案,这些解决方案让用户滚动浏览您网站上的数据或图像,然后将数据循环回开始或在它们进行时加载位。例如在一个选择框中,如:
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来捕捉我的触摸手势。