闲来无事,写了一个当下比较常见的下拉刷新/上拉加载的jquery插件,代码记录在这里,有兴趣将代码写成插件与npm包可以留言。
体验地址:http://owenliang.github.io/pullToRefresh/
项目地址:https://github.com/owenliang/pullToRefresh
实现注意:
利用transition做动画时,优先使用transform:translate取代top,后者动画流畅度存在问题。
各移动浏览器对手势触摸的处理不同(简单罗列如下),但是下面的应对方案又会导致部分浏览器的overflow:scroll失效,总之难以兼容:
微信浏览器下拉自带回弹动画:可以禁止document的touchmove事件默认处理行为。
谷歌浏览器下拉自带刷新功能:利用属性touch-action: none可以禁掉。
针对上述问题,我的建议是滚动一律用iscroll5插件模拟实现(非overflow:scroll),然后利用上面的方法禁掉浏览器的默认touchmove行为。
transition如果有多个属性,那么transitionend回调会为每个属性回调一次,因此遇到其中任意一个回调就应该把css和transitionend回调都删除掉。
浏览器在执行JS代码时没有机会重绘UI,因此在使用transition的时候一定要注意把修改动画终止CSS的代码通过setTimeout延迟一会执行。
贴代码上首页,欢迎留言交流,需一位有兴趣有时间的朋友合作,主要做2件事:
1)插件改为NPM包。
2)基于pullToRefresh库,开发类似"今日头条"的左右滑动UI。
pullToRefresh.js:
/** * 为指定的容器添加滚动条,支持下拉刷新与上拉加载功能 * @param container 需要滚动的容器,要求设置css: position!=static,height= * @param option 配置项,详见下方defaultOption说明 * @return 返回对象用于操控此区域,当前暴露了iscroll的refresh函数,当你在插件之外向滚动区域增加/删除内容后应该主动调用一次 * @description * * 2017-03-29 * 1)支持上拉加载 * 2017-03-30 * 1)改为jquery静态函数插件 * 2)支持关闭下拉刷新或上拉加载 */ $.installPullToRefresh = function (container, option) { // 起始触摸位置 var touchStartY = 0; // 起始图标位置 var pullStartY = 0; // 当前的触摸事件 var touchEvent = null; // 当前的刷新事件 var refreshEvent = null; // 当前图标位置 var curY = -55; // 当前的加载事件 var loadEvent = null; // 默认参数 var defaultOption = { // 刷新相关 noRefresh: false, // 关闭下拉刷新特性 pauseBound: 40, // 触发刷新的位置(也是图标loading暂停的位置) lowerBound: 80, // 最大下拉到多少px loadImg: "load.png", // loading图片 pullImg: "pull.png", // 下拉图片 onRefresh: function (refreshDone) { // 刷新数据回调 setTimeout(function() { // 默认不做任何事 refreshDone(); }, 0); }, // 加载相关 noLoad: false, // 关闭上拉加载特性 bottomHeight: 1, // 距离滚动条底部多少px发起刷新 onLoad: function (loadDone) { setTimeout(function() { loadDone(); }, 0); }, }; var finalOption = $.extend(true, defaultOption, option); // 创建iscroll5滚动区域 var iscroll = new IScroll(container, { bounce: false, }); // 关闭上拉加载特性 if (!finalOption.noLoad) { // 监听滚动结束事件,用于上拉加载 iscroll.on('scrollEnd', function () { // 有滚动条的情况下,才允许上拉加载 if (iscroll.maxScrollY < 0) { // maxScrollY<0表明出现了滚动条 var bottomDistance = (iscroll.maxScrollY - iscroll.y) * -1; // 距离底部足够近,触发加载 if (bottomDistance <= finalOption.bottomHeight) { // 当前没有刷新和加载事件正在执行 if (!loadEvent && !refreshEvent) { loadEvent = {}; // 生成新的加载事件 finalOption.onLoad(function (error, msg) { loadEvent = null; // 清理当前的加载事件 // 延迟重绘滚动条 setTimeout(function () { iscroll.refresh(); }, 0); }); } } } }); } // 关闭下拉刷新特性 if (!finalOption.noRefresh) { // 紧邻滚动区域,容纳刷新图标 var pullContainer = $('<div class="pullContainer"></div>') // 创建小图标 var pullToRefresh = $('<div class="pullToRefresh"><img src="/UploadFiles/2021-04-02/' + finalOption.pullImg + '">pullToRefresh.css:
.pullToRefresh { position:absolute; left:0; right:0; margin:auto; width: 50px; height: 50px; z-index: 10; opacity: 1; transform:translateY(-55px) translateZ(0) rotateZ(0deg); -ms-transform:translateY(-55px) translateZ(0) rotateZ(0deg); /* IE 9 */ -moz-transform:translateY(-55px) translateZ(0) rotateZ(0deg); /* Firefox */ -webkit-transform:translateY(-55px) translateZ(0) rotateZ(0deg); /* Safari 和 Chrome */ -o-transform:translateY(-55px) translateZ(0) rotateZ(0deg); /* Opera */ } .backTranTop { transition: transform 0.8s ease, opacity 0.8s ease; -moz-transition: transform 0.8s ease, opacity 0.8s ease; /* Firefox 4 */ -webkit-transition: transform 0.8s ease, opacity 0.8s ease; /* Safari 和 Chrome */ -o-transition: transform 0.8s ease, opacity 0.8s ease; /* Opera */ } .pullContainer { position:relative; } .pullToRefresh img { display:block; width: 40px; height: 40px; /* 让img居中在.pullToRefresh中 */ position: absolute; top: 0; bottom: 0; left:0; right:0; margin:auto; } /* loading旋转动画 */ .loadingAnimation { animation: loadingFrame 1s infinite; -moz-animation: loadingFrame 1s infinite; /* Firefox */ -webkit-animation: loadingFrame 1s infinite; /* Safari 和 Chrome */ -o-animation: loadingFrame 1s infinite; /* Opera */ } @keyframes loadingFrame { from { transform: rotateZ(360deg); } to { transform: rotateZ(0deg); } } @-moz-keyframes loadingFrame /* Firefox */ { from { transform: rotateZ(360deg); } to { transform: rotateZ(0deg); } } @-webkit-keyframes loadingFrame /* Safari 和 Chrome */ { from { transform: rotateZ(360deg); } to { transform: rotateZ(0deg); } } @-o-keyframes loadingFrame /* Opera */ { from { transform: rotateZ(360deg); } to { transform: rotateZ(0deg); } }以上所述是小编给大家介绍的JS+CSS实现下拉刷新/上拉加载插件,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
P70系列延期,华为新旗舰将在下月发布
3月20日消息,近期博主@数码闲聊站 透露,原定三月份发布的华为新旗舰P70系列延期发布,预计4月份上市。
而博主@定焦数码 爆料,华为的P70系列在定位上已经超过了Mate60,成为了重要的旗舰系列之一。它肩负着重返影像领域顶尖的使命。那么这次P70会带来哪些令人惊艳的创新呢?
根据目前爆料的消息来看,华为P70系列将推出三个版本,其中P70和P70 Pro采用了三角形的摄像头模组设计,而P70 Art则采用了与上一代P60 Art相似的不规则形状设计。这样的外观是否好看见仁见智,但辨识度绝对拉满。
更新日志
- 欧美极美女声《 弦动你心》3CD[WAV分轨][1.7G]
- 张惠妹《歌声妹影 Live》SACD[ISO][2.9G]
- 黑豹乐队.2024-Smokescreen视陷(EP)【风华秋实】【FLAC分轨】
- 十个勤天.2024-展开一天【可能文化】【FLAC分轨】
- 王杰.1989-故事的角色(粤)【华纳】【WAV+CUE】
- 【原神】纳塔万火之瓯8个被掩藏起来的宝箱
- 【原神】胡桃突破素材(霓裳花,骗骗花)收集攻略
- 【原神】V5.1攻略 |「胡桃」一图流丨角色解析攻略
- Xbox版本的《夺宝奇兵:古老之圈》将以60FPS为目标
- 《潜行者2》将提供一个强大MOD工具包!主机PC都支持
- 《潜行者2》技术制作人:游戏将提供始终稳定的帧率!
- 《刺客信条:枭雄》雕像开放预订
- Bungie新作官方中文定名《惑星行者》 商店页面上线
- 原神花神诞祭第三阶段彩蛋在哪里 花神诞祭第三阶段彩蛋具体位置一览
- 发烧工具测试碟《音响罗盘Audio Compass 2019》SACD非卖品[WAV+分轨][889M]