vue3用better-scroll 做列表遇到的无法滑动以及底部遮挡问题详解

1,056 阅读2分钟

遇到的是2个大问题:

1、出现无法滚动

2、滚动到底部遮住了一部分,导致展示不全。

运用

better-scroll是一款重点解决移动端或者pc端各种滚动场景需求的插件。基于iscroll的重写的。用来做滚动列表。(轮播图、picker)那些。

安装

npm install @better-scroll/core

这个库的核心代码,抽象了核心滚动部分,作为better-scroll的最小使用单元,体积小。很多时候我们就只是需要一个纯粹的滚动需求,所以只需要引入这个库。

image.png

使用就只是

import BScroll from '@better-scroll/core'

const a = new BScroll('元素', {
    // ... 一些配置
})

列表渲染

image.png

整体效果是这个首页滚动(包括轮播图、和歌单列表。

第一个问题

第一个小问题就是,无论如何都无法滚动。代码如下:

image.png

image.png

打开控制台,看到滚动只在轮播图那一块生效,而我们是要整一块滚动。

image.png

这里呢,有个问题,就是我们这里scrollContainerRef这个父元素下面有2个或者多个元素的话,默认是指定处理第一个子元素。所以这里我们应该改成用一个div把这2个元素包起来。像这样:

image.png

第二个问题

第二个问题也是比较值得关注的。

这个scrollContainer的wrapper的高度一定是小于里面内容content的高度的。要么就无法滚动。

所以,需要给父元素scrollContainer加上样式加持,代码如下所示:

image.png

任何时候,如果出现无法滚动的情况下,都应该问问自己,查一查,是否内容的高度是否大于wrapper的高度了。只有这样,才能够滚动起来。

第三个问题

由于我这里的歌单列表是拿的接口数据,在接口还没回来的时候,他是没办法计算高度的。所以也会导致这个better-scroll无法滚动。可以添加一个watch事件来刷新一下better-scroll。因为一开始dom元素渲染时图片还未下载,所以导致内容元素的高度小于预期,出现滚动不正常的情况。

此时应该在图片加载完成后去调用refresh方法,它会重新计算最新的滚动距离。

watch(recommendList, () => {
  nextTick(() => {
    bScroll.value && bScroll.value.refresh()
  })
}, {
  deep: true
})

底部滚动弹回不到底

问题如图所示:

Kapture 2023-06-13 at 16.48.35.gif

这个直接在滚动的元素的下面的第一个父元素加上padding-bottom就可以了。

.total {
   padding-bottom: 90px;
}

以上就是在vue3中运用better-scroll做移动端滚动列表时遇到的无法滚动和底部被遮挡的问题解决方法。