微信小程序无限滚动列表

先放效果图

效果图

代码截图

wxml
js
js

代码解释

主体html其实东西很少,主要分为两部分:一个主体的view和一个长内容的scroll-view

当前项的内容都放置在scroll-view内,只有在scroll-view滚动到底部时,才会触发外层的上拉滚动;

监听touch starttouch end也只是为了区别用户是否上拉足够的距离,如果距离不够的话同样也不会触发滚动;

scroll-viewscroll-into-view的作用是,当用户上拉切换项的时候,把当前的视角定位在scroll-view的顶部;单纯的用户体验方面的设计;

我是通过wx.pageScrollTo()这个方法来进行页面滚动的,如果你有其他的好方法也欢迎交流;

实际上我这里是两次滚动,第一次滚动一屏的距离,完成后再滚动回一屏的距离;

此时页面的滚动条其实还在顶部,滚动距离为0;因为第二次滚动没有动画,给用户一种向下滚动了一屏的感觉;

原理解析

我们的数据始终是一个长度为2的数组scroll_list

这里的viewscroll-view我们叫做外、内两部分;

外的主要作用是监听用户上拉距离,内用来控制当前可滚动的是内还是外;

当内滚动到底时,lower === true,用户再次上拉时,开始计算用户上拉距离;

scrollToLower() {  
  this.lower = true;
},
touchstart(e) {  
  if (!this.lower) {    
    this.start = undefined;   
    return;  
  }  
  this.start = e.touches[0].clientY; // 用户点击位置的y坐标
}

如果上拉距离大于200,调用wx.pageScrollTo(),滚动一屏;如果距离大于0但小于200,把用户上拉的距离滚动回去;如果小于0,则用户滚动为内,将监听用户的上拉取消;

touchend(e) {    
  if (!this.start) return;    
  const move = this.start - e.changedTouches[0].clientY; // 计算上拉距离    
  const { view } = this; // 屏幕高度    
  const _this = this;    
  if (move > 200) {      
    wx.pageScrollTo({        
      scrollTop: view,        
      selector: '.main',        
      complete() {          
        wx.pageScrollTo({            
          scrollTop: 0,            
          selector: '.main',            
          duration: 0,            
          complete() {              
            const { scroll_list } = _this.data; // 初始为scroll_list: [1, 2]              
            scroll_list.shift();              
            scroll_list.push(_this.index); // 第一次滚动后scroll_list: [2, 3]              
            _this.setData({                
              item_id: 'img', // 将内的滚动位置设置为内的顶部                
              scroll_list              
            })              
            ++_this.index;              
            _this.lower = false; // 初始化滚动监听枷锁              
            _this.start = undefined; // 初始化点击起点位置            
          }          
        })        
      }     
    })    
  } else if (0 < move <= 200) {      
    wx.pageScrollTo({        
      scrollTop: 0,        
      selector: '.main',        
      complete() {          
        _this.start = undefined;        
      }      
    })    
  } else {      
    this.lower = false;    
  }  
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容