语言: 英文中文

无限滚动

无限滚动用来在页面滚动到接近底部时加载新内容或进行其他操作。

无限滚动HTML结构

你只需在可滚动的容器上添加“infinite-scroll”类,一般是页面滚动区域 - <div class="page-content">:

<div class="page">
    <div class="page-content infinite-scroll" data-distance="100">
        ... 
    </div>
</div>

其中:

  • div class="page-content infinite-scroll"是我们无限滚动的容器

  • data-distance属性用来配置页面滚动到离底部多远时触发无限滚动事件,默认是50 (px)

    data-distance attribute allows to configure distance from the bottom of page (in px) to trigger infinite scroll event. By default, if note specified, it is 50 (px)

Infinite Scroll On Top

If you need to use infinite scroll on top the page (when it scrolled to top), you need to add additional "infinite-scroll-top" class to "page-content":

<div class="page">
    <div class="page-content infinite-scroll infinite-scroll-top">
        ... 
    </div>
</div>

无限滚动事件

事件(Event) 对象(Target) 描述(Description)
infinite 可无限滚动的容器<div class="page-content infinite-scroll"> 事件会在页面滚动至距底部还有特定距离(可在data-distance中配置)时触发

无限滚动API

有2个App方法:

myApp.attachInfiniteScroll(container) - 为指定的HTML元素容器添加无限滚动事件监听器

  • parameters - 表示无限滚动容器的HTML元素CSS选择器。必选。

myApp.detachInfiniteScroll(container) - 从指定的HTML元素容器删除无限滚动事件监听器

  • parameters - 表示无限滚动容器的HTML元素CSS选择器。必选。

注意,仅在你使用myApp.detachInfiniteScroll方法删除过事件监听器后,才可能需要使用myApp.attachInfiniteScroll方法,因为无限滚动组件的事件监听器会在“pageInit”时被自动添加。

示例

<div class="page-content infinite-scroll">
  <div class="list-block">
    <ul>
      <li class="item-content">
        <div class="item-inner">
          <div class="item-title">Item 1</div>
        </div>
      </li>
      <li class="item-content">
        <div class="item-inner">
          <div class="item-title">Item 2</div>
        </div>
      </li>
      ...
      <li class="item-content">
        <div class="item-inner">
          <div class="item-title">Item 20</div>
        </div>
      </li>
    </ul>
  </div>
  <!-- 加载提示符 -->
  <div class="infinite-scroll-preloader">
    <div class="preloader"></div>
  </div>
</div> 
.infinite-scroll-preloader {
  margin-top:-20px;
  margin-bottom: 10px;
  text-align: center;
}
.infinite-scroll-preloader .preloader {
  width:34px;
  height:34px;
}        
var myApp = new Framework7(); 
 
var $$ = Dom7;
 
// 加载flag
var loading = false;
 
// 上次加载的序号
var lastIndex = $$('.list-block li').length;
 
// 最多可加载的条目
var maxItems = 60;
 
// 每次加载添加多少条目
var itemsPerLoad = 20;
 
// 注册'infinite'事件处理函数
$$('.infinite-scroll').on('infinite', function () {
 
  // 如果正在加载,则退出
  if (loading) return;
 
  // 设置flag
  loading = true;
 
  // 模拟1s的加载过程
  setTimeout(function () {
    // 重置加载flag
    loading = false;
 
    if (lastIndex >= maxItems) {
      // 加载完毕,则注销无限加载事件,以防不必要的加载
      myApp.detachInfiniteScroll($$('.infinite-scroll'));
      // 删除加载提示符
      $$('.infinite-scroll-preloader').remove();
      return;
    }
 
    // 生成新条目的HTML
    var html = '';
    for (var i = lastIndex + 1; i <= lastIndex + itemsPerLoad; i++) {
      html += '<li class="item-content"><div class="item-inner"><div class="item-title">Item ' + i + '</div></div></li>';
    }
 
    // 添加新条目
    $$('.list-block ul').append(html);
 
    // 更新最后加载的序号
    lastIndex = $$('.list-block li').length;
  }, 1000);
});