vue3滚动条scroll监听事件无效和scrollTop一直为0的问题

滚动条监听事件无效

如果你已经尝试过很多种方法,可以直接跳转结论查看可能有用的方法,虽然过程有些不清不楚的

问题的背景

整体的组件框架如下,使用了<el-container>滚动条位置为0的坑可能就是这个导致的

<div>
	<!-- 注意这里的el-container -->
	<el-container>
		<el-main/>
		....其他组件
	</el-container>
<div>

然后el-main组件中就是主要页面的组件,也是当前我想添加滚动条监听的页面

<div>
	<div>标题</div>
	<!-- 下面是elplus的无限滚动组件 -->
	<el-Infinite-Scroll/>
</div>
<script>
	//在此处添加页面的监听事件
</script>

问题的发生:

当前页面是有滚动条的,我想在当前页面添加一个滚动条的监听,然后发现监听事件都不能触发, 当我滚动的页面的时候没有滚动事件,搜过其他的方法,包括使用window.addEventListener()并填写该方法的第三个参数,重启服务,而其他的例如click事件没有问题。问了很多人和Ai都没能解决,滚动事件根本就不触发。

问题的原因:

滚动事件不触发的原因是因为滚动条属于父组件 而不是你当前的页面。我在main组件中监听滚动条滚动是无效的,因为当前滚动条是属于上一层的<el-main/>,也就是父组件。(但奇怪的是,可能是因为我中途去吃饭,顺手把电脑睡眠了一下,印象中后面再次编写的时候,回到子组件好像也能监听到了,不清楚,很玄学)

新的问题:scrollTop的位置一直为0

滚动条的位置输出一直为0,这个问题也是尝试了半天,使用下面的兼容语句取值也没用,一直输出为0

const scrollY = document.documentElement.scrollTop || document.body.scrollTop || window.pageYOffset;

弄了半天,最后把代码重写了一下发现<el-container>导致的, 不要使用这个组件,你猜怎么着,好了。可以输出正确的位置了。


结论

滚动监听事件不生效

有几种可能的原因,我建议一个个来尝试,其他答案基本也是这些了

  1. addEventListener不止有两个参数。尝试输入第三个参数为true
    在这里插入图片描述
  1. 你这个页面的滚动条是属于你当前的组件,还是属于父组件的,如果属于父组件,那当然子组件不会触发滚动事件

    参考文章(这两个建议都看看):csdn,掘图

    在这里插入图片描述

  1. 检查你的父组件以及当前的组件的css样式中的overflow属性是否为auto,有人说添加这个才能监听,有人说添加了就不能监听

    添加监听的文章:segmentfault.com/q/1010000009119633

  2. 是否使用了elementPlus等UI组件(例如el-container,有可能是组件内部的样式问题,不使用封装的组件能否触发滚动事件?能,组件的问题,不能,请参考2)

  3. 关软件重开,关机重启(烧香,烧香是假的,重启是真的)

scrollTop==0?
  1. 可能是浏览器兼容的问题,使用这个语句来获取位置

    const scrollY = document.documentElement.scrollTop || document.body.scrollTop || window.pageYOffset;

  2. 是否使用了elementPlus等UI组件,例如el-container,有可能是组件内部的样式问题,不使用封装的组件能否触发滚动事件?能:组件的问题,不能:参考3

  3. 继续搜吧,或请教大牛,亦或是重写吧,

    参考文章(这两个建议都看看):csdn,掘图

Vue 3 中使用 `vue3-seamless-scroll` 插件监听滚动事件可以通过自定义属性事件绑定来实现。以下是详细的说明: ### 实现方式 #### 1. 安装插件 首先需要安装该插件并将其引入到项目中: ```bash npm install vue3-seamless-scroll --save ``` 随后,在项目的入口文件(通常是 `main.js` 或类似的初始化脚本)中全局注册此插件: ```javascript import { createApp } from &#39;vue&#39;; import App from &#39;./App.vue&#39;; import vue3SeamlessScroll from &#39;vue3-seamless-scroll&#39;; const app = createApp(App); app.use(vue3SeamlessScroll); app.mount(&#39;#app&#39;); ``` 以上操作确保了整个应用都可以访问 `vue3-seamless-scroll` 的功能[^3]。 #### 2. 自定义滚动事件处理逻辑 为了监听滚动事件,可以在 `<vue3-seamless-scroll>` 组件上绑定原生 DOM 事件或者利用其内置的 API 来捕获滚动状态的变化。具体来说,可以尝试以下两种方法之一: ##### 方法一:通过 ref 获取组件实例 如果希望更灵活地控制滚动行为,则可以直接获取组件实例并通过其实例方法或暴露的数据进行交互。例如: ```html <template> <div> <vue3-seamless-scroll :list="scrollList" @on-scroll="handleScroll"> <!-- 列表项 --> <div v-for="(item, index) in scrollList" :key="index">{{ item }}</div> </vue3-seamless-scroll> </div> </template> <script> export default { data() { return { scrollList: [&#39;Item 1&#39;, &#39;Item 2&#39;, &#39;Item 3&#39;], }; }, methods: { handleScroll(event) { console.log(&#39;当前滚动位置:&#39;, event.target.scrollTop); // 输出滚动条的位置 } } }; </script> ``` 这里假设 `@on-scroll` 是由插件支持的一个自定义事件名称;如果没有这样的默认机制,则可能需要手动触发它[^4]。 ##### 方法二:扩展原有组件以增加新特性 当现有接口不足以满足需求时,还可以考虑继承原始组件类并添加额外的功能。比如创建一个新的封装版本如下所示: ```typescript // MyCustomScroll.ts import { defineComponent } from &#39;vue&#39;; import { Vue3SeamlessScroll } from &#39;vue3-seamless-scroll&#39;; export default defineComponent({ extends: Vue3SeamlessScroll, emits: [&#39;custom-event&#39;], // 新增发射器声明 mounted() { this.$el.addEventListener(&#39;scroll&#39;, () => { const scrollTopValue = this.$el.scrollTop; this.$emit(&#39;custom-event&#39;, scrollTopValue); // 向外发送数据 }); }, beforeUnmount() { if (this.$el && typeof this.$el.removeEventListener === &#39;function&#39;) { this.$el.removeEventListener(&#39;scroll&#39;, null as any); } } }); ``` 之后就可以像平常一样导入这个新的组件并在模板里正常使用了。 #### 注意事项 尽管上述例子展示了如何捕捉基本的滚动信息,但在实际开发过程中还需要注意性能优化以及跨浏览器兼容性等问题。另外,请确认所使用的库确实提供了相应的钩子函数或开放足够的权限让我们能够介入内部运作流程[^1]。 ```python print("Example Code Block") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值