刘帅的个人博客
刘帅的个人博客
About Me:
我是刘帅,(曾用网名:偻儸小卒、会PS的小码农、爱折腾的小码农、Edison Liu),来自酉州桃花源,重庆市酉阳县可大乡。是一枚真正会修电脑的程序员,也是一个在编程的路上越走越远的设计师,曾编写过一个叫“锟斤拷”的项目,也曾设计过一张叫“五彩斑斓的黑”的设计稿。我的个人博客采用ginblog_nuxt编写使用ginblog改写有兴趣或者申请免费友情链接的朋友可以加我QQ我们一起交流学习。
747357766
EdisonLiu_
747357766@qq.com
js 计算滚动距离遇到滚动钱获取div节点位置与滚动后第二次获取不一致问题
2021-06-08 20:04
0
99

前言

最近遇到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