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

针对微信浏览器ios页面上下拉出现空白的问题,通过在app.vue的mounted阶段设置禁用原生滚动,然后使用BetterScroll替代,实现页面滑动功能。详细介绍了如何封装和使用BetterScroll组件,确保在ios和Android设备上的良好滑动体验。此外,还提及了一种可能的底部导航导致滚动问题的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

1.首先在app.vue的mounted中添加如下代码

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

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

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

npm install better-scroll

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

<!--
    参数解释在props中
    使用说明:
      <scroll
      class="wrapper"
      :data="data"
    >
      <div class="content">
      </div>
    </scroll>

    要想betterScroll产生滚动效果,你需要设置'.wrapper'的高度,content的内容高度必须要高于warpper的高度才会显示出滚动条
    如果content里面内容的高度是不固定的,那么需要给scroll传值data
-->
<template>
  <div ref="scrollContainer" class="scroll-container">
    <slot />
  </div>
</template>

<script>
import BScroll from 'better-scroll'
export default {
   
  props: {
   
    /**
     *  传1 滚动的时候会派发scroll事件,会截流
     *  传2 滚动的时候实时派发scroll事件,不会截流。
     *  传3 除了实时派发scroll事件,在swipe的情况下仍然能实时派发scroll事件
     */
    probeType: {
   
      type: Number,
      default: 1
    },
    /** 点击列表是否派发click事件 */
    click: {
   
      type: Boolean,
      default: true
    },
    /** 是否开启横向滚动 */
    scrollX: {
   
      type: Boolean,
      default: false
    },
    /** 是否开启纵向滚动 */
    scrollY: {
   
      type: Boolean,
      
<think>好的,我现在要帮用户解决在uniapp中view标签的@scroll方法获取到当前滚动距离的问题。首先,我需要回顾一下用户之前的问题,他之前问过关于@scroll判断是否滑动到顶部的问题,现在在uniapp中遇到了类似的问题,但具体是获取滚动距离。 首先,我应该考虑uniapp和普通web开发的区别。uniapp是基于Vue的跨平台框架,可能会对事件处理有一些封装或者限制。用户提到使用@scroll方法,但获取滚动距离,可能原因有几个方面: 1. **事件对象差异**:在普通web开发中,滚动事件的event对象包含target,但在uniapp中可能有所同,特别是如果运行在小程序或APP环境下,事件对象的结构可能同。 2. **滚动元素未正确设置**:在web中,滚动容器需要有固定的高度和overflow: auto/scroll,uniapp中可能需要类似的设置,否则滚动事件会触发。 3. **平台兼容性问题**:uniapp编译到同平台(如微信小程序、H5),事件处理可能有差异,需要确认用户的目标平台。 接下来,我应该回忆uniapp的文档,查看view组件scroll事件相关说明。view组件在uniapp中默认是滚动的,必须设置scroll-y或scroll-x为true,且需要固定高度。如果用户没有正确设置这些属性,scroll事件可能会触发,或者事件对象中没有正确的滚动距离信息。 另外,在H5环境下,view组件可能被渲染为div,而在小程序中可能使用原生组件,事件参数可能同。例如,在小程序中,滚动事件可能返回的是detail对象,而是event.target.scrollTop,所以需要用户通过event.detail.scrollTop来获取。 还有可能用户没有正确绑定事件处理函数,或者使用了错误的属性名。例如,在vue模板中,@scroll应该对应到方法,而方法中需要正确访问事件参数。 可能的解决方案包括: - 检查view组件的样式是否正确,确保有固定高度和滚动属性。 - 在事件处理函数中输出event对象,查看具体结构,确认scrollTop的位置。 - 针对同平台做兼容处理,比如在H5和小程序中使用同的方式获取scrollTop。 此外,用户可能在真机调试遇到问题,因为部分属性在开发工具和真机上的表现可能同,比如iOSAndroid滚动行为差异,或者某些CSS属性影响滚动事件的触发。 还需要考虑是否在scroll-view组件使用scroll-top属性绑定,如果双向绑定可能会导致冲突,或者需要手动同步状态。 总结下来,用户的问题可能出在组件的样式设置、事件对象的结构差异或平台兼容性处理上。需要逐步引导用户检查这些方面,提供相应的代码示例和调试方法。</think>在 UniApp 中 `view` 组件使用 `@scroll` 事件无法直接获取滚动距离的问题,通常由以下原因及解决方案构成: --- ### 一、核心问题原因 1. **组件特性差异** UniApp 的 `view` 组件本质是**非滚动容器**,其 `@scroll` 事件默认会触发。若需要监听滚动,必须改用 `scroll-view` 组件。 2. **事件参数结构差异** `scroll-view` 的滚动事件返回参数格式为 `event.detail`,而非浏览器原生的 `event.target.scrollTop`。 --- ### 二、正确实现方案 #### 步骤 1 - 使用 `scroll-view` 组件 ```html <scroll-view scroll-y :style="{height: '300px'}" @scroll="handleScroll" > <!-- 滚动内容 --> </scroll-view> ``` - **关键配置**: - `scroll-y`:启用纵向滚动(或 `scroll-x` 横向滚动) - **必须设置固定高度**(否则滚动容器无法生效) --- #### 步骤 2 - 获取滚动距离 ```javascript export default { methods: { handleScroll(event) { // 正确获取滚动距离的方式 const scrollTop = event.detail.scrollTop; console.log('当前滚动距离:', scrollTop); } } } ``` - **注意**:返回值类型为 `Number`,单位为 `px` --- ### 三、常见问题排查 #### 问题 1:滚动事件未触发 - **原因**:未正确设置容器高度或滚动方向 - **解决**: ```html <scroll-view scroll-y :style="{height: '100vh'}"> <!-- 确保内容高度超出容器高度 --> </scroll-view> ``` #### 问题 2:返回值始终为 0 - **原因**:跨平台兼容性问题(如 iOS 弹性滚动) - **解决**:添加滚动惯性抑制 ```html <scroll-view scroll-y :scroll-with-animation="false"> ``` --- ### 四、扩展功能实现 #### 判断是否到达顶部/底部 ```javascript handleScroll(event) { const scrollTop = event.detail.scrollTop; const scrollHeight = event.detail.scrollHeight; // 内容总高度 const clientHeight = this.$refs.scrollView.$el.clientHeight; // 容器可视高度 // 到达顶部 if (scrollTop <= 0) { console.log('已滚动到顶部'); } // 到达底部(需考虑精度误差) if (scrollHeight - (scrollTop + clientHeight) < 1) { console.log('已滚动到底部'); } } ``` --- ### 五、平台兼容性注意 | 平台 | 特性 | |-----------|----------------------------------------------------------------------| | **H5** | 表现与浏览器一致,支持原生滚动事件 | | **小程序**| 需使用 `scroll-view`,部分机型存在惯性滚动误差 | | **App** | 推荐启用 `enhanced` 属性优化性能:`<scroll-view enhanced scroll-y>` | --- 通过以上方案可准确获取滚动距离,若需更复杂滚动监听,可结合 `uni.createSelectorQuery()` 手动获取节点信息。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值