js 计算滚动距离遇到滚动钱获取div节点位置与滚动后第二次获取不一致问题
2021-06-08 20:04
0
478
js 计算滚动距离遇到滚动钱获取div节点位置与滚动后第二次获取不一致问题
前言
最近遇到vue的一个奇葩需求,就是输入某个编号,滚动到对应div的位置上去,这让我想起了18年做的一个类似的项目,也是在vue里面,他们的需求更奇葩要求搜索当前阅读的文章里面的某个关键字,并且高亮,然后滚动到对应的位置。很相似对不对?于是将代码辅助过来一顿操作,果然基础功能实现了,当我准备甩手下班的时候发现问题了,那就是搜索屏幕外的某个编号就裂了。它滚动的位置比我预想的要多。于是又各自炒作最后无解。但是在我反复测试的时候我发现一个突破口,那就是当第一次搜索滚动后再执行一次搜索它的距离是正确的。emm这效果,简直了。在其他方法都无效果的同时,我还是使用了这种曲线救国的方法。嗯效果还勉强过得去。下面把代码分享出来供大家参考,也作为自己的一个备忘。
下面是vue代码
offsetTop(elements) {
var top = elements.offsetTop;
var parent = elements.offsetParent;
while (parent != null) {
top += parent.offsetTop;
parent = parent.offsetParent;
}
return top;
},
search_object() {
// 判断是否为纯数字,校验通过返回true
function isIntNum(val) {
var reg = /^\d{1,}$/;
var pattern = new RegExp(reg);
return pattern.test(val);
}
if (!isIntNum(this.search_val)) {
this.$toast({
message: "编号必须为纯数字!",
position: "bottom",
});
return;
}
if ($(".object_" + this.search_val).length > 0) {
var searchText2 = document.getElementsByClassName(
"object_" + this.search_val
)[0];
var context_top = this.offsetTop(searchText2);
var context_top2 = context_top;
$(".vue_page_content").scrollTop(context_top - 94);
// 很奇怪 第一次获取的位置不对,滚动后第二次获取的是正确的,所以这里执行2次
var i = 0;
var interval = setInterval(() => {
i++;
if (i > 10000 || (context_top2 != context_top && context_top2 > 0)) {
console.log(i, context_top2, context_top);
$(".vue_page_content").scrollTop(context_top2 - 94);
clearInterval(interval);
} else {
context_top2 = this.offsetTop(searchText2);
}
}, 1);
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
你还未登录,请登录后留言