Javascript下拉刷新的简单实现

发布时间 - 2026-01-10 23:02:14    点击率:

本文实例为大家分享了Javascript下拉刷新的简单实现代码,供大家参考,具体内容如下

Html相关代码

<!DOCTYPE html>
<html lang="en">
 <head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no">
 </head>
 <body style="background-color: beige;">
  <div id="container" style="width:100%;border:solid 1px blue; transform:translate(0px,-61px)">
   <div style="height:50px; line-height:50px; text-align:center; width:100%; border:solid 1px red;">
    努力加载中...
   </div> 
   <div style="width:100%; line-height:30px;background-color:#F2F2F2; font-size:17px; font-family:'Adobe Garamond Pro'">
    下拉刷新下拉刷新下拉刷新下拉刷新下拉刷新下拉刷新下拉刷新下拉刷新下拉刷新下拉刷新下拉刷新下拉刷新下拉刷新下拉刷新下拉刷新下拉刷新下拉刷新下拉刷新下拉刷新下拉刷新
    下拉刷新下拉刷新下拉刷新下拉刷新下拉刷新下拉刷新下拉刷新下拉刷新下拉刷新下拉刷新下拉刷新下拉刷新下拉刷新下拉刷新下拉刷新下拉刷新下拉刷新下拉刷新下拉刷新下拉刷新
    下拉刷新下拉刷新下拉刷新下拉刷新下拉刷新下拉刷新下拉刷新下拉刷新下拉刷新下拉刷新下拉刷新下拉拉刷新下拉刷新
   </div>
  </div>
 </body>
</html>
<!--JQuery是那么的好用,这种情况下怎么能没有它呢!-->
<script type="text/javascript" src="http://libs.baidu.com/jquery/1.11.1/jquery.min.js"></script>

JavaScript该做什么呢? 

1、根据滑动轨迹动态调整滑块位置(transfrom=>translate);

2、根据滑动的距离判断是否执行刷新(或数据加载)。

当然,如果滑动结束后使用ajax重新加载页面数据,还将涉及到一个页面向上滑动并隐藏提示部分的效果。

大致思路:

(前提条件:当前元素已滑动至顶部)

1、当鼠标左键按下(移动设备上的touchstart事件)的时候记录下当前鼠标位置的 Y轴坐标;

2、当鼠标移动的时候(touchmove事件),记录下鼠标的Y 轴坐标判断滑动轨迹并进行相应的滑块移动;

3、当鼠标左键松开(touchend事件)的时候,通过对比鼠标开始和结束的Y轴坐标的距离判断是否应该刷新页面(或重新加载数据)。

上代码:

/*
 *obj--滑动对象
 *offset--滑动距离(当滑动距离大于等于offset时将调用callback)
 *callback--滑动完成后的回调函数
 */
 var slide = function (obj, offset, callback) {
  var start,
   end,
   isLock = false,//是否锁定整个操作
   isCanDo = false,//是否移动滑块
   isTouchPad = (/hp-tablet/gi).test(navigator.appVersion),
   hasTouch = 'ontouchstart' in window && !isTouchPad;
  //将对象转换为jquery的对象
  obj = $(obj);
  var objparent = obj.parent();
  /*操作方法*/
  var fn =
   {
    //移动容器
    translate: function (diff) {
     obj.css({
      "-webkit-transform": "translate(0," + diff + "px)",
      "transform": "translate(0," + diff + "px)"
     });
    },
    //设置效果时间
    setTranslition: function (time) {
     obj.css({
      "-webkit-transition": "all " + time + "s",
      "transition": "all " + time + "s"
     });
    },
    //返回到初始位置
    back: function () {
     fn.translate(0 - offset);
     //标识操作完成
     isLock = false;
    }
   };
  //滑动开始
  obj.bind("touchstart", function (e) {
   if (objparent.scrollTop() <= 0 && !isLock) {
    var even = typeof event == "undefined" ? e : event;
    //标识操作进行中
    isLock = true;
    isCanDo = true;
    //保存当前鼠标Y坐标
    start = hasTouch ? even.touches[0].pageY : even.pageY;
    //消除滑块动画时间
    fn.setTranslition(0);
   }
  });
  //滑动中
  obj.bind("touchmove", function (e) {
   if (objparent.scrollTop() <= 0 && isCanDo) {
    var even = typeof event == "undefined" ? e : event;
    //保存当前鼠标Y坐标
    end = hasTouch ? even.touches[0].pageY : even.pageY;
    if (start < end) {
     even.preventDefault();
     //消除滑块动画时间
     fn.setTranslition(0);
     //移动滑块
     fn.translate(end - start - offset);
    }
   }
  });
  //滑动结束
  obj.bind("touchend", function (e) {
   if (isCanDo) {
    isCanDo = false;
    //判断滑动距离是否大于等于指定值
    if (end - start >= offset) {
     //设置滑块回弹时间
     fn.setTranslition(1);
     //保留提示部分
     fn.translate(0);
     //执行回调函数
     if (typeof callback == "function") {
      callback.call(fn, e);
     }
    } else {
     //返回初始状态
     fn.back();
    }
   }
  });
 }

代码分析:

1、参数:obj,要滑动的对象;offset,提示部分的transform的值( 代码中是 transform:translate(0px,-61px) ,那么这里就是61 );callback,回调函数,在下拉完成后调用的函数( 页面刷新或数据加载 )。

2、为什么是transform不是margin?

因为transform不会引起重绘,相比margin更流畅,性能更好。但是transfrom有个比较好玩的地方,如果translateY的值为负数 (当前元素上移xx像素) 下方元素不会跟着上移 (margin会上移) ,在这点上它和margin是有区别的 。 注意,这里的-webkit-transform的存在是有必要的,因为有些浏览器识别不了transform,比如微信内置浏览 (我的手机上是这样的) 。为了兼容性,多扣几个字母是值得的。

3、关于transition设置为0s。

为什么要在touchstart的时候把transition的值设置为0秒呢?transition的作用是为元素属性的变化添加过渡效果,例如一个框变大,我们设置为transition为1s,那么这个框就是在1s内变大到指定大小。第一个参数表示设置过渡效果的 CSS 属性的名称 (如:margin,transform;all表示所有) ,第二个参数表示过渡的时间。 代码中设置transition的目的是在于滑动结束后 (手指离开屏幕) 为滑块回弹添加过渡效果,这样看上去就不会那么突兀。当然,这个过渡效果同样会应用到数据加载完成后提示部分的隐藏上。设置为0是为了取消在滑动过程中的滑块过渡效果,我们手指往下滑动的时候,滑块会跟这向下移动,这样就有了滑动滑块的效果。如果这个时候不取消transition就会出现滑块抖动的效果 (嘿嘿,有兴趣的话可以试试这种感觉。) 。整个过程中transition是相当重要的。

4、关于isLock和isCanDo.

这两个变量的作用在于防止二次滑动,在第一次滑动后数据加载完成之前不允许有第二次的滑动。当滑动开始的时候讲isLock和isCanDo都设置为True,表示允许后面两个事件里的代码可以正常运行,当滑动结束后isCanDo设置为false表示在isLock被设置为True之前 (整个操作完成之前) 所有的事件代码均不可用 (不执行下拉数据加载等相关动作) 。

5、如何使用?

$(function () {
 slide("#container", 61, function (e) {
  var that = this;
  setTimeout(function () {
   that.back.call();
  }, 2000);
 });
});

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


# js  # 下拉刷新  # 基于iscroll.js实现下拉刷新和上拉加载效果  # 纯javascript实现简单下拉刷新功能  # vue.js移动端app之上拉加载以及下拉刷新实战  # vue.js整合vux中的上拉加载下拉刷新实例教程  # JS 插件dropload下拉刷新、上拉加载使用小结  # iscroll.js的上拉下拉刷新时无法回弹的解决方法  # dropload.js插件下拉刷新和上拉加载使用详解  # js仿手机页面文件下拉刷新效果  # JS+CSS实现下拉刷新/上拉加载插件  # 原生js仿写手机端下拉刷新  # 滑块  # 设置为  # 鼠标  # 加载  # 回调  # 是有  # 当鼠标  # 结束后  # 完成后  # 左键  # 过程中  # 判断是否  # 几个  # 就会  # 有个  # 第一个  # 在这  # 是这样  # 要在  # 这两个 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何用AWS免费套餐快速搭建高效网站?  JavaScript中如何操作剪贴板_ClipboardAPI怎么用  如何快速查询网址的建站时间与历史轨迹?  VIVO手机上del键无效OnKeyListener不响应的原因及解决方法  香港服务器租用每月最低只需15元?  Python函数文档自动校验_规范解析【教程】  phpredis提高消息队列的实时性方法(推荐)  原生JS获取元素集合的子元素宽度实例  Laravel如何处理文件下载请求?(Response示例)  如何在IIS中新建站点并配置端口与物理路径?  laravel怎么实现图片的压缩和裁剪_laravel图片压缩与裁剪方法  美食网站链接制作教程视频,哪个教做美食的网站比较专业点?  如何彻底删除建站之星生成的Banner?  怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?  微信小程序 配置文件详细介绍  太平洋网站制作公司,网络用语太平洋是什么意思?  Laravel怎么做缓存_Laravel Cache系统提升应用速度的策略与技巧  Laravel如何实现用户注册和登录?(Auth脚手架指南)  Laravel模型事件有哪些_Laravel Model Event生命周期详解  香港服务器建站指南:外贸独立站搭建与跨境电商配置流程  如何在IIS中新建站点并解决端口绑定冲突?  深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?  大连 网站制作,大连天途有线官网?  Laravel中DTO是什么概念_在Laravel项目中使用数据传输对象(DTO)  Linux虚拟化技术教程_KVMQEMU虚拟机安装与调优  EditPlus中的正则表达式 实战(2)  Gemini手机端怎么发图片_Gemini手机端发图方法【步骤】  Python3.6正式版新特性预览  高端云建站费用究竟需要多少预算?  如何在阿里云部署织梦网站?  网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?  如何快速生成凡客建站的专业级图册?  Laravel如何发送邮件和通知_Laravel邮件与通知系统发送步骤  Laravel Eloquent性能优化技巧_Laravel N+1查询问题解决  个人网站制作流程图片大全,个人网站如何注销?  Laravel怎么配置S3云存储驱动_Laravel集成阿里云OSS或AWS S3存储桶【教程】  Laravel如何将应用部署到生产服务器_Laravel生产环境部署流程  JS去除重复并统计数量的实现方法  javascript中的数组方法有哪些_如何利用数组方法简化数据处理  如何快速搭建二级域名独立网站?  车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?  开心动漫网站制作软件下载,十分开心动画为何停播?  Laravel如何自定义分页视图?(Pagination示例)  Laravel如何使用.env文件管理环境变量?(最佳实践)  为什么php本地部署后css不生效_静态资源加载失败修复技巧【技巧】  HTML 中如何正确使用模板变量为元素的 name 属性赋值  Laravel模型关联查询教程_Laravel Eloquent一对多关联写法  Laravel如何使用Socialite实现第三方登录?(微信/GitHub示例)  PHP 实现电台节目表的智能时间匹配与今日/明日轮播逻辑  如何在阿里云香港服务器快速搭建网站?