better-scroll的使用

原创
2019/01/17 13:51
阅读数 1.7K

目的:需要在手机端实现上拉加载数据,下拉刷新页面的功能。
使用的控件:better-scroll
难点:目前的better-scroll都是和vue一起使用,公司用的是angularjs1.x,所以需要最原始的使用然后封装成指令。

<div class="wrapper">
    <ul class="content">
      <li>...</li>
      <li>...</li>
      ...
    </ul>
</div>

wrapper里只能有一层元素,也就是需要滚动的元素,使用了better-scroll之后,会自动在content加上动画的样式。

<!-- 这种结构是不可以滚动的 -->
<div class="wrapper">
    <ul class="content">
      ...
    </ul>
    <ul class="content">
      ...
    </ul>
</div>
<!-- 如果需要滚动的话加一层div包裹着两个ul标签 -->

wrapper一定需要指定高度,不然是无法滚动的。
需要看系统使用的定位是absolute还是flex,如果是flex是有默认的高度的,就不需要自己手动设置wrapper的高度。

<script>
// wraper高度的计算,needSubHeight就是标题栏、底部导航栏等的遮挡物的高度
var height = document.body.offsetHeight - needSubHeight;
</script>

在这里补上demo,better-scroll的版本为:v1.13.4

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no">
    <script src="https://cdn.bootcss.com/jquery/1.8.2/jquery.js"></script>
    <title>下拉刷新上拉加载</title>
    <style type="text/css">
        body {
            background-color: beige;
            padding: 0;
        }
        div {
            margin: 0;
            padding: 0;
        }
        .wrapper {
            height: 150px;
            width: 100%;
            position: relative;
        }
        ul {
            list-style: none;
            margin: 0;
            padding: 0;
        }
        ul li {
            text-align: center;
            border: 1px solid rgba(166, 166, 166, 0.4);
        }
        /* 全局提示信息 */
        .alert{
            display: none;
            position: fixed;
            top: 55px;
            left: 0;
            z-index: 2;
            width: 100%;
            height: 35px;
            line-height: 35px;
            text-align: center;
            color: #fff;
            font-size: 12px;
            background: rgba(7, 17, 27, 0.7);
        }
    </style>
</head>
<body>
<div class="wrapper wrapper-hook" style="overflow: hidden;">
	<!-- 内层元素不能设置高度 -->
    <ul class="content">
        <li>测试数据1</li>
        <li>测试数据2</li>
        <li>测试数据3</li>
        <li>测试数据4</li>
        <li>测试数据5</li>
        <li>测试数据6</li>
        <li>测试数据7</li>
        <li>测试数据8</li>
        <li>测试数据9</li>
        <li>测试数据10</li>
        <li>测试数据11</li>
        <li>测试数据12</li>
        <li>测试数据13</li>
        <li>测试数据14</li>
        <li>测试数据15</li>
    </ul>
</div>
<div class="alert alert-hook"></div>
<script src="bscroll.js"></script>
<script>
setTimeout(function() {
	var wrapper = document.querySelector('.wrapper-hook');
	function scrollOption () {};
	scrollOption.prototype = {
		click: true,
	    probeType: 1,
	    pullUpLoad: {
	        threshold: -20,   // 负值表示当上拉距离超过底部 --px 时触发 pullingUp 事件
	        stop: 10
	    },
	}
	// 可以根据传入的参数控制是否开启下拉刷新
	scrollOption.prototype.pullDownRefresh = {
	    threshold: 20,  // 当下拉到超过顶部 --px 时,触发 pullingDown 事件
	    stop: 10        // 刷新数据的过程中,回弹停留在距离顶部 --px 的位置
	};

	// 点击事件如果执行两次,把button标签改为a标签、或者用@tag代替点击事件
	var scroll = new BScroll(wrapper, new scrollOption());
	console.log(scroll);

	// 上拉加载
	scroll.on('pullingUp', function () {
        refreshAlert('加载中...');
	    loadData();
	    scroll.refresh();
	    scroll.finishPullUp(); // 当上拉加载数据加载完毕后,需要调用此方法告诉 better-scroll 数据已加载。
	});

	// 下拉刷新
	scroll.on('pullingDown', function () {
        refreshAlert('刷新成功');
	    scroll.refresh();
	    scroll.finishPullDown(); // 当下拉刷新数据加载完毕后,需要调用此方法告诉 better-scroll 数据已加载。
	});
}, 500);

// 加载数据
function loadData() {
    var content = document.querySelector('.content');
    var li = document.createElement("li");
    li.appendChild(document.createTextNode("111"));
    content.appendChild(li);
}

var alert = document.querySelector('.alert-hook');
// 刷新成功提示方法
function refreshAlert(text) {
  text = text || '操作成功';
  alert.innerText = text; 
  alert.style.display = 'block';
  setTimeout(function(){
    alert.style.display = 'none';
  },1000);
}
</script>
</body>
</html>

给出我是用angularjs封装之后的代码:

/**
* http://ustbhuangyi.github.io/better-scroll/doc/zh-hans/
* 下拉刷新页面
* 上拉加载数据
*/
utilModule.factory("gScroll", function($timeout) {
   return function($scope, elemId, paginator, loadMoreData, refreshPage) {
	   var gScroll = {
		   globalScroll: null,
		   scrollHeight: function(needSubHeight) {
			   return document.body.offsetHeight - needSubHeight;
		   },
		   refresh: function() {
			   this.globalScroll && this.globalScroll.refresh(); // if(a){} 当a为空串或null或undefined时,结果为false
		   },
		   finishPullUp: function() {
			   if (this.globalScroll) {
				   this.globalScroll.refresh();
				   this.globalScroll.finishPullUp(); // 当上拉加载数据加载完毕后,需要调用此方法告诉 better-scroll 数据已加载。
			   }
		   },
		   pullingDown: function() {
			   if (this.globalScroll) {
				   this.globalScroll.refresh();
				   this.globalScroll.finishPullDown(); // 当下拉刷新数据加载完毕后,需要调用此方法告诉 better-scroll 数据已加载。
			   } 
		   },
		   destroy: function() {
			   if (this.globalScroll) {
				   this.globalScroll.destroy(); // 销毁 better-scroll,解绑事件
			   }
		   },
		   initScroll: function() {
			   var that = this;
			   $timeout(function(){
				   var wrapper = document.getElementById(elemId);
				   function scrollOption () {};
				   scrollOption.prototype = {
					    click: true,
					    probeType: 1,
					    pullUpLoad: {
					        threshold: -65,   // 负值表示当上拉距离超过底部 --px 时触发 pullingUp 事件
					        //stop: 10
					    },
					}
					
					// 可以根据传入的参数控制是否开启下拉刷新
					scrollOption.prototype.pullDownRefresh = {
					    threshold: 30,  // 当下拉到超过顶部 --px 时,触发 pullingDown 事件
					    stop: 10        // 刷新数据的过程中,回弹停留在距离顶部 --px 的位置
					};
					
					// 点击事件如果执行两次,把button标签改为a标签、或者用@tag代替点击事件
					var scroll = new BScroll(wrapper, new scrollOption());
					that.globalScroll = scroll; // 给全局的scroll赋值
					scroll.refresh();  // 先计算一次滚动的高度
					// 上拉加载
					scroll.on('pullingUp', function () {
		      		   if (paginator && angular.isFunction(paginator.loadNext)) {
		      			    paginator.loadNext(function() {

				      	    });
		      		    } else if (angular.isFunction(loadMoreData)) {
		      		    	loadMoreData();
		      		    }
					    scroll.refresh();
					    scroll.finishPullUp(); 
					});

					// 下拉刷新
					scroll.on('pullingDown', function () {
	      			    if (paginator && angular.isFunction(paginator.reload)) {
		      				paginator.reload(function() {

			      			}); 
		      			} else if (angular.isFunction(refreshPage)) {
		      				refreshPage();
		      			}
					    scroll.refresh();
					    scroll.finishPullDown(); 
					});
			   },200);		   
		   },
	   }
	   return gScroll;
   }
});
展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部