【Demo】教你实现下拉刷新

前言

第三方库很常见,我们开发需求的时候经常会用到下拉刷新组件,如果要我们自己实现下拉刷新该如何实现尼?

效果

实现原理

1、监听 touchstart事件记录初始startY
2、监听 touchmove事件 e.touches[0].pageY - startY得到 deltaY, 再通过transform: translateY(deltaY) 来拖动内容
3、监听 touchend 事件 触发回调

代码

1、html

<div class="pull-refresh">
  <div id="pull-refresh-container">
    
    <div class="pull-refresh-head">
      <p class="pull-refresh-text"></p>
    </div>
    
    <div class="pull-refresh-content">
      <ul>
        <li>1</li>   
        <li>2</li> 
        <li>3</li> 
        <li>4</li> 
        <li>5</li> 
        <li>6</li> 
      </ul>
    </div>
  </div>
</div>

2、css

html, body {
  width: 100%;
  height: 100vh;
  padding: 0;
  margin: 0;
  background-color: white;
}

ul {
    display: block;
    list-style-type: disc;
    margin-block-start: 0;
    margin-block-end: 0;
    margin-inline-start: 0px;
    margin-inline-end: 0px;
    padding-inline-start: 0px;
}

.pull-refresh {
  width: 100%;
  height: 100%;
}

#pull-refresh-container {
  position: relative;
  width: 100%;
  height: 100%;
  background-color: #F5F5F5;
}

.pull-refresh-head {
  position: absolute;
  left: 0;
  width: 100%;
  transform: translateY(-100%);
}

.pull-refresh-text {
  text-align: center;
}

.pull-refresh-content {
  text-align: left;
  padding: 24px;
}

3、js

(function(){
  
  var refreshContainer = document.getElementById("pull-refresh-container"),
      refreshTxt = document.querySelector('.pull-refresh-text'),
      startY = 0, 
      deltaY = 0;
  
  refreshContainer.addEventListener('touchstart',function(e){
    startY = e.touches[0].pageY;
    refreshContainer.style.transition = 'transform 0s';
  }, false);
  
  
  refreshContainer.addEventListener('touchmove',function(e){
    e.preventDefault();
    deltaY = e.touches[0].pageY - startY;
    
    if(deltaY > 0) {
      refreshTxt.innerText = '下拉刷新';
      refreshContainer.style.transform = 'translateY('+ deltaY + 'px)';
      
      if(deltaY > 60) {
        refreshTxt.innerText = '释放刷新';
      }
    }
  }, false);
  
  
  refreshContainer.addEventListener('touchend',function(e){
    refreshContainer.style.transition = 'transform 0.5s ease 0s';
    if(deltaY > 60) {
      refreshContainer.style.transform = 'translateY(60px)';
      refreshTxt.innerText = '加载中...';

      setTimeout(function(){
        refreshContainer.style.transform = 'translateY(0px)';
        refreshTxt.innerText = '刷新成功';
      }, 2000)
    } else {
      refreshContainer.style.transform = 'translateY(0px)';
    }
    startY = 0;
    deltaY = 0;
  }, false);
  
})()

在线预览

点我预览

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GuoguoDad~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值