• 原生js实现上拉加载和下拉刷新功能


    需要了解

    什么时候出现滚动条

    在这里插入图片描述
    当网页的内容高度或者宽度大于网页的高度或者宽度,网页会出现竖直或者水平的滚动条。如上图所示的情况就会出现滚动条。

    所需js相关的api

     const html=document.documentElement
     console.log('元素本身的高度',html.clientHeight)
     console.log('滚动条竖直滚动的距离',html.scrollTop)
     console.log('元素内容的高度',html.scrollHeight)
    
    // 让滚动条滚动到指定坐标
    html.scrollTo(0,html.scrollHeight)
      
     // 滚到到底部时的存在关系
     html.clientHeight+html.scrollTop=html.scrollHeight
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    下拉刷新的触发条件

    1.竖直方向上,滚动条的滚动距离为0。此时处于网页最顶部。
    2.用户需要有下拉动作。也就是手指结束触点的纵坐标需要比开始触点的纵坐标大80左右,横坐标之差的绝对值需要小于20左右。

    用代码表示为:

    html.scrollTop===0 && 
    endPoint.screenY-startPoint.screenY>80 && 
    Math.abs(endPoint.screenX-startPoint.screenX)<20
    
    • 1
    • 2
    • 3

    上拉加载的触发条件

    1.竖直方向上,滚动条的滚动距离为最大值。此时处于网页最底部。
    2.用户需要有上拉动作。也就是手指结束触点的纵坐标需要比开始触点的纵坐标小80左右,横坐标之差的绝对值需要小于20左右。

    用代码表示为:

    html.clientHeight+html.scrollTop===html.scrollHeight && 
    startPoint.screenY-endPoint.screenY>30 && 
    Math.abs(endPoint.screenX-startPoint.screenX)<20
    
    • 1
    • 2
    • 3

    功能实现

    这里用一个简单的案例来实现以上功能,你们可以直接cv,然后在h5端运行,测试以下效果,再看看这个案例的代码。

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
        <style>
        *{
            padding: 0;
            margin: 0;
        }
        html,body,.app{
          width: 100%;
          height: 100%;
        }
        .page{
            width: 100%;
            height: 100%;
        }
       .refreshTxt,.loadingTxt{
           width: 100%;
           height: 36px;
           line-height: 36px;
           text-align: center;
           background-color: gray;
           color: white;
           display: none;
        }
       
        </style>
    </head>
    <body>
    <div class="app">
    <div class="page">
    <div class="container">
        <p class="refreshTxt">刷新中...</p>
        <div class="content">
            <ul class="list1">
                <li>1</li>
                <li>1</li>
                <li>1</li>
                <li>1</li>
                <li>1</li>
                <li>1</li>
                <li>1</li>
                <li>1</li>
                <li>1</li>
                <li>1</li>
                <li>1</li>
                <li>1</li>
                <li>1</li>
                <li>1</li>
                <li>1</li>
                <li>1</li>
                <li>1</li>
                <li>1</li>
                <li>1</li>
                <li>1</li>
                <li>1</li>
               
            </ul>
        </div>
        <p class="loadingTxt">加载中...</p>
    </div>
    </div>
    </div>
    
    <script>
    const html=document.documentElement
    const refreshTxt=document.querySelector('.refreshTxt')
    const loadingTxt=document.querySelector('.loadingTxt')
    const list1=document.querySelector('.list1')
    
    // 记录开始、结束触点和当前页码
    let startPoint,endPoint,page=1
    
    // 触摸开始监听
    window.ontouchstart=(e)=>{
     startPoint=e.changedTouches[0]
    }
    
    // 触摸结束监听
    window.ontouchend=(e)=>{
       endPoint=e.changedTouches[0]
       if(html.scrollTop===0 && 
       endPoint.screenY-startPoint.screenY>80 && 
       Math.abs(endPoint.screenX-startPoint.screenX)<20)
       {
         // 下拉触发
         refreshTxt.style.display='block'
         setTimeout(()=>{ 
            refreshTxt.style.display='none'
            location.reload()
        },2000)
       }
     
       // 如果要完全到底部的话不太好触发,时常不灵,所以将距离设置为小于10时触发
    //    if(html.clientHeight+html.scrollTop===html.scrollHeight && startPoint.screenY-endPoint.screenY>30 && Math.abs(endPoint.screenX-startPoint.screenX)<20)
       if(html.scrollHeight-(html.clientHeight+html.scrollTop)<10 && 
       startPoint.screenY-endPoint.screenY>30 && 
       Math.abs(endPoint.screenX-startPoint.screenX)<20)
       {
         // 上拉触发
         setTimeout(()=>{ 
         loadingTxt.style.display='none'
         page++
         
         const newList=[]
         for(let i=0;i<10;i++){
            const li=document.createElement('li')
            li.innerText=page
            newList.push(li)
         }
         list1.append(...newList)
        },2000)
         loadingTxt.style.display='block'
         html.scrollTo(0,html.scrollHeight)
       }
    }   
    
    </script>
    </body>
    </html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
  • 相关阅读:
    艾美捷胆固醇肉豆蔻酸酯说明书和相关研究
    k8s快速入门教程-----3 kubernetes架构
    【毕业设计】基于单片机的智能鱼缸系统设计与实现 - 嵌入式 物联网 stm32 c51
    Git rebase 用法说明
    SpringBoot粗浅分析
    九度OJ 1433 FatMouse -- 贪心算法
    在linux系统中安装nginx
    【答读者问54】谈一谈backtrader在多品种跨周期调用数据的时候面临的坑以及是否选择使用resample的问题
    C#之性能优化
    pushgateway的安装与使用
  • 原文地址:https://blog.csdn.net/qq_61233877/article/details/125564927