基于HTML5的下拉刷新效果

农民  论坛元老 | 2024-9-17 17:17:12 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1022|帖子 1022|积分 3066

效果示例图


示例代码

  1. <!DOCTYPE html>
  2. <html>
  3.         <head>
  4.                 <meta charset="utf-8">
  5.                 <meta http-equiv="X-UA-Compatible" content="IE=edge" />
  6.                 <meta name="viewport" content="width=device-width,initial-scale=1.0" />
  7.                 <title></title>
  8.                 <style type="text/css">
  9.                         * {
  10.                                 padding: 0;
  11.                                 margin: 0;
  12.                                 box-sizing: border-box;
  13.                         }
  14.                         .main {
  15.                                 width: 100%;
  16.                                 height: 100vh;
  17.                                 background-color: #f5f5f5;
  18.                                 position: relative;
  19.                         }
  20.                         .dot-wrap {
  21.                                 width: 100%;
  22.                                 height: 30px;
  23.                                 position: absolute;
  24.                                 background-color: #fff;
  25.                                 top: -30px;
  26.                         }
  27.                         .dot {
  28.                                 position: absolute;
  29.                                 width: 10px;
  30.                                 height: 10px;
  31.                                 border-radius: 10px;
  32.                                 background-color: rgb(0, 0, 0, 0.3);
  33.                                 top: 0;
  34.                                 left: 50%;
  35.                                 margin-left: -5px;
  36.                         }
  37.                         .dot:last-child {
  38.                                 display: none;
  39.                         }
  40.                         .dot.loading {
  41.                                 display: unset;
  42.                                 animation: dot-move 1.5s infinite;
  43.                         }
  44.                         @keyframes dot-move {
  45.                                 0% {
  46.                                         transform: translateX(-20px);
  47.                                 }
  48.                                 33.33% {
  49.                                         transform: translateX(-20px);
  50.                                 }
  51.                                 33.34% {
  52.                                         transform: translateX(0px);
  53.                                 }
  54.                                 66.66% {
  55.                                         transform: translateX(0px);
  56.                                 }
  57.                                 66.67% {
  58.                                         transform: translateX(20px);
  59.                                 }
  60.                                 100% {
  61.                                         transform: translateX(20px);
  62.                                 }
  63.                         }
  64.                         .block-item {
  65.                                 width: 100%;
  66.                                 height: 200px;
  67.                                 background-color: red;
  68.                                 margin-bottom: 12px;
  69.                         }
  70.                 </style>
  71.         </head>
  72.         <body>
  73.                 <div class="main">
  74.                         <div class="dot-wrap">
  75.                                 <div class="dot"></div>
  76.                                 <div class="dot"></div>
  77.                                 <div class="dot"></div>
  78.                                 <div class="dot"></div>
  79.                         </div>
  80.                         <div class="block-item"></div>
  81.                         <div class="block-item"></div>
  82.                         <div class="block-item"></div>
  83.                         <div class="block-item"></div>
  84.                         <div class="block-item"></div>
  85.                         <div class="block-item"></div>
  86.                         <div class="block-item"></div>
  87.                         <div class="block-item"></div>
  88.                         <div class="block-item"></div>
  89.                         <div class="block-item"></div>
  90.                         <div class="block-item"></div>
  91.                         <div class="block-item"></div>
  92.                 </div>
  93.         </body>
  94.         <script type="text/javascript">
  95.                 let timerHandle = null;
  96.                 const mainDom = document.querySelector(".main");
  97.                 const dots = document.querySelectorAll(".dot");
  98.                 const rootDocument = document.documentElement;
  99.                 //当滚动条在最顶部时可以下拉刷新
  100.                 if (rootDocument.scrollTop === 0) {
  101.                         addTouchEvent();
  102.                 }
  103.                 //滚动监听
  104.                 window.onscroll = function() {
  105.                         //当滚动条到达顶部时,可以触发下拉拖动事件
  106.                         if (rootDocument.scrollTop <= 0) {
  107.                                 rootDocument.scrollTop = 0;
  108.                                 addTouchEvent();
  109.                         } else {
  110.                                 removeTouchEvent();
  111.                         }
  112.                 }
  113.                 let distance, ox, oy, x, y = 0;
  114.                 function startEvent(e) {
  115.                         console.log("[start]", e)
  116.                         //获取手指起始值
  117.                         ox = e.touches[0].clientX;
  118.                         oy = e.touches[0].clientY;
  119.                 }
  120.                 function moveEvent(e) {
  121.                         if (!e.cancelable) {
  122.                                 return; // 如果事件不可取消,直接返回,避免报错
  123.                         }
  124.                         //获取手指移动值
  125.                         x = e.touches[0].clientX;
  126.                         y = e.touches[0].clientY;
  127.                         //判断下拉意图
  128.                         if (y - oy > 0) {
  129.                                 const deg = Math.atan(Math.abs(x - ox) / Math.abs(y - oy)) / Math.PI * 180;
  130.                                 if (deg > 40) {
  131.                                         ox = x;
  132.                                         oy = y;
  133.                                         return false;
  134.                                 }
  135.                         } else {
  136.                                 removeTouchEvent();
  137.                                 if (rootDocument.scrollTop === 0) {
  138.                                         addTouchEvent();
  139.                                         return false;
  140.                                 }
  141.                         }
  142.                         //手指移动的距离
  143.                         distance = y - oy;
  144.                         //添加阻尼效果
  145.                         let percent = (100 - distance * 0.5) / 100;
  146.                         percent = percent < 0.5 ? 0.5 : percent;
  147.                         distance = distance * percent
  148.                         //设置页面偏移距离
  149.                         mainDom.style.transform = `translateY(${distance}px)`
  150.                         console.log("[move]", distance)
  151.                         if (distance > 20 && distance <= 50) {
  152.                                 dots[0].style.transform = `translateX(-${(distance-20)*2/3}px)`;
  153.                                 dots[2].style.transform = `translateX(${(distance-20)*2/3}px)`;
  154.                         } else if (distance > 50) {
  155.                                 dots[0].style.transform = `translateX(-20px)`;
  156.                                 dots[2].style.transform = `translateX(20px)`;
  157.                         }
  158.                         e.preventDefault();
  159.                 }
  160.                 function endEvent() {
  161.                         //当拖动的相对值大于50时
  162.                         if (distance >= 50) {
  163.                                 //可以触发下拉刷新
  164.                                 dots[3].classList.add('loading')
  165.                                 mainDom.style.transition = `all 0.2s`;
  166.                                 mainDom.style.transform = `translateY(50px)`
  167.                                 if (timerHandle) {
  168.                                         clearTimeout(timerHandle)
  169.                                 }
  170.                                 timerHandle = setTimeout(() => {
  171.                                         if (timerHandle) {
  172.                                                 clearTimeout(timerHandle)
  173.                                         }
  174.                                         removeEffect()
  175.                                 }, 2000);
  176.                         } else {
  177.                                 removeEffect()
  178.                         }
  179.                 }
  180.                 function removeEffect() {
  181.                         //清除过渡效果
  182.                         mainDom.style.transition = `all 0.2s`;
  183.                         mainDom.style = '';
  184.                         dots[3].classList.remove('loading')
  185.                 }
  186.                 function addTouchEvent() {
  187.                         /**
  188.                          * 通过将`passive`设置为`false`,表示在触发`touchmove`事件时,事件处理函数可以调用`preventDefault()`来阻止默认行为。
  189.                          * 这意味着在移动过程中,可以阻止浏览器执行默认的滚动行为。
  190.                          */
  191.                         mainDom.addEventListener('touchstart', startEvent, {
  192.                                 passive: false
  193.                         });
  194.                         mainDom.addEventListener("touchmove", moveEvent, {
  195.                                 passive: false
  196.                         })
  197.                         mainDom.addEventListener('touchend', endEvent, {
  198.                                 passive: false
  199.                         })
  200.                 }
  201.                 function removeTouchEvent() {
  202.                         mainDom.removeEventListener('touchstart', startEvent);
  203.                         mainDom.removeEventListener("touchmove", moveEvent)
  204.                         mainDom.removeEventListener('touchend', endEvent)
  205.                 }
  206.         </script>
  207. </html>
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

农民

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表