今天有一个朋友问我,他使用better-scroll后结果没有动的问题,那么和大家聊一下我口中的better-scroll移动端的滚动插件。
引用网站的一句话:
better-scroll 是一款重点解决移动端(已支持 PC)各种滚动场景需求的插件。它的核心是借鉴的 iscroll 的实现,它的 API 设计基本兼容 iscroll,在 iscroll 的基础上又扩展了一些 feature 以及做了一些性能优化。
better-scroll 是基于原生 JS 实现的,不依赖任何框架。它编译后的代码大小是 63kb,压缩后是 35kb,gzip 后仅有 9kb,是一款非常轻量的 JS lib。
网站有给出的具体解释及介绍:http://ustbhuangyi.github.io/better-scroll/doc/options.html
网站上有很清楚的描述,而且这个插件就像它所描述的是一个轻量级的很好使用和操作,遇到的问题大多是html或一些小细节,下面我来出几个简单的例子大家看看就OK了!
Hantao.gifX轴横向滚动
<body>
<!-- 横向滑动 -->
<!-- 包裹容器 -->
<div class="menu-wrap">
<!-- 滑块 -->
<div>
<div class="content-nav">
<span>菜单1</span>
<span>菜单2</span>
<span>菜单3</span>
<span>菜单4</span>
<span>菜单5</span>
<span>菜单6</span>
<span>菜单7</span>
<span>菜单8</span>
<span>菜单9</span>
<span>菜单10</span>
</div>
</div>
</div>
<script src="./js/bscroll.min.js"></script>
<script>
// 页面(DOM)加载完成后执行
window.onload = function () {
// 实例化
var bScroll = new BScroll('.menu-wrap', {
scrollX: true // X轴移动
})
}
</script>
</body>
CSS样式写了两种:第一种使用定位
@function px2rem($px, $rem: 75) {
@return $px / $rem * 1rem;
} // 引用的flexible文件,设置尺寸使用的
.menu-wrap {
position: relative; // 外层最大的盒子
height: px2rem(80);
line-height: px2rem(80);
>div {
position: absolute; // 可移动的盒子
.content-nav { // 内容盒子
display: flex;
span {
width: px2rem(100);
margin: 0 px2rem(20);
text-align: center;
}
}
}
}
第二种:使用宽度(宽度为已知的宽度,设置后变为死值,所以没有上面的方法灵活,效果一样)
@function px2rem($px, $rem: 75) {
@return $px / $rem * 1rem;
} // 引用的flexible文件,设置尺寸使用的
.menu-wrap {
width: 100%;
height: px2rem(80);
line-height: px2rem(80);
>div {
width: 200%; // 中间移动的盒子设置宽度
overflow: hidden; // 配合overflow:hidden
.content-nav {
display: flex;
span {
width: px2rem(100);
margin: 0 px2rem(20);
text-align: center;
}
}
}
}
只要在html中创建的盒子嵌套没有问题,引入better-scroll文件后设置scrollX: true,就可以移动了。
Hantao.gifY轴纵向移动
<body>
<!-- 纵向滑动 -->
<!-- 包裹容器 -->
<section class="wrap">
<!-- 滑动模块 -->
<div>
<!-- 内容区域 -->
<div>列表1</div>
<div>列表2</div>
<div>列表3</div>
<div>列表4</div>
<div>列表5</div>
<div>列表6</div>
<div>列表7</div>
<div>列表8</div>
<div>列表9</div>
<div>列表10</div>
<div>列表11</div>
<div>列表12</div>
<div>列表13</div>
<div>列表14</div>
<div>列表15</div>
<div>列表16</div>
<div>列表17</div>
<div>列表18</div>
<div>列表19</div>
<div>列表20</div>
<div>列表21</div>
<div>列表22</div>
<div>列表23</div>
<div>列表24</div>
<div>列表25</div>
<div>列表26</div>
<div>列表27</div>
<div>列表28</div>
<div>列表29</div>
<div>列表30</div>
<div>列表31</div>
<div>列表32</div>
<div>列表33</div>
<div>列表34</div>
<div>列表35</div>
<div>列表36</div>
<div>列表37</div>
<div>列表38</div>
<div>列表39</div>
<div>列表40</div>
<div>列表41</div>
<div>列表42</div>
<div>列表43</div>
<div>列表44</div>
<div>列表45</div>
<div>列表46</div>
<div>列表47</div>
<div>列表48</div>
<div>列表49</div>
<div>列表50</div>
</div>
</section>
<script src="./js/bscroll.min.js"></script>
<script>
// 页面(DOM)加载完成后执行
window.onload = function() {
// 实例化
var bScroll = new BScroll('.wrap', {
scrollY: true // Y轴移动
})
}
</script>
</body>
html,
body {
height: 100%;
}
// 包裹盒子
.wrap {
height: 100%; // 父元素高度要为100%
overflow: hidden; // 加上后滚动条消失
// 滑动模块
>div {
// 以防内容太少,导致滚动失败,可以通过js获取父元素高度+1px
min-height: 100.1%;
}
}
Y轴移动时只要有高度,并且内容超出了最外层盒子时,设置scrollY: true就可以移动。要注意查看设置滑动盒子的高度,是否正确,如果有多层盒子,要一级级的向下设置。
Hantao.gif有这个效果之后,我们可以通过这个延伸制作上拉刷新下拉加载
<body>
<div class="app">
<header></header>
<section>
<div class="wrap">
<div>
<!-- 必须要有一个内容盒子,用来存放内容 -->
<ul id="uls">
<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>
<li>列表16</li>
<li>列表17</li>
<li>列表18</li>
<li>列表19</li>
<li>列表20</li>
<li>列表21</li>
<li>列表22</li>
<li>列表23</li>
<li>列表24</li>
<li>列表25</li>
<li>列表26</li>
<li>列表27</li>
<li>列表28</li>
<li>列表29</li>
<li>列表30</li>
<li>列表31</li>
<li>列表32</li>
<li>列表33</li>
<li>列表34</li>
<li>列表35</li>
<li>列表36</li>
<li>列表37</li>
<li>列表38</li>
<li>列表39</li>
<li>列表40</li>
<li>列表41</li>
<li>列表42</li>
<li>列表43</li>
<li>列表44</li>
<li>列表45</li>
<li>列表46</li>
<li>列表47</li>
<li>列表48</li>
<li>列表49</li>
<li>列表50</li>
</ul>
</div>
</div>
</section>
<footer></footer>
</div>
</body>
<script src="./js/bscroll.min.js"></script>
<script>
window.onload = function () {
var bScroll = new BScroll('.wrap', {
scrollY: true,
probeType: 3, // 监听滚动事件,配合scroll事件使用
pullDownRefresh: { // 下拉刷新,配合pullingDown事件使用
threshold: 50, // 下拉触发的高度
stop: 0 // 刷新后返回的高度,不设会停在40px位置
},
pullUpLoad: { // 上拉加载,配合pullingUp事件使用
threshold: -30, // 设置上拉触发事件的距离
}
});
bScroll.on('pullingDown', function() { // 配合pullDownRefresh使用
console.log('下拉刷新')
var li = document.createElement('li'); // 刷新添加一个新的li
li.innerText = '我是新来的li';
uls.insertBefore(li, uls.children[0]);
bScroll.finishPullDown(); // 完成下拉,配合下拉刷新使用,如果不添加只能刷新一次
})
bScroll.on('pullingUp', function() { // 配合pullUpLoad使用
console.log('上拉加载');
for(var i = 0; i < 3; i++) { // 每次添加3个li
var li = document.createElement('li');
li.innerText = '新来的' + i;
uls.appendChild(li);
}
bScroll.finishPullUp(); // 完成上拉,如果不添加只能上拉一次
})
bScroll.maxScrollY = -100;
}
</script>
代码并不完善,还有很多不足之处,有待完善。仅供大家相互学习参考。
我自己并不是一个聪明的人,有很多时候看网站或API时,都无法一下就理解它所叙述的意思或使用方法,总是要反复的尝试后才能得到结果。希望在我的理解下能帮助到正在学习的朋友,希望你在学习的路上有所助力!
网友评论