关于前端滚动优化:Better Scroll

原生的滚动容易造成卡顿、不流畅,为了优化这个问题Better Scroll应运而生。它的核心是借鉴的 iscroll 的实现,它的 API 设计基本兼容 iscroll,在 iscroll 的基础上又扩展了一些 feature 以及做了一些性能优化。

学前必看

Better Scroll默认工作机制:外层有个wrapper框框,代表可见范围,滚动的内容放在wrapper内的content里。
在这里插入图片描述
话不多说,直接上代码:

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>Page Title</title>
    <style>
        .wrapper{
    
    
            height: 400px;
            background-color: red;
            overflow: hidden;
        }
    </style>
</head>
<body>
    <div class="wrapper">
        <!-- <button class="btn">按钮</button> -->
        <ul class="content">
            <button class="btn">按钮</button>
            <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>
            <li>列表数据51</li>
            <li>列表数据52</li>
            <li>列表数据53</li>
            <li>列表数据54</li>
            <li>列表数据55</li>
            <li>列表数据56</li>
            <li>列表数据57</li>
            <li>列表数据58</li>
            <li>列表数据59</li>
            <li>列表数据60</li>
            <li>列表数据61</li>
            <li>列表数据62</li>
            <li>列表数据63</li>
            <li>列表数据64</li>
            <li>列表数据65</li>
            <li>列表数据66</li>
            <li>列表数据67</li>
            <li>列表数据68</li>
            <li>列表数据69</li>
            <li>列表数据70</li>
            <li>列表数据71</li>
            <li>列表数据72</li>
            <li>列表数据73</li>
            <li>列表数据74</li>
            <li>列表数据75</li>
            <li>列表数据76</li>
            <li>列表数据77</li>
            <li>列表数据78</li>
            <li>列表数据79</li>
            <li>列表数据80</li>
            <li>列表数据81</li>
            <li>列表数据82</li>
            <li>列表数据83</li>
            <li>列表数据84</li>
            <li>列表数据85</li>
            <li>列表数据86</li>
            <li>列表数据87</li>
            <li>列表数据88</li>
            <li>列表数据89</li>
            <li>列表数据90</li>
            <li>列表数据91</li>
            <li>列表数据92</li>
            <li>列表数据93</li>
            <li>列表数据94</li>
            <li>列表数据95</li>
            <li>列表数据96</li>
            <li>列表数据97</li>
            <li>列表数据98</li>
            <li>列表数据99</li>
            <li>列表数据100</li>
        </ul>

    </div>
    //引入bs
    <script src="https://unpkg.com/better-scroll@latest/dist/better-scroll.min.js"></script>
    <script>
        console.log(BetterScroll)
        // 1.创建BScroll对象;默认不会监听实时滚动位置;默认会阻止浏览器原生click事件
            // probe:侦测,
                // 0,1都不侦测实时位置
                // 2:在手指滚动的过程中侦测,手指离开后的惯性滚动不侦测
                // 3:只要滚动都侦测
            // click:是否进行点击
                // true:可以进行点击
            // pullUpLoad:到底后,是否上拉加载更多
        let wrapper = document.querySelector('.wrapper')
        let bs =  BetterScroll.createBScroll(wrapper,{
    
    
            probeType: 3,
            click: true,
            pullUpLoad: true,
            
        })
        // 2.进行检测滚动位置
        bs.on('scroll',(position) => {
    
    
            // console.log(position)
        })
        // 3.监听上拉事件
        bs.on('pullingUp', () => {
    
    
            console.log('上拉加载更多')

            setTimeout(() => {
    
    
                bs.finishPullUp()
            }, 2000);


        })
        //设置按钮可点击
        document.querySelector('.btn').addEventListener('click', function(){
    
    
            console.log('-------')
        })
    </script>
</body>
</html>

vue封装BS

<template>
  <div class="wrapper" ref="wrapper">
    <div class="content">
      <slot></slot>
    </div>
  </div>
</template>

<script>
  import BScroll from '@better-scroll/core'
	import PullUp from '@better-scroll/pull-up'
	BScroll.use(PullUp)

  export default {
    
    
    name: "Scroll",
    props: {
    
    
      probeType: {
    
    
        type: Number,
        default: 0
      },
      pullUpLoad: {
    
    
        type: Boolean,
        default: false
      }
    },
    data() {
    
    
      return {
    
    
        scroll: null,
        message: '哈哈哈'
      }
    },
    mounted() {
    
    
      // 1.创建BScroll对象
      this.scroll = new BScroll(this.$refs.wrapper, {
    
    
        click: true,
        probeType: this.probeType,
        pullUpLoad: this.pullUpLoad
      })

      // 2.监听滚动的位置
      this.scroll.on('scroll', (position) => {
    
    
        // console.log(position);
        this.$emit('scroll', position)
      })

      // 3.监听上拉事件
			if(this.probeType===2 ||this.probeType===3){
    
    
				this.scroll.on('pullingUp', () => {
    
    
					// console.log("上拉加载更多");
				  this.$emit('pullingUp');
				
				})
			}


    },
    methods: {
    
    
      scrollTo(x, y, time=300) {
    
    
        this.scroll.scrollTo(x, y, time)
      },
      finishPullUp() {
    
    
       setTimeout(()=>{
    
    
       	this.scroll.finishPullUp()
       },2000)
      },
			refresh(){
    
    
				this.scroll.refresh()
				// console.log('111')
			}
    }
  }
</script>

<style scoped>

</style>

可能遇到的问题

Better-Scroll在决定有多少区域可以滚动时,是根据scrollerHeight属性决定,而scrollerHeight属性是根据放Better-Scroll的content中的子组件的高度

但是我们的首页中,刚开始在计算scrollerHeight属性时,是没有将图片计算在内的。所以,计算出来的告诉是错误的(1300+)

后来图片加载进来之后有了新的高度,但是scrollerHeight属性并没有进行更新.。所以滚动出现了问题

如何解决这个问题了?
监听每一张图片是否加载完成,只要有一张图片加载完成了,执行一次scroll的refresh()

猜你喜欢

转载自blog.csdn.net/qq_39748940/article/details/109238063