美文网首页
编程大白话之-better-scroll移动端区域滚动插件

编程大白话之-better-scroll移动端区域滚动插件

作者: Han涛_ | 来源:发表于2019-07-28 20:07 被阅读0次

    今天有一个朋友问我,他使用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了!

    X轴横向滚动

    Hantao.gif
    <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,就可以移动了。

    Y轴纵向移动

    Hantao.gif
    <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时,都无法一下就理解它所叙述的意思或使用方法,总是要反复的尝试后才能得到结果。希望在我的理解下能帮助到正在学习的朋友,希望你在学习的路上有所助力!

    相关文章

      网友评论

          本文标题:编程大白话之-better-scroll移动端区域滚动插件

          本文链接:https://www.haomeiwen.com/subject/pfeprctx.html