摘要:但是在某些场景下,还是需要拥有自身的下拉刷新的能力。比如需要统一和安卓的体验需要自定义下拉刷新动画需要已内的背景或者其他元素有联动交互反馈而拖动整个的下拉刷新无法满足这些场景。很明显非常擅长处理下拉刷新的需求。
原文地址: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。
.arrow { margin-top: 5px; margin-bottom: 5px; } .arrow:after { content: "Pull to refresh"; } .arrow_up.arrow:after { content: "Release to refresh"; } .arrow_up img { transform: rotateZ(180deg); -webkit-transform: rotateZ(180deg); } .pull_refresh img { width: 20px; transition: transform .4s ease; }
通过上面定要好的class,在js逻辑里面只需要负责remove和add arrow_up clas便可以实现箭头旋转和wording的切换。
Loading动画实现loading效果使用SVG去实现,利用12个rect的 indefinite animate去实现。begin代表开始时间有个递增达到loading的效果。
核心实现var scroller = document.querySelector("#scroller"), arrow = document.querySelector("#arrow"), pull_refresh = document.querySelector("#pull_refresh"), list = document.querySelector("#list"), index = 0; //给pull_refresh注入transform属性并且关闭透视投影 Transform(pull_refresh, true); //给scroller注入transform属性并且关闭透视投影 Transform(scroller, true); new AlloyTouch({ touch: "#wrapper", target: scroller, property: "translateY", initialVaule: 0, min: window.innerHeight - 45 - 48 - 2000, max: 0, change: function (value) { //pull_refresh的translateY由scroller的value决定,所以向下拉scroller的时候,可以拉动pull_refresh pull_refresh.translateY = value; }, touchMove: function (evt, value) { if (value > 70) { //当下拉到达70px的时候下箭头变成上箭头并且修改wording //为了代码简洁,直接使用classList //http://caniuse.com/#search=classList //下箭头变成上箭头并且修改wording arrow.classList.add("arrow_up"); } else { //当下拉未到达70px上箭头变成下箭头并且修改wording arrow.classList.remove("arrow_up"); } }, touchEnd: function (evt, value) { if (value > 70) { //运动到60px的地方,用来显示loading this.to(60); //模拟请求~~~ mockRequest(this); //return false很重要,用来防止执行alloytouch内部超出边界的回弹和惯性运动 return false; } } }); //模拟请求~~~ function mockRequest(at) { //显示loading~~ pull_refresh.classList.add("refreshing"); //模拟cgi请求 setTimeout(function () { var i = 0, len = 3; for (; i < len; i++) { var li = document.createElement("li"); li.innerHTML = "new row " + index++; list.insertBefore(li, list.firstChild); } //重置下拉箭头和wording arrow.classList.remove("arrow_up"); //移除loading pull_refresh.classList.remove("refreshing"); //回到初始值 at.to(at.initialVaule); //由于加了三个li,每个li高度为40,所以min要变得更小 at.min -= 40 * 3; }, 500); }
不废话,都在注释里。
开始AlloyTouchGithub:https://github.com/AlloyTeam/AlloyTouch
任何意见和建议欢迎new issue,AlloyTouch团队会第一时间反馈。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/81123.html
摘要:动画库学习笔记可以很方便的用做下拉刷新,抽奖转盘等效果,我一直很好奇他是如何工作的,尤其是它能完美模拟原生的平滑滚动和惯性回弹等效果,而且体积小,速度快。当轴逐渐增加到达时,当前值轴会到达目标值。类似的还有,属性值的排序会造成影响。 AlloyTouch动画库学习笔记 alloyTouch可以很方便的用做下拉刷新,抽奖转盘等效果,我一直很好奇他是如何工作的,尤其是它能完美模拟原生的平滑...
摘要:所以制作各种各样的轮播组件还是得心应手。第一种轮播图如上图所示。因为初始值是,所有向左边滑动一定是负值。可以得到一定是。可以拿到当前的位置以及当前所处的位置。是运动结束后的回调,用来设置的。 轮播图也涉及到触摸和触摸反馈,同时,AlloyTouch可以把惯性运动打开或者关闭,并且设置min和max为运动区域,超出会自动回弹。除了一般的竖向滚动,AlloyTouch也可以支持横向滚动,甚...
摘要:设置为,相对于高度为的来说就是。再看这一堆使用最关键的一点就是计算和的值。可以看到回调里可以拿到,也就是对象的实例,当等于代表滚到了底部,所以这里加上代表快要滚动底部已经看到了加载更多。开始任何意见和建议欢迎,团队会第一时间反馈。 原文链接:https://github.com/AlloyTeam/AlloyTouch/wiki/kandian 先验货 showImg(https://...
阅读 3232·2023-04-25 18:03
阅读 1112·2021-11-15 11:38
阅读 5396·2021-10-25 09:45
阅读 817·2021-09-24 09:48
阅读 2161·2021-09-22 15:34
阅读 1715·2019-08-30 15:44
阅读 2655·2019-08-30 13:12
阅读 552·2019-08-29 16:05