原文地址:https://github.com/AlloyTeam/AlloyTouch/wiki/Pull-to-refresh

效果展示

扫码体验

你也可以点击这里访问Demo

可以点击这里查看代码

背景

在手机QQ内部,其实客户端提供了下拉刷新的能力,拖动整个webview进行下拉刷新,loading以及loading相关的wording和动画都是客户端的。解决了一部分需要下拉场景的问题。但是在某些场景下,还是需要web拥有自身的下拉刷新的能力。比如:

  • 需要统一IOS和安卓的体验
  • 需要自定义下拉刷新动画
  • 需要已web内的背景或者其他Dom元素有联动交互反馈

而拖动整个webview的下拉刷新无法满足这些场景。AlloyTouch很明显非常擅长处理web下拉刷新的需求。

页面骨架实现

pullRefresh在AlloyTouch header的下面,其中:

header zIndex > pullRefresh zIndex >wrapper和scroller的 zIndex。

下拉动画实现

看以看到,下拉到一定程度,箭头有个旋转动画,以及wording描述也会变化。这里主要利用js去切换class去实现,动画使用CSS transition实现。所以要预先定义好两种class。

  1. .arrow {
  2. margin-top: 5px;
  3. margin-bottom: 5px;
  4. }
  5. .arrow:after {
  6. content: "Pull to refresh";
  7. }
  8. .arrow_up.arrow:after {
  9. content: "Release to refresh";
  10. }
  11. .arrow_up img {
  12. transform: rotateZ(180deg);
  13. -webkit-transform: rotateZ(180deg);
  14. }
  15. .pull_refresh img {
  16. width: 20px;
  17. transition: transform .4s ease;
  18. }

通过上面定要好的class,在js逻辑里面只需要负责remove和add arrow_up clas便可以实现箭头旋转和wording的切换。

Loading动画实现

  1. <svg width='40px' height='40px' xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" preserveAspectRatio="xMidYMid" class="uil-default">
  2. <rect x="0" y="0" width="100" height="100" fill="none" class="bk"></rect><rect x='46.5' y='40' width='7' height='20' rx='5' ry='5' fill='#00a9f2' transform='rotate(0 50 50) translate(0 -30)'>
  3. <animate attributeName='opacity' from='1' to='0' dur='1s' begin='0s' repeatCount='indefinite' />
  4. </rect><rect x='46.5' y='40' width='7' height='20' rx='5' ry='5' fill='#00a9f2' transform='rotate(30 50 50) translate(0 -30)'>
  5. <animate attributeName='opacity' from='1' to='0' dur='1s' begin='0.08333333333333333s' repeatCount='indefinite' />
  6. ...
  7. ...
  8. </svg>

loading效果使用SVG去实现,利用12个rect的 indefinite animate去实现。begin代表开始时间有个递增达到loading的效果。

核心实现

  1. var scroller = document.querySelector("#scroller"),
  2. arrow = document.querySelector("#arrow"),
  3. pull_refresh = document.querySelector("#pull_refresh"),
  4. list = document.querySelector("#list"),
  5. index = 0;
  6. //给pull_refresh注入transform属性并且关闭透视投影
  7. Transform(pull_refresh, true);
  8. //给scroller注入transform属性并且关闭透视投影
  9. Transform(scroller, true);
  10. new AlloyTouch({
  11. touch: "#wrapper",
  12. target: scroller,
  13. property: "translateY",
  14. initialVaule: 0,
  15. min: window.innerHeight - 45 - 48 - 2000,
  16. max: 0,
  17. change: function (value) {
  18. //pull_refresh的translateY由scroller的value决定,所以向下拉scroller的时候,可以拉动pull_refresh
  19. pull_refresh.translateY = value;
  20. },
  21. touchMove: function (evt, value) {
  22. if (value > 70) { //当下拉到达70px的时候下箭头变成上箭头并且修改wording
  23. //为了代码简洁,直接使用classList
  24. //http://caniuse.com/#search=classList
  25. //下箭头变成上箭头并且修改wording
  26. arrow.classList.add("arrow_up");
  27. } else { //当下拉未到达70px上箭头变成下箭头并且修改wording
  28. arrow.classList.remove("arrow_up");
  29. }
  30. },
  31. touchEnd: function (evt, value) {
  32. if (value > 70) {
  33. //运动到60px的地方,用来显示loading
  34. this.to(60);
  35. //模拟请求~~~
  36. mockRequest(this);
  37. //return false很重要,用来防止执行alloytouch内部超出边界的回弹和惯性运动
  38. return false;
  39. }
  40. }
  41. });
  42. //模拟请求~~~
  43. function mockRequest(at) {
  44. //显示loading~~
  45. pull_refresh.classList.add("refreshing");
  46. //模拟cgi请求
  47. setTimeout(function () {
  48. var i = 0,
  49. len = 3;
  50. for (; i < len; i++) {
  51. var li = document.createElement("li");
  52. li.innerHTML = "new row " + index++;
  53. list.insertBefore(li, list.firstChild);
  54. }
  55. //重置下拉箭头和wording
  56. arrow.classList.remove("arrow_up");
  57. //移除loading
  58. pull_refresh.classList.remove("refreshing");
  59. //回到初始值
  60. at.to(at.initialVaule);
  61. //由于加了三个li,每个li高度为40,所以min要变得更小
  62. at.min -= 40 * 3;
  63. }, 500);
  64. }

不废话,都在注释里。

开始AlloyTouch

Github:https://github.com/AlloyTeam/AlloyTouch

任何意见和建议欢迎new issue,AlloyTouch团队会第一时间反馈。

AlloyTouch实现下拉刷新的更多相关文章

  1. Android SwipeRefreshLayout 下拉刷新——Hi_博客 Android App 开发笔记

    以前写下拉刷新 感觉好费劲,要判断ListView是否滚到顶部,还要加载头布局,还要控制 头布局的状态,等等一大堆.感觉麻烦死了.今天学习了SwipeRefreshLayout 的用法,来分享一下,有 ...

  2. 带你实现开发者头条APP(五)--RecyclerView下拉刷新上拉加载

    title: 带你实现开发者头条APP(五)--RecyclerView下拉刷新上拉加载 tags: -RecyclerView,下拉刷新,上拉加载更多 grammar_cjkRuby: true - ...

  3. listview下拉刷新和上拉加载更多的多种实现方案

    listview经常结合下来刷新和上拉加载更多使用,本文总结了三种常用到的方案分别作出说明. 方案一:添加头布局和脚布局        android系统为listview提供了addfootview ...

  4. Xamarin. Android实现下拉刷新功能

    PS:发现文章被其他网站或者博客抓取后发表为原创了,给图片加了个水印 下拉刷新功能在安卓和iOS中非常常见,一般实现这样的功能都是直接使用第三方的库,网上能找到很多这样的开源库.然而在Xamarin. ...

  5. android使用PullToRefresh实现上拉加载和下拉刷新效果

    其实很早前就在博客园中也写过官方的下拉刷新控件SwipeRefreshLayout,但是这个控件仅仅支持下拉刷新,用起来还算可以.然而在我们实际开发应用中,很多地方都不止有下拉刷新,而且还有上拉加载的 ...

  6. android官方下拉刷新控件SwipeRefreshLayout的使用

    可能开发安卓的人大多数都用过很多下拉刷新的开源组件,但是今天用了官方v4支持包的SwipeRefreshLayout觉得效果也蛮不错的,特拿出来分享. 简介:SwipeRefreshLayout组件只 ...

  7. 分页插件思想:pc加载更多功能和移动端下拉刷新加载数据

    感觉一个人玩lol也没意思了,玩会手机,看到这个下拉刷新功能就写了这个demo! 这个demo写的比较随意,咱不能当做插件使用,基本思想是没问题的,要用就自己封装吧! 直接上代码分析下吧! 布局: & ...

  8. 完美解决,浏览器下拉显示网址问题 | 完美解决,使用原生 scroll 写下拉刷新

    在 web 开发过程中我们经常遇到,不想让用户下拉看到我的地址,也有时候在 div 中没有惯性滚动,就此也出了 iScroll 这种关于滚动条的框架,但是就为了一个体验去使用一个框架好像又不值得,今天 ...

  9. mui scroll和上拉加载/下拉刷新

    mui中 scroll和上拉加载/下拉刷新同时存在会出现两个滚动条 把/*   */ /* //mui页面鼠标拖动代码: mui('.mui-scroll-wrapper').scroll({ dec ...

随机推荐

  1. onAttachedToWindow()在整个Activity生命周期的位置及使用

    onAttachedToWindow在整个Activity的生命周期中占据什么位置? 为什么要在onAttachedToWindow中修改窗口尺寸? 一.onAttachedToWindow在Acti ...

  2. ECMAScript 6 入门学习笔记(持续更新)

    1.let命令(作用同var) ES6新增了let命令,用来声明变量.它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效. { let a = 10; var b = 1; } ...

  3. 第二百三十六天 how can I 坚持

    太冷了,羽绒服没帽子,冻的耳朵疼. 她今天没有上班,原来是调休了. 其实应该是想到点啥,就应该写下,到晚上写就又忘了,什么都不记得了,这就是个需求吧. 睡觉.

  4. 转】Spark DataFrame小试牛刀

    原博文出自于: https://segmentfault.com/a/1190000002614456 感谢! 三月中旬,Spark发布了最新的1.3.0版本,其中最重要的变化,便是DataFrame ...

  5. c++面试题总结(1)

    1.int a=5,则 ++(a++)的值是() A.5      B.   6          C.7       D.逻辑错误 a++返回的是一个临时变量,这里是右值,不能再前面++了 2.下面 ...

  6. [翻译]创建ASP.NET WebApi RESTful 服务(8)

    本章讨论创建安全的WebApi服务,到目前为止,我们实现的API都是基于未加密的HTTP协议,大家都知道在Web中传递身份信息必须通过HTTPS,接下来我们来实现这一过程. 使用HTTPS 其实可以通 ...

  7. 【Visual Studio2010】创建XAML分析插件

    最近项目[Silverlight]中的需要实现国际化,需要对所有控件进行一个处理.由于使用了Telerik的控件,只需要去掉原有的Label或者Header属性,然后添加一个资源Key即可.但是在项目 ...

  8. 杭电ACM减花布条

    这是原题的地址 http://acm.hdu.edu.cn/showproblem.php?pid=2087 Problem Description 一块花布条,里面有些图案,另有一块直接可用的小饰条 ...

  9. 用c++库函数轻松解决回文问题

    在<Accelerated C++>6.1学到的,这个解决回文问题的方案很简单,有必要把它记录下来. begin返回一个迭代器,它会从容器的最后一个元素开始,并且从后向前地逆序访问容器.e ...

  10. MacOSX快捷键

    [MacOSX快捷键] 关闭显示器:Shift + Ctrl + 退出键 休眠:Command + Option + 退出键 关机:Ctrl + Option + Command + 退出键 打开文件 ...