vue+elementUi获取滚动条位置、判断是否存在滚动条、addEventListener、removeEventListener、document、window、scroll、client

这篇具有很好参考价值的文章主要介绍了vue+elementUi获取滚动条位置、判断是否存在滚动条、addEventListener、removeEventListener、document、window、scroll、client。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


1、vue2获取滚动条位置

document方式

export default {
	name: "demo",
	data() {
		return {
			scrollTopVal: 0,
			isScroll: 0
		};
	},
	mounted() {
		this.$nextTick(() => {
			// 开启滚动条监听
			document.addEventListener("scroll", this.scrollTop, true);
			
			let elVal = document.getElementsByClassName('el-drawer__body')[0];
			this.isScroll = elVal.scrollHeight > elVal.clientHeight;
		});
	},
	beforeDestroy() {
		document.removeEventListener('scroll', this.scrollTop, true);
	},
	
	methods: {
		scrollTop() {
			let elVal = document.getElementsByClassName('el-drawer__body')[0];
			this.scrollTopVal = elVal.scrollTop;
		}
	}
};

window方式

export default {
	name: "demo",
	data() {
		return {
			scrollTopVal: 0,
			isScroll: 0
		};
	},
	mounted() {
		this.$nextTick(() => {
			// 开启滚动条监听
			window.addEventListener("scroll", this.scrollTop, true);
			
			let elVal = document.documentElement.scrollTop || document.body.scrollTop || window.pageYOffset;
			this.isScroll = elVal.scrollHeight > elVal.clientHeight;
		});
	},
	beforeDestroy() {
		window.removeEventListener('scroll', this.scrollTop, true);
	},

	methods: {
		scrollTop() {
			let elVal = document.documentElement.scrollTop || document.body.scrollTop || window.pageYOffset;
			this.scrollTopVal = elVal.scrollTop;
		},
	}
};

2、vue3获取滚动条位置

公共部分

import { nextTick, ref, onMounted, onBeforeUnmount } from "vue";

let scrollTopVal = ref<number>(0);
let isScroll = ref<boolean>(false);

document方式

onMounted(() => {
	// 监听滚动条位置
	document.addEventListener("scroll", scrollTop, true);
	
	// 设置对应元素的滚动条
	let elVal: any = document.getElementsByClassName('el-drawer__body')[0];
	// 判断是否存在滚动条
	isScroll.value = elVal.scrollHeight > elVal.clientHeight;
});

// 实时滚动条高度
const scrollTop = () => {
	nextTick(() => {
		let elVal: any = document.getElementsByClassName('el-drawer__body')[0];
		scrollTopVal.value = elVal.scrollTop;
	});
};

onBeforeUnmount(() => {
	// 参数必须和挂载时保持一致
	document.removeEventListener('scroll', scrollTop, true);
});

window方式

onMounted(() => {
	// 监听滚动条位置
	window.addEventListener('scroll', scrollTop, true);
	
	let elVal: any = document.documentElement.scrollTop || document.body.scrollTop || window.pageYOffset;
	isScroll.value = elVal.scrollHeight > elVal.clientHeight;
});

// 实时滚动条高度
const scrollTop = () => {
	nextTick(() => {
		let elVal: any = document.documentElement.scrollTop || document.body.scrollTop || window.pageYOffset;
		scrollTopVal.value = elVal.scrollTop;
	});
};

onBeforeUnmount(() => {
	// 参数必须和挂载时保持一致
	window.removeEventListener('scroll', scrollTop, true);
});

3、解析

1、获取指定元素的滚动条值。在elementUi组件中需要通过class获取,因为id是动态值。
2、使用window方式时,只能检测到body或页面窗口的滚动条。然而对于elementUi的弹窗等组件获取到的滚动条值为0
3、addEventListener第三个参数表示深度监听,在某些场景如果不设置第三个参数值为true,可能监听不到对应的事件。
4、addEventListener第二个参数需要一个函数值,可以直接以函数的形式写在里面,但是不推荐这样写。
5、addEventListener第一个参数便是对应的事件名称,有滚动事件和鼠标事件等其他事件。
6、必须销毁scroll事件,因为是vue是单页面应用,如果不销毁,离开该页面后事件依然会存在,影响浏览器的性能,并且在vue3中直接报错。所以在离开此页面之前应该销毁全局监听事件,可以在组件销毁之前销毁全局监听事件。


4、判断是否存在滚动条

判断是否存在滚动条的需求,在弹窗插件中使用得较多。因为弹窗大多会添加overflow: hidden;属性,如果页面超过一屏的话,添加这个属性之后页面会有晃动。
为了增强用户体验,通过判断是否有滚动条而添加margin-left属性以抵消overflow: hidden;之后的滚动条位置。


判断竖向滚动条

console.log(el.scrollHeight > el.clientHeight);

判断横向滚动条

console.log(el.scrollWidth > el.clientWidth);

特殊情况

当元素指定overflow: hidden;时,不会出现滚动条。所以需要对元素是否应用了overflow: hidden;进行判断。

function hasScrolled(ele, dir = "vertical") {
  // 判断的方向是否设置了overflow: hidden;
  let style = window.getComputedStyle(ele);
  if (
    (dir == "vertical" && style.overflowY == "hidden") ||
    (dir == "horizontal" && style.overflowX == "hidden")
  )
    return false;

  // 在判断完overflow不为hidden后,再通过两个属性来判断。
  if (dir == "vertical") {
    return ele.scrollHeight > ele.clientHeight;
  } else {
    return ele.scrollWidth > ele.clientWidth;
  }
}

但是,以上的方法不严谨,当容器产生外边距合并的时候,也是ele.scrollWidth > ele.clientWidth


<div class="box">
	<h1>子元素内部内容</h1>
</div>

let box = document.querySelector(".box");

// scrollHeight: 63
console.log("scrollHeight: " + box.scrollHeight);
// clientHeight: 42
console.log("clientHeight: " + box.clientHeight);
// 是否有滚动条: true
console.log("是否有滚动条: ", box.scrollHeight > box.clientHeight);

特殊情况较完美的处理方式

function hasScrolled(ele, dir = "vertical") {
	let eleScroll = dir == "vertical" ? "scrollTop" : "scrollLeft";
	
	// 判断scroll数值是否为0,还是其他值
	let result = !!ele[eleScroll];
	// 如果是其他数值(非0)这表示有滚动条
	// 如果是0,则尝试移动一下滚动条,判断是否能够移动
	if (!result) {
		// 尝试移动滚动条
		ele[eleScroll] = 1;
		// 再次确认数值
		result = !!ele[eleScroll];
		// 恢复原位
		ele[eleScroll] = 0;
	}
	
	// 得出结果
	return result; 
}

计算滚动条宽度的方法

因为移动端浏览器的滚动条都是不占据页面宽度的透明样式,所以为了进一步增强用户体验,我们还需要计算滚动条的宽度,根据情况添加合理的margin-left值。
新建一个带有滚动条的div元素,再计算该元素offsetWidthclientWidth的差值。
文章来源地址https://www.toymoban.com/news/detail-640041.html

function getScrollbarWidth() {
	let scrollDiv = document.createElement("div");
	scrollDiv.style.cssText = "width: 99px; height: 99px; overflow: scroll; position: absolute; top: -9999px;";
	document.body.appendChild(scrollDiv);
	let scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth;
	document.body.removeChild(scrollDiv);
	
	return scrollbarWidth;
}

到了这里,关于vue+elementUi获取滚动条位置、判断是否存在滚动条、addEventListener、removeEventListener、document、window、scroll、client的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • RestHighLevelClient 判断索引是否存在

    2024年01月24日
    浏览(69)
  • selenium 判断元素是否存在

    目的:自动化中通常需要根据元素是否存在,来决定下一步的动作;比如 A存在就点击 下一步,B存在就点击保存;用于控制脚本的逻辑; selenium中判断元素有几种方式 1、find_element(locateType, locate) 2、WebDriverWait(self.driver, 20, 0.5).until(EC.presence_of_element_located((locateType, locate))) 那么

    2024年01月20日
    浏览(68)
  • 【ElasticSearch】判断该索引是否存在

    es7.10

    2024年02月17日
    浏览(57)
  • Python如何判断变量是否存在?

    python中可以使用locals()、dir()、vars()等函数来查询变量是否存在。 1、 locals() 函数将当前位置的所有局部变量作为字典返回。 2、当 dir() 函数不带参数时,它返回当前范围内的变量、方法和定义类型的列表;当它接受参数时,它返回参数的属性和方法列表。 3、vars() 函数返回对

    2024年02月11日
    浏览(64)
  • vue elementui 组合式 api 对于容器的滑动条的位置的获取与设置。切换页面可以保持原来的容器里的滑动条位置不变

    需要使用 addEventListener 的方法获取滑动条的位置 xxx.vue 页面是一直缓存的,所以使用路由进入钩子(onActivated)设置滑动条的位置 App.vue: xxx.vue

    2024年02月09日
    浏览(67)
  • js中判断一个对象是否存在

    一、Boolean()方法 用Boolean()方法可以将Js中的任意数据类型转为布尔值: 二、用于判断xx是否存在 js一般会自动执行Boolean()方法,我们可以借此判断某个对象在js当前的执行环境中知否存在。如: 又如,可以判断当前环境下某个对象是否存在。 在为一个元素绑定了某个事件后,

    2024年02月13日
    浏览(60)
  • pyspark 判断 Hive 表是否存在

    pyspark.sql.Catalog.tableExists

    2024年02月14日
    浏览(44)
  • Java如何判断某文件目录是否存在

    在java中如何判断某文件所在的目录是否存在,若不存在创建目录 可以通过国使用 File 类的 getParentFile() 方法来获取文件所在的目录,并通过 exists() 方法来判断该目录是否存在,若不存在,通过 mkdirs() 方法创建目录,以下为实例 或直接简写

    2024年02月12日
    浏览(85)
  • windows11--判断文件夹是否存在

    不想全盘检索,只是想判断当前文件夹下,是否存在名为xxx的子文件夹 打开你要进行搜索的文件夹 点击上面的地址栏,输入cmd,按下回车键,进入cmd 界面 输入 dir /b | find \\\"xxx文件名\\\" (补充:输入 dir /b\\\" 可列出所有子文件的名字) 如果xxx文件存在,则返回xxx 如果xxx文件不存

    2024年01月21日
    浏览(78)
  • redis中使用bloomfilter判断元素是否存在

    由一个初始值为0的bit数组组成,和多个hash函数构成,用来判断集合中是否存在某个元素。 一个很长的二进制数组(00000000)+一系列随机hash算法映射函数。主要用于判断一个元素是否存在集合中。 本质:判断一个数据是否存在一个大的集合中。有,可能有,无则一定没有 一

    2024年02月15日
    浏览(120)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包