h5实现下拉刷新上拉加载(兼容iOS手机)

在移动端开发中经常会遇到上拉加载下拉刷新的分页的需求,本人在用jquery weui框架中的相应扩展组件的时候发现不太好用,于是有找了一下,发现了一个非常不错的组件iscroll4.js,现在好像官网不能进了,这里附一个下载链接:下载iscroll4.js.

查看演示:iscrollDemo

我们先来看一下属性。

属性:

scrollbars: false 是否显示滚动条。默认为false;也可以单独设置横向和纵向

fadeScrollbars:true  滚动条淡入淡出效果,当然前提是你滚动条显示了。默认为false;

interactiveScrollbars  是否拖动滚动条。默认为false;

resizeScrollbars  滚动条的长度是按照比例设置的,如果想要固定尺寸,可以设置为flase;默认为true;

bounce: false  滚动到达容器边界时是否执行反弹动画。默认为true;

click:true   iScroll禁止默认鼠标的点击行为,如果要使用设置true;默认为false;

                。。。。。。不在一 一列出,

下面看一下注意事项:

1:滚动容器需要是绝对定位,及position:absolute;

2:滚动容器里面只有第一个元素能滚动,因而一般滚动容器里面一般只放一个元素,在这个元素里面再显示数据

3:上拉的时候回弹回,每次在更新完成滚动容器里面的数据之后需要调用refresh();方法,可以消除此问题

下面来看例子:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
		<title>isCrollDemo</title>
		<style>
			html,
			body {
				height: 100%;
			}

			body {
				background-color: #f5fafe;
				color: #000;
				font-family: "微软雅黑";
				font-size: 13px;
			}

			li {
				text-align: center;
				list-style: none;
				margin-right: 40px;
			}

			#wrapper {
				position: absolute;
				top: 1px;
				bottom: 1px;
				left: 0;
				width: 100%
			}

			#scroller li {
				height: 60px;
				line-height: 60px;
				background: #ecf6ff;
				margin-top: 10px
			}

			#pullDown,
			#pullUp {
				padding: 0 10px;
				height: 30px;
				line-height: 30px;
				color: #888;
				text-align: center
			}
		</style>
	</head>
	<body>


		<div id="wrapper">
			<div id="scroller">
				<div id="pullDown">
					<span class="pullDownLabel">下拉刷新</span>
				</div>
				<!-- </ul> -->
				<ul id="ulData">
					<li> 1111</li>
					<li> 1111</li>

				</ul>
				<div id="pullUp" class="weui-loadmore">

					<span class="pullUpLabel weui-loadmore__tips">上拉加载更多</span>
				</div>
			</div>
		</div>
		<script src="js/iscroll4.js"></script>

		<script>
			var mScroll;
			var isRefresh = true;
			var p = 1; //当前页码
			var onePageCount = 20; //每页显示多少个
			window.onload = function() {
				mScroll = PullDownAddUP("wrapper", function(loadType) {
					if (loadType == "refresh") { //下拉刷新
						isRefresh = true;
					} else { //上拉加载
						isRefresh = false;
					}
					loadData();
				});
				loadData();

			}

			function loadData() {
				if (isRefresh) {
					p = 1;
					document.getElementById("ulData").innerHTML = "";
				} else {
					p++;
				}

				setTimeout(function() {
					var htm = document.getElementById("ulData").innerHTML;
					for (var i = onePageCount * (p - 1); i < onePageCount * p; i++) {
						htm += '<li> ' + '我是第' + (i + 1) + '个,属于第' + p + '页' + '</li>';
					}

					document.getElementById("ulData").innerHTML = htm;
					mScroll.refresh(); //数据加载完成一定要调用此方法,否则上拉会反弹

				}, 1000);

			}


			/**
			 *此方法可以写到公用的类里面,然后调用 ,
			 * 下拉刷新的id一定要是 【pullDown】,上拉加载的id一定要是【pullUp】
			 *
			 * 用iScroll4.js实现上拉加载和下拉刷新
			 * @param wrapperId 滚动容器的 elementId
			 * @param callbc  滚动回调,参数:refresh 表示下拉刷新,loadmore 表示上拉加载
			 * 
			 * @return myScroll 将对象返回(注意,在执行完成数据刷新/加载之后要调用 myScroll.refresh(),否则会上拉会反弹)
			 */
			function PullDownAddUP(wrapperId, callbc) {
				var myScroll, pullDownEl, pullDownOffset, pullUpEl, pullUpOffset, generatedCount = 0;
				var isRefresh = true,
					isLoadMore = true;
				var option = {};
				option.hScrollbar = false;//纵向滚动条
				option.vScrollbar = false;//横向滚动条
				option.useTransition = true;



				//动画部分
				try {
					pullDownEl = document.getElementById('pullDown');
                    pullUpOffset = pullUpEl.offsetHeight;


				} catch (e) {
					isRefresh = false;
				}
				try {
					pullUpEl = document.getElementById('pullUp');
					pullUpOffset = pullUpEl.offsetHeight;
				} catch (e) {
					isLoadMore = false;
				}

				if (isRefresh) {
					if (isLoadMore) {
						option.onRefresh = function() {
							if (pullDownEl.className.match('loading')) {
								pullDownEl.className = '';
								pullDownEl.querySelector('.pullDownLabel').innerHTML = '下拉刷新';
							} else if (pullUpEl.className.match('loading')) {
								pullUpEl.className = '';
								pullUpEl.querySelector('.pullUpLabel').innerHTML = '上拉加载更多';
							}
						};
						option.onScrollMove = function() {

							if (this.y > 5 && !pullDownEl.className.match('flip')) {
								pullDownEl.className = 'flip';
								pullDownEl.querySelector('.pullDownLabel').innerHTML = '释放刷新';
								this.minScrollY = 0;
							} else if (this.y < 5 && pullDownEl.className.match('flip')) {
								pullDownEl.className = '';
								pullDownEl.querySelector('.pullDownLabel').innerHTML = '下拉刷新...';
								this.minScrollY = -pullDownOffset;
							} else if (this.y < (this.maxScrollY - 5) && !pullUpEl.className.match('flip')) {
								pullUpEl.className = 'flip';
								pullUpEl.querySelector('.pullUpLabel').innerHTML = '释放加载';
								this.maxScrollY = this.maxScrollY;
							} else if (this.y > (this.maxScrollY + 5) && pullUpEl.className.match('flip')) {
								pullUpEl.className = '';
								pullUpEl.querySelector('.pullUpLabel').innerHTML = '上拉加载更多...';
								this.maxScrollY = pullUpOffset;
							}
						};
						option.onScrollEnd = function() {
							if (pullDownEl.className.match('flip')) {
								pullDownEl.className = 'loading';
								pullDownEl.querySelector('.pullDownLabel').innerHTML = '加载中';
								callbc("refresh"); // Execute custom function (ajax call?)
							} else if (pullUpEl.className.match('flip')) {
								pullUpEl.className = 'loading';
								pullUpEl.querySelector('.pullUpLabel').innerHTML = '加载中';
								callbc("loadmore"); // Execute custom function (ajax call?)
							}
						};
					} else {
						option.onRefresh = function() {
							if (pullDownEl.className.match('loading')) {
								pullDownEl.className = '';
								pullDownEl.querySelector('.pullDownLabel').innerHTML = '下拉刷新';
							}
						};
						option.onScrollMove = function() {

							if (this.y > 5 && !pullDownEl.className.match('flip')) {
								pullDownEl.className = 'flip';
								pullDownEl.querySelector('.pullDownLabel').innerHTML = '释放刷新';
								this.minScrollY = 0;
							} else if (this.y < 5 && pullDownEl.className.match('flip')) {
								pullDownEl.className = '';
								pullDownEl.querySelector('.pullDownLabel').innerHTML = '下拉刷新...';
								this.minScrollY = -pullDownOffset;
							}
						};
						option.onScrollEnd = function() {
							if (pullDownEl.className.match('flip')) {
								pullDownEl.className = 'loading';
								pullDownEl.querySelector('.pullDownLabel').innerHTML = '加载中';
								callbc("refresh"); // Execute custom function (ajax call?)
							}
						};
					}
				} else {
					if (isLoadMore) {
						option.onRefresh = function() {
							if (pullUpEl.className.match('loading')) {
								pullUpEl.className = '';
								pullUpEl.querySelector('.pullUpLabel').innerHTML = '上拉加载更多';
							}
						};
						option.onScrollMove = function() {
							if (this.y < (this.maxScrollY - 5) && !pullUpEl.className.match('flip')) {
								pullUpEl.className = 'flip';
								pullUpEl.querySelector('.pullUpLabel').innerHTML = '释放加载';
								this.maxScrollY = this.maxScrollY;
							} else if (this.y > (this.maxScrollY + 5) && pullUpEl.className.match('flip')) {
								pullUpEl.className = '';
								pullUpEl.querySelector('.pullUpLabel').innerHTML = '上拉加载更多...';
								this.maxScrollY = pullUpOffset;
							}
						};
						option.onScrollEnd = function() {
							if (pullUpEl.className.match('flip')) {
								pullUpEl.className = 'loading';
								pullUpEl.querySelector('.pullUpLabel').innerHTML = '加载中';
								callbc("loadmore"); // Execute custom function (ajax call?)
							}
						};
					} else {
						option.onRefresh = function() {
							//if (pullDownEl.className.match('loading')) {
							//	pullDownEl.className = '';
							//	pullDownEl.querySelector('.pullDownLabel').innerHTML = '下拉刷新';
							//} 
						};

					}
				}



				myScroll = new iScroll('wrapper', option);

				return myScroll;
			}
		</script>
	</body>
</html>

以上就是示例代码,可以拷贝出来直接测试。

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 20
    评论
实现一个移动端的table表格,并且有上拉加载下拉刷新的功能,你可以使用H5的一些特性,例如`<table>`标签、`<div>`标签、`<ul>`标签、`<li>`标签、CSS3动画、JavaScript等。 以下是一个使用HTML、CSS、JavaScript实现的示例代码: HTML: ```html <!-- table表格容器 --> <div id="table-container"> <!-- 下拉刷新提示 --> <div class="pull-down-refresh"> <span class="loading"></span>下拉刷新 </div> <!-- table表格 --> <table> <thead> <tr> <th>Header 1</th> <th>Header 2</th> <th>Header 3</th> </tr> </thead> <tbody id="table-body"> <tr> <td>Item 1-1</td> <td>Item 1-2</td> <td>Item 1-3</td> </tr> <tr> <td>Item 2-1</td> <td>Item 2-2</td> <td>Item 2-3</td> </tr> <tr> <td>Item 3-1</td> <td>Item 3-2</td> <td>Item 3-3</td> </tr> <!-- 省略更多的表格行 --> </tbody> </table> <!-- 上拉加载提示 --> <div class="pull-up-load"> <span class="loading"></span>上拉加载 </div> </div> ``` CSS: ```css /* table表格容器样式 */ #table-container { height: 100%; overflow-y: auto; } /* 下拉刷新提示样式 */ .pull-down-refresh { height: 50px; line-height: 50px; text-align: center; font-size: 14px; color: #888; position: relative; } .pull-down-refresh .loading { display: inline-block; width: 20px; height: 20px; margin-right: 10px; border-radius: 50%; border: 2px solid #ccc; border-top-color: #07c160; animation: rotate 0.6s linear infinite; position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); } @keyframes rotate { from { transform: rotate(0); } to { transform: rotate(360deg); } } /* 上拉加载提示样式 */ .pull-up-load { height: 50px; line-height: 50px; text-align: center; font-size: 14px; color: #888; position: relative; } .pull-up-load .loading { display: inline-block; width: 20px; height: 20px; margin-right: 10px; border-radius: 50%; border: 2px solid #ccc; border-top-color: #07c160; animation: rotate 0.6s linear infinite; position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); } ``` JavaScript: ```javascript // 获取table表格 var table = document.querySelector('table'); // 初始化下拉刷新 var startY = 0; // 记录触摸起始位置 var isPullDown = false; // 是否正在下拉刷新 table.addEventListener('touchstart', function(event) { var touch = event.touches[0]; startY = touch.pageY; }, false); table.addEventListener('touchmove', function(event) { if (isPullDown) { return; } var touch = event.touches[0]; var distance = touch.pageY - startY; if (distance > 0 && table.scrollTop == 0) { // 下拉刷新 isPullDown = true; var refresh = document.querySelector('.pull-down-refresh'); var loading = refresh.querySelector('.loading'); loading.style.display = 'inline-block'; refresh.innerHTML = '<span class="loading"></span>正在刷新'; // 模拟加载数据 setTimeout(function() { // 插入新的表格行 var tbody = document.querySelector('#table-body'); var tr = document.createElement('tr'); tr.innerHTML = '<td>New Item 1</td><td>New Item 2</td><td>New Item 3</td>'; tbody.insertBefore(tr, tbody.firstChild); // 结束下拉刷新 loading.style.display = 'none'; refresh.innerHTML = '<span class="loading"></span>下拉刷新'; isPullDown = false; }, 1000); } }, false); // 初始化上拉加载 var isPullUp = false; // 是否正在上拉加载 table.addEventListener('scroll', function(event) { var tbody = document.querySelector('#table-body'); var height = tbody.offsetHeight; var top = table.scrollTop; var clientHeight = table.clientHeight; if (height - top - clientHeight < 50 && !isPullUp) { // 上拉加载 isPullUp = true; var load = document.querySelector('.pull-up-load'); var loading = load.querySelector('.loading'); loading.style.display = 'inline-block'; load.innerHTML = '<span class="loading"></span>正在加载'; // 模拟加载数据 setTimeout(function() { // 插入新的表格行 var tr = document.createElement('tr'); tr.innerHTML = '<td>New Item 1</td><td>New Item 2</td><td>New Item 3</td>'; tbody.appendChild(tr); // 结束上拉加载 loading.style.display = 'none'; load.innerHTML = '<span class="loading"></span>上拉加载'; isPullUp = false; }, 1000); } }, false); ``` 注意:这只是一个简单的示例代码,实际情况可能需要更复杂的代码来满足需求。另外,上拉加载下拉刷新功能需要与后端API接口配合使用

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值