评论

如何彻底解决小程序滚动穿透问题

解决微信小程序滚动穿透的终极方案。

背景

俗话说,产品有三宝:弹窗、浮层加引导,足以见弹窗在产品同学心目中的地位。对任意一个刚入门的前端同学来说,实现一个模态框基本都可以达到信手拈来的地步,但是,当模态框里边的内容滚动起来以后,就会出现各种各样的让人摸不着头脑的问题,其中,最出名的想必就是滚动穿透。

什么是滚动穿透?

滚动穿透的定义:指我们滑动顶层的弹窗,但效果上却滑动了底层的内容。

具体解决方案分析如下:

  • 改变顶层:从穿透的思路考虑,如果顶层不会穿透过去,那么问题就解决了,所以我们尝试给蒙层加catchtouchmove,但是发现部分场景无效果,那么就不再赘述了。
  • 改变底层:既然是顶层影响了底层,要是底层不会滚动,那就没这个问题了。

如何改变底层解决该问题呢?

不成熟方案:

  • 底部页面最外层view设置position: fixed;页面不可滚动,但是这个时候会导致页面回到顶部。
  • 滚动时监听滚动距离,弹窗时记录滚动位置,关闭弹窗后使用wx.pageScrollTo回滚到记录的位置。

成熟方案

page-meta组件:

通过该组件我们可以直接操作Page组件 ,我们给它的wxss样式overflow动态设置hiddenorvisibleorauto 就可以控制整个页面是否可以滚动。


wx.setPageStyle方法:

调用这个api,动态设置它为hidden/auto,用于控制页面是否可滚动,主要用于页面组件内使用,比如封装好的弹窗组件,就不用单独写page-meta组件了。。

wx.setPageStyle({
   style: {
     overflow: 'hidden' // ‘auto’
   }
})

老规矩,结尾放代码片段:

https://developers.weixin.qq.com/s/U6ItgQmP7upQ

拓展

支付宝小程序虽然存在page-meta组件,但是由于内核为69版本,给page设置overflow: hidden 也无法控制底部元素不可滚动,目前已联系支付宝的底层开发同学提供API控制页面disableScroll,目前正在封装Appx,近期开放。

最后一次编辑于  08-06  
点赞 50
收藏
评论

20 个评论

  • 🇪 🇱 🇸 🇪
    🇪 🇱 🇸 🇪
    2023-06-08

    收藏起来

    2023-06-08
    赞同
    回复
  • Dodeca.
    Dodeca.
    2023-05-30

    [渲染层错误] [Component] <page-meta>: 只能是页面内的第一个节点,且不能被 wx:if 或 wx:for 动态变更

    2023-05-30
    赞同
    回复 6
    查看更多(1)
  • 不熬夜&不改名
    不熬夜&不改名
    2022-07-21

    很有效,不过感觉切换的时候有些卡顿

    2022-07-21
    赞同
    回复 4
    • 不熬夜&不改名
      不熬夜&不改名
      2022-07-21回复TNT
      之前我是按其他人的说法,给整个页面套个壳,然后设置height:100%;overflow: hidden,只可惜在ios上没有效果
      2022-07-21
      回复
    • 好命先生
      好命先生
      2022-09-22回复TNT
      wx.setPageStyle 这个方法好想会提示找不到,报错了。
      2022-09-22
      1
      回复
    • 好命先生
      好命先生
      2022-09-27回复TNT
      这个版本才支持吗?
      2022-09-27
      回复
    • 好命先生
      好命先生
      2022-09-28回复TNT
      我用老的2.9.0版本提示没有setPageStyle属性
      2022-09-28
      回复
  • wu
    wu
    2022-06-02

    有用

    2022-06-02
    赞同
    回复
  • 星儿
    星儿
    2022-04-08

    怎么还是不行呢, 还是可以被穿透!

    2022-04-08
    赞同
    回复
  • 我的气质比较奇怪
    我的气质比较奇怪
    2022-03-29

    咋没有效果

    还是能穿透

    2022-03-29
    赞同
    回复 1
    • TNT
      TNT
      2022-03-29
      写个代码片段发我。你基础库多少的。
      2022-03-29
      回复
  • 你好耀眼。
    你好耀眼。
    2021-06-07

    很奈斯,正好遇到catchtouchmove不好用的情景了

    2021-06-07
    赞同
    回复
  • H
    H
    2021-05-13

    nice 很不错,用了感觉挺好

    2021-05-13
    赞同
    回复
  • 哄哄
    哄哄
    2021-05-12

    良心帖子,我现在就去试

    2021-05-12
    赞同
    回复
  • 大步向前
    大步向前
    2021-05-02

    很赞,算是看到一个用官方的解决方法的人了。

    我试试看能不能封装称组件。

    2021-05-02
    赞同
    回复

正在加载...

登录 后发表内容