移动端下拉刷新头实现原理及代码实现

更新日期: 2019-03-09 阅读: 2.9k 标签: 刷新

下拉刷新实现原理

实现下拉刷新主要分为三步:
  1. 监听原生touchstart事件,记录其初始位置的值,e.touches[0].pageY;
  2. 监听原生touchmove事件,记录并计算当前滑动的位置值与初始位置值的差值,大于某个临界值时,显示下拉刷新头,并将页面的overflow属性,设置为false;
  3. 监听原生touchend事件,若此时元素滑动已经最大值,则进行刷新操作,操作结束后,将页面的overflow属性,设置为auto。


代码实现

html代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>下拉刷新</title>
    <style type="text/css">
        html,body, header,p,main,span,ul,li {
            margin: 0;
            padding: 0;
        }
        #refreshContainer li {
            background-color: rgba(5, 143, 62, 0.603);
            margin-bottom: 1px;
            padding: 30px 10px;
        }
        .refreshText {
            position: absolute;
            width: 100%;
            line-height: 80px;
            text-align: center;
            left: 0;
            top: 0;
            transform: translateY(-80px);
        }
    </style>
</head>
<body>
    <div class="parent">
        <p class="refreshText"></p>
        <ul id="refreshContainer">
            <li>000</li>
            <li>111</li>
            <li>222</li>
            <li>333</li>
            <li>444</li>
            <li>555</li>
            <li>666</li>
            <li>777</li>
            <li>888</li>
            <li>999</li>
        </ul>
    </div>
</body>  
</html> 
JS代码实现
<script type="text/javascript">
    window.onload = function () {
        let container = document.querySelector('#refreshContainer');
        let refreshText = document.querySelector('.refreshText');
        let parent = document.querySelector('.parent');
        let startY = 0; //手指触摸最开始的Y坐标
        let endY = 0;   //手指结束触摸时的Y坐标
        let flag = false; //下拉刷新是否达到了临界值
        parent.addEventListener('touchstart', function (e) {
            startY = e.touches[0].pageY;
        });
        parent.addEventListener('touchmove', function (e) {
            if (isTop() && (e.touches[0].pageY - startY) > 50) {
                flag = true;
                document.body.style.overflow='hidden';
                refreshText.style.height = "80px";
                parent.style.transform = "translateY(80px)";
                parent.style.transition = "all ease 0.5s";
                refreshText.innerHTML = "释放立即刷新...";
            }
        });
        //松开手指
        parent.addEventListener('touchend', function (e) {
            if (isTop() && flag) {
                refreshText.innerHTML = "正在刷新...";
                //进行更新操作,更新结束后,结束下拉刷新
                setTimeout(function () {
                    parent.style.transform = "translateY(0)";
                    document.body.style.overflow = 'auto';
                }, 2000);
            }
        });
        //scrollTop没有滚过
        function isTop() {
            let t = document.documentElement.scrollTop || document.body.scrollTop;
            return t === 0 ? true : false;
        }
    }
</script>

注意 body 的 overflow 属性设置。

来自:https://segmentfault.com/a/1190000018439243


本文内容仅供个人学习、研究或参考使用,不构成任何形式的决策建议、专业指导或法律依据。未经授权,禁止任何单位或个人以商业售卖、虚假宣传、侵权传播等非学习研究目的使用本文内容。如需分享或转载,请保留原文来源信息,不得篡改、删减内容或侵犯相关权益。感谢您的理解与支持!

链接: https://fly63.com/article/detial/2278

相关推荐

js实现返回上一页(页面刷新与不刷新)

history.go(-1), 返回两个页面: history.go(-2);window.history.forward() 返回下一页;window.history.go(返回第几页,也可以使用访问过的URL) ;如果要强行刷新的话就是:window.history.back();

vue强制刷新子组件

把一个组件重置到初始状态是一个常见的需求,推荐的做法有两种:一种是父组件重置子组件的 prop,另一种是子组件暴露一个重置的方法供父组件调用。

Vue刷新当前页面的3种实现

缺点:同 this.$router.go(0) 一样,会白屏。通过 $nextTick(),协助实现。先把 <router-view /> 移除,移除后再重新添加,达到刷新当前页面的功能。是目前最合适的实现方式。

解决使用vuex刷新页面state数据消失

在实际的vue项目中,当我们的应用遇到多个组件之间的共享问题时,通常会用到Vuex(一个状态管理的插件,可以解决不同组件之间的数据共享和数据持久化),解决组件之间同一状态的共享问题。

vue页面如何返回不刷新_ vue页面撤退不能返回到顶部的实现

vue页面跳转到新页面之后,再由新页面返回到原页面时候若想返回调出原页面的初始位置,怎么来解决这个问题呢?1、使用vuex存储滚动状态,2、使用缓存keepAlive的实现

vue实现局部刷新

使用2.2.0 新增的provide / inject控制<router-view>的显示隐藏,在App.vue中使用provide,在使用局部刷新的组件中使用inject

$this.router.push到当前页面,只是传入参数不同,页面不刷新的问题解决

在vue中使用$this.router.push()方法,如果只是传入的参数不同,会出现url地址变化了,但是页面没有重新请求数据,需要刷新一下页面才有新的数据

浏览器刷新事件的监听和使用

浏览器F5刷新的时候有一个刷新执行之前的事件,beforeunload 事件,这个事件可以提示用户在刷新页面之前有一个提示。下面是beforeunload的用法:

js刷新当前页面的5种方式

当调用 location.reload() 方法时, aspx页面此时在服务端内存里已经存在, 因此必定是 IsPostback 的。如果有这种应用: 需要重新加载该页面,也就是说期望页面能够在服务端重新被创建,期望是 Not IsPostback 的

Vue 实现前进刷新,后退不刷新的效果

在一个列表页中,第一次进入的时候,请求获取数据。点击某个列表项,跳到详情页,再从详情页后退回到列表页时,不刷新。

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!