文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

在vue中封装一个betterscroll组件,并解决ios、Android在微信页面上下拉出现滑动的问题

2022-06-06 13:44

关注

最近在开发微信公众号网页的时候,发现使用原生滚动的时候,ios在微信网页下,上拉,下拉都会出现一大片的空白,看起来极其的别扭,为了解决这一问题,找了许多参考资料,如下是解决方法。

1.首先在你需要禁止滑动的页面中添加如下代码

mounted(){
   document.body.addEventListener(
        'touchmove',
        function (e) {
          e.preventDefault()
        },
        { passive: false }
      )
}

当你设置完后会发现,ios\Android下页面确实不能上拉下拉了,但是页面也不能滑动了,大部分博客告诉完你这个方法之后都不会告诉你接下来的解决办法,实属坑人啊,以下是我的解决方法。因为上面那个代码会把所有原生的滚动都禁止掉,所以这里我建议用betterscroll代替原生的滚动。

2.安装betterscroll代替原生的scroll,这样页面就可以滑动了

npm install better-scroll

然后我把betterscroll组件封装了一下

<!--
    参数解释在props中
    使用说明:
      
      
    要想betterScroll产生滚动效果,你需要设置'.wrapper'的高度,content的内容高度必须要高于warpper的高度才会显示出滚动条
    如果content里面内容的高度是不固定的,那么需要给scroll传值data
-->
  
    
    
  
import BScroll from 'better-scroll'
export default {
  props: {
    
    probeType: {
      type: Number,
      default: 1
    },
    //  点击列表是否派发click事件
    click: {
      type: Boolean,
      default: true
    },
    //  是否开启横向滚动
    scrollX: {
      type: Boolean,
      default: false
    },
    //  是否派发滚动事件
    listenScroll: {
      type: Boolean,
      default: false
    },
    //  列表的数据,用于数据改变导致视图更改后重新初始化滚动
    data: {
      type: Array,
      default: null
    },
    
    pullup: {
      type: Boolean,
      default: false
    },
    
    pulldown: {
      type: Boolean,
      default: false
    },
    
    beforeScroll: {
      type: Boolean,
      default: false
    },
    
    refreshDelay: {
      type: Number,
      default: 20
    }
  },
  watch: {
    // 监听数据的变化,延时refreshDelay时间后调用refresh方法重新计算,保证滚动效果正常
    data () {
      setTimeout(() => {
        this.refresh()
      }, this.refreshDelay)
    }
  },
  mounted () {
    // 保证在DOM渲染完毕后初始化better-scroll
    setTimeout(() => {
      this._initScroll()
    }, 20)
  },
  methods: {
    _initScroll () {
      if (!this.$refs.wrapper) {
        return
      }
      // better-scroll的初始化
      this.scroll = new BScroll(this.$refs.wrapper, {
        probeType: this.probeType,
        click: this.click,
        useTransition: false, // 防止iphone微信滑动卡顿
        scrollX: this.scrollX,
        preventDefault: true,
        momentum: true,
        bounce: false // 阻止scroll的弹性动画
      })
      // 是否派发滚动事件
      if (this.listenScroll) {
        const me = this
        this.scroll.on('scroll', pos => {
          me.$emit('scroll', pos)
        })
      }
      // 是否派发滚动到底部事件,用于上拉加载
      if (this.pullup) {
        this.scroll.on('scrollEnd', () => {
          // 滚动到底部
          if (this.scroll.y  {
          // 下拉动作
          if (pos.y > 50) {
            this.$emit('pulldown')
          }
        })
      }
      // 是否派发列表滚动开始的事件
      if (this.beforeScroll) {
        this.scroll.on('beforeScrollStart', () => {
          this.$emit('beforeScroll')
        })
      }
    },
    disable () {
      // 代理better-scroll的disable方法
      this.scroll && this.scroll.disable()
    },
    enable () {
      // 代理better-scroll的enable方法
      this.scroll && this.scroll.enable()
    },
    refresh () {
      // 代理better-scroll的refresh方法
      this.scroll && this.scroll.refresh()
    },
    scrollTo () {
      // 代理better-scroll的scrollTo方法
      this.scroll && this.scroll.scrollTo.apply(this.scroll, arguments)
    },
    scrollToElement () {
      // 代理better-scroll的scrollToElement方法
      this.scroll && this.scroll.scrollToElement.apply(this.scroll, arguments)
    }
  }
}
.scroll {
  overflow: hidden;
}

使用的例子都在上面的代码里面了,如果你有很多地方需要使用到这个组件,你可以在main.js里面全局使用这个组件

import scroll from 'components/Scroll.vue'
Vue.component('scroll', scroll)

最后按照代码的方法使用这个组件,就能够很完美的解决页面上拉下拉出现滑动的问题。


作者:前端李小白


阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-移动开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯