betterScroll的使用

719 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第16天

betterScroll的使用

BetterScroll 是一款重点解决移动端(已支持 PC)各种滚动场景需求的插件。它的核心是借鉴的 iscroll (opens new window)的实现,它的 API 设计基本兼容 iscroll,在 iscroll 的基础上又扩展了一些 feature 以及做了一些性能优化。

BetterScroll 是使用纯 JavaScript 实现的,这意味着它是无依赖的。

文档地址: 介绍 | BetterScroll 2.0 (better-scroll.github.io)

它可以很好地帮助我们实现移动端滚动监听,顶部底部缓冲等效果,今天我在项目中就尝试使用一下,

安装
npm install @better-scroll/core --save
引入
import BScroll from '@better-scroll/core'

或者我们可以直接在线引用:

<script src="https://unpkg.com/@better-scroll/core@latest/dist/core.js"></script><!-- minify -->
<script src="https://unpkg.com/@better-scroll/core@latest/dist/core.min.js"></script>
使用

使用一个标签包裹住要展示的内容,确保容器标签内只有一个标签:

<div id='app'>
    <!--容器,容器内只有一个子标签(scroll-content)-->
    <div class="wrapper" ref="scroll">
        <!--内容-->
        <div class="scroll-content">
            <!--这里是内容-->
        </div>
    </div>
</div>

创建BScroll实例,将容器的对象dom实例作为参数传入,第二个参数为对象形式的配置信息

this.bs = new BScroll(this.$refs.scroll, options)//切记不要在create生命周期函数中调用,因为在那时dom刚做声明还未初始化,无法获取

我这里要实现的功能:

  1. 内容下拉到底后触发事件,向服务器请求后续内容
  2. 监听滚动的位置,实现导航栏吸顶粘黏功能
  3. 为项目添加更顺滑的滚动效果

用到的配置:

  • probeType----决定是否派发 scroll 事件(实时监听滚动事件),对页面的性能有影响

    • probeType 为 0,在任何时候都不派发 scroll 事件,
    • probeType 为 1,仅仅当手指按在滚动区域上,每隔 momentumLimitTime 毫秒派发一次 scroll 事件,
    • probeType 为 2,仅仅当手指按在滚动区域上,一直派发 scroll 事件,
    • probeType 为 3,任何时候都派发 scroll 事件,包括调用 scrollTo 或者触发 momentum 滚动动画
  • bounce---- 当滚动超过边缘的时候会有一小段回弹动画。
  • momentum----当快速在屏幕上滑动一段距离的时候,会根据滑动的距离和时间计算出动量,并生成滚动动画。

用到的方法:

  • on(type, fn, context)

    • {string} type 事件名
    • {Function} fn 回调函数
    • {Object} context 函数执行的上下文环境,默认是 this

用到的插件:

  • pullup(底部上拉触发事件,实现上拉加载更多)

    • //安装
      npm install @better-scroll/pull-up --save
      
    • //引入及注册
      import Pullup from '@better-scroll/pull-up'BScroll.use(Pullup)
      
    • //实例化BScroll时传入
      this.bs = new BScroll('.wrapper', {
          pullUpLoad: true
        })
      
    • //结合on方法使用
      this.bscroll.on('pullingUp', ()=>{
          //dosth
      })
      

注意,这里之所以使用ref获取dom对象,是为了防止通过document方法获取时不慎获取到与其他组件中同名的元素

补充:ref的用法

ref绑定在组件上,通过this.$refs.refname获取到该组件对象

ref绑定在普通标签元素上,通过this.$refs.refname获取到该元素对象

这样即使其他组件中有ref同名组件或元素,通过this拿到的也一定是当前组件的ref标签