微信小程序中由scroll-view中使用fixed定位的元素引发的bug~

在微信小程序中,scroll-view中使用position:fixed定位的元素会失效,不再相对于根元素来定位,而是相对scroll-view定位。
经过查证,是由于scroll-view中的 refresherEnabled 导致的fixed失效

解决

前提:页面有下拉刷新需求,并且其中的fixed定位Modal元素不好提取到父组件中控制展示和隐藏。
解决过程

  • 首先尝试了使用view替换scroll-view
    给view标签设置overflow-y: auto;然后使用小程序自己的下拉刷新,在index.config.json中添加
"enablePullDownRefresh": true,
"backgroundTextStyle": "dark",

页面中使用onPullDownRefresh方法即可。

But...又出现了新的问题。
因为页面中使用的自定义navbar,导致下拉刷新的控件被自定义的navbar遮挡。且微信官方不支持修改刷新控件的位置。
最终放弃此方案。

  • 给fixed定位的Modal传参,当Modal展示时,禁用scroll-view的滚动(可行)
    依然使用scroll-view 代码如下
<ScrollView
  refresherEnabled
  refresherTriggered={refresherTriggered}
  onRefresherRefresh={onRefresherRefresh}
  scrollY={canScroll}
  scrollTop={scrollTop}
>

canScroll:是否可滚动
scrollTop:距离顶部

注意
将canScroll设置为false前,需要先将页面滚动到顶部,否则页面滚动一部分之后,展示Modal,依然以滚动前的位置定位。

const handleScroll = (visible) => {
  // 先写
  if (!visible) {
    // 当弹出层显示时,滚动到顶部,scrollTop没有变化的话不会滚动,所以使用了Math.random()
    setScrollTop(Math.random())
  }
  // 后写
  setCanScroll(e)
}
posted @ 2023-06-21 13:34  ZerlinM  阅读(1284)  评论(0编辑  收藏  举报