上拉加载 下拉刷新

栏目: JavaScript · 发布时间: 6年前

内容简介:作者:信心https://juejin.im/post/5b9091e7e51d450e704231611.界面上,只分成简单的两块,一块是上方的刷新文字,一块是下方的内容,然后将上方提示内容隐藏在屏幕之外,一般由两种方式,一种是上面遮一层,另一种是marginTop:负值将其弄出屏幕外,这里我采用的是第一种,代码也很简单,就随便贴一下。

作者:信心

https://juejin.im/post/5b9091e7e51d450e70423161

我们依旧从界面及逻辑两块进行分析

1.界面上,只分成简单的两块,一块是上方的刷新文字,一块是下方的内容,然后将上方提示内容隐藏在屏幕之外,一般由两种方式,一种是上面遮一层,另一种是marginTop:负值将其弄出屏幕外,这里我采用的是第一种,代码也很简单,就随便贴一下。

. header {

width 100 % ;

height 1rem ;这里的高度应该与刷新文字一样高

position fixed ;

z - index 100 ;

}

2. 功能实现的重头戏是在逻辑上,主要分成下面几个部分

  • 监听事件

  • 位置计算

  • 控制界面变化

  • 数据更新包

我一个一个进行分析,然后带你们入坑。

监听事件,这块简单,直接贴代码

//el为下拉的整个节点

// 这里为添加监听

this . el . addEventListener ( 'touchstart' ,   this . refreshTouchStart );

this . el . addEventListener ( 'touchmove' ,   this . refreshTouchMove );

this . el . addEventListener ( 'touchend' ,   this . refreshTouchEnd );

//记住在不用的时候要移除监听哦

this . el . removeEventListener ( 'touchstart' ,   this . refreshTouchStart );

this . el . removeEventListener ( 'touchmove' ,   this . refreshTouchMovee );

this . el . removeEventListener ( 'touchend' ,   this . refreshTouchEnd );

//具体的函数,我们直接在位置计算中看

位置计算 我们分下拉刷新,上拉加载两块计算,分析可得

下拉刷新的逻辑 = 当前页面的首项在屏幕中且容器向下滑动的距离大于一定值

上拉加载的逻辑 = 当前页面已滑动到底部

好,我们直接看具体的实现逻辑代码

//代码中包含界面变化和数据更新,仔细看哦

refreshTouchStart ( e )   {

let  touch  =  e . changedTouches [ 0 ];

this . tipText  =  '下拉刷新' ;

//下拉提示文字    

this . startY  =  touch . clientY ; //获得当前按下点的纵坐标

}

refreshTouchMove ( e )   {

this .$ store . commit ( 'bottomShowFalse' ); //与本逻辑无关,滑动时隐藏底部作用   

let  touch  =  e . changedTouches [ 0 ];

let  _move  =  touch . clientY  -  this . startY ; //获得滑动的距离   

this . bottomFlag  =  $( '.present-box' ). offset (). top  +  $( '.present-box' ). height ()  -  document . body . clientHeight <=  40 ; //滑动到底部标识 

if ($( '.present-box' ). offset (). top  >=  this . headerHeight )   {

//内容主体超出了一个头部的距离     

if ( _move  >  0  &&  _move  <  1000 )   {

//滑动距离>0代表下拉//<1000是为了防止神人无限拉阿拉    

this . el . style . marginTop  =  _move  +  'px' ; //根据拉的距离,实现界面上的变化(界面变化)  

this . moveDistance  =  touch . clientY  -  this . startY ; //记录滑动的距离,在松手后让他滑啊滑滑回去 

if ( _move  >  50 )   { //拉到一定程度再下拉刷新,防止误操作      

this . tipText  =  '松开即可刷新' //上面有了     

}

}

}

},

refreshTouchEnd ()   {

this .$ store . commit ( 'bottomShowTrue' ); //松开后底部就biu的出现啦   

if ( this . bottomFlag )   { //若符合上拉加载的条件,则直接进行数据更新   

this .$ emit ( 'loadBottom' );

}

let  that  =  this ;

if ( this . moveDistance  >  50 )   {

//拉了一定距离才触发加载动作  

this . tipText  =  '数据加载中...' ;

let  timer  =  setInterval ( function   ()   {

that . el . style . marginTop  =  that . el . style . marginTop . split ( 'px' )[ 0 ]  -  5  +  'px' ; //如果拉的很长,一次性弹回去影响用户体验,所以先让他弹到50的高度,然后再进行数据更新

if ( Number ( that . el . style . marginTop . split ( 'px' )[ 0 ])  <=  50 )   { //小于50后就不进行界面变化了,先进行数据更新再变化

clearInterval ( timer );

new Promise (( resolve ,   reject )  =>  {

that .$ emit ( 'loadTop' ,   resolve ,   reject ); //通知父控件,下拉刷新条件满足了,你更新吧

}). then (()  =>  {

that . resetBox ();

}). catch (()  =>  {

that . resetBox (); //界面恢复(也就是弹回去啦)

});

}

}, 1 ); //通过一个promise,让数据更新结束后再进行界面变化。也可以采用其他的方式,如async await方式

} else   {

this . resetBox ();

}

}

resetBox ()   {

let  that  =  this ;

//使用定时器的方式,biubiubiu的实现滑动界面刷新的效果。

if ( this . moveDistance  >  0 )   {

let  timer  =  setInterval ( function   ()   {

that . el . style . marginTop  =  that . el . style . marginTop . split ( 'px' )[ 0 ]  -  1  +  'px' ;

if ( Number ( that . el . style . marginTop . split ( 'px' )[ 0 ])  <=  0 )   clearInterval ( timer ); //这里很重要,不删除,可能看到奇奇怪怪的东西哦

}, 1 )

}

this . moveDistance  =  0 ;

}

核心代码就这些了,撒花完结,优化什么的,你们自己看着来咯,大佬别打我,效果图来了嘛

上拉加载 下拉刷新


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

国家窃听

国家窃听

真溱 / 中信出版社 / 2015-8 / 48.00元

《国家窃听》以轻松而略带调侃的“冷幽默”风格,讲述了美国情报监视帝国大量不为人知的故事。本书以严谨而专业的视角,将“斯诺登事件”放在21世纪以来美国“全球反恐战争”以及美国情报界几十年发展的大背景下进行考察,揭示出这一事件的内在逻辑和历史必然。作者前期搜集、筛选、整理的一手素材在故事叙述过程中清晰而多层次地呈现,令本书堪称一部非虚构的美国情报界演义。一起来看看 《国家窃听》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

SHA 加密
SHA 加密

SHA 加密工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试