vue 中监听document.body.scrollTop 值总为0的解决方法

// 基础资料
网页正文全文高: document.body.scrollHeight;
网页被卷去的高: document.body.scrollTop;
scrollTop 设置或获取位于对象最顶端和窗口中可见内容的最顶端之间的距离
offsetHeight 获取对象相对于版面或由父坐标 offsetParent 属性指定的父坐标的高度

最近在vue项目中碰到了这个问题,监听页面滚动时 document.body.scrollTop一直都是0,捣鼓了好久最后找到了几个解决方法

方法一:浏览器兼容有问题

写个兼容方法就行

// chrome || firefox  || IE:  
// document.documentElement.scrollTop  document.body.scrollTop 
// safari: window.pageYOffset
let scrollTop= document.documentElement.scrollTop || document.body.scrollTop || window.pageYOffset

方法二:scrollTop的值只有在app.vue页面才可以获取到

① 使用$refs方法获取页面实例

	<template>
	  <div id="app" ref="box">
	    <router-view keep-alive></router-view>
	  </div>
	</template>
	<script>
	export default {
		mounted(){
			var el_ = this.$refs.box;
			that.$store.state.el_   = el_;			
		},
	};
	</script>	

② 在store.js页面存储app.vue页面实例

import Vue from 'vue'
import Vuex from 'vuex'
import mutations from "./mutations"
import actions from "./actions"
import getters from "./getters"
Vue.use(Vuex)

const state = {
    el_:'',   // app.vue页面实例
    
    ......
}
export default new Vuex.Store({
    state,
    mutations,
    actions,
    getters
})

③ 在需要的页面调用该实例获取或修改scrollTop的值

methods: {
	scrollTopFun(){
		// 获取scrollTop值
		console.log(this.$store.state.el_.scrollTop)
		// 修改scrollTop值
		this.$store.state.el_.scrollTop = 500 ;
	}
}

方法三:在app.vue页面监听滚动条

  mounted() {
    window.addEventListener('scroll',this.handleScroll,true)
  },
  methods: {
	  handleScroll (e) {
	      let scrollTop =  e.target.scrollTop;
	      console.log(scrollTop,'距离顶部的距离')
	    }
  },

ok解决完成,亲测有效。

  • 8
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
Vue3,可以通过监听页面滚动事件来实现监听页面向上滚动。具体实现方法如下: 1. 在mounted()生命周期函数,使用window.addEventListener()方法监听页面滚动事件,将事件处理函数设置为this.scrolling。 2. 在methods对象定义scrolling()方法,该方法会在页面滚动时被调用。在该方法,可以获取滚动条距文档顶部的距离scrollTop,以及滚动条滚动的距离scrollStep。 3. 根据scrollStep的正负,可以判断页面是向上滚动还是向下滚动。 4. 可以使用变量windowHeight获取可视区的高度,使用变量scrollHeight获取滚动条的总高度。当scrollTop + windowHeight等于scrollHeight时,说明页面已经滚动到了底部。 5. 在beforeDestroy()生命周期函数,使用window.removeEventListener()方法移除页面滚动事件的监听。 下面是一个示例代码,用于监听页面向上滚动: mounted() { window.addEventListener("scroll", this.scrolling); }, methods: { scrolling() { let scrollTop = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop; let scrollStep = scrollTop - this.oldScrollTop; console.log("页面滚动距离 ", scrollTop); this.oldScrollTop = scrollTop; let windowHeight = document.documentElement.clientHeight || document.body.clientHeight; let scrollHeight = document.documentElement.scrollHeight || document.body.scrollHeight; if (scrollTop + windowHeight == scrollHeight) { console.log("你已经到底部了"); } if (scrollStep < 0) { console.log("页面向上滚动了!"); } else { console.log("页面向下滚动了!"); } if (scrollTop <= 0) { console.log("到了最顶部") } }, }, beforeDestroy() { window.removeEventListener("scroll", this.scrolling); },
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值