vue+element实现双向描点 反向联动

2023-11-15

   前端项目里经常会有锚点得操作、以及反向联动的效果

   就是一个菜单,点击会定位到一个块上,滚动的当前块的时候,菜单会出现定位的效果

 

 

差不多就是这种动起来的效果,由于不太懂之前的逻辑,今天又从重新看了下

上代码

 

html:

-----滚动的区域----------
<el-row class="panel-box part-detail" id="partdetail" :class="navClass">
--------菜单
     <ul class="nav-list">
        <li
          :class="{ current: item.value === navCurrent }"
          v-for="item in navList"
          :key="item.value"
          @click="linkTo(item.value)"
        >{{item.label}}</li>
      </ul>


---------------对应显示区域  注意id和class 后边要用
        <h5 id="scene" class="do-jump">
          应用场景
          <p class="detail-content">{{ algorithmData.brief }}</p>
        </h5>

       <h5 id="word" class="do-jump">
          使用文档
          <ul
            v-if="algorithmData.fileList && algorithmData.fileList.length > 0"
            class="detail-content"
          >
        </h5>

        <h5 id="explain" class="do-jump">
          使用说明
          <div class="detail-content">交付方式:{{ algorithmData.instruction.deliveryType }}</div>
        </h5>


</el-row>

vuejs:

 data() {
    return {
      imageLocalUrl,
      navClass: '',
      navList: [
        {
          value: 'scene',
          label: '应用场景'
        },
        {
          value: 'word',
          label: '使用文档'
        },
        {
          value: 'explain',
          label: '使用说明'
        }
      ],
      navCurrent: 'scene',
      typeMap: {},
      algorithmData: {
        instruction: {}
      },
      scrollBox: '',
      scrollFalg: true
    }
  },

---------加入监听事件

  mounted() {
    window.addEventListener('scroll', this.scrollPage)
  },

  activated() {
    window.addEventListener('scroll', this.scrollPage)
  },

  methods: {
   ------------锚点事件
   linkTo(id) {
      //点击时传值id
      this.navCurrent = id
      const el = document.querySelector(`#${id}`)
      this.$nextTick(function() {
        window.scrollTo({ 'behavior': 'smooth', 'top':el && el.offsetTop })
      })
    },

   --------------反向联动
     scrollPage() {

   ----------菜单控制样式
      if (document.querySelector('#partdetail').getBoundingClientRect().top <= 0) {
        this.navClass = 'fix-nav'
      } else {
        this.navClass = ''
      }
      /**
       * 反向联动
       */

      //获取所有锚点元素的高,并放在obj对象里     class用上了
      const navContents = document.querySelectorAll('.do-jump')
      const offsetTopArr = []
      let temp = {}
      for (let i = 0; i < navContents.length; i++) {
        const e = navContents[i]
        let temp = {
          offsetTop: e.offsetTop,
          id: e.id
        }
        offsetTopArr.push(temp)
      }
      // 获取当前文档流的滚动位置的高度 scrollTop
      const scrollTop = document.documentElement.scrollTop || document.body.scrollTop
      const domPosition = document.documentElement.scrollTop
      //console.log("滚动时当前dom:"+domPosition)
      // 定义当前点亮的导航下标
      let navIndex = 'scene'
      for (let n = 0; n < offsetTopArr.length; n++) {
        // 如果 scrollTop 大于等于第 n 个元素的 offsetTop 则说明 n-1 的内容已经完全不可见
        // 那么此时导航索引就应该是 n 了
        if (scrollTop >= offsetTopArr[n].offsetTop) {
          navIndex = offsetTopArr[n].id
        }
      }
      this.navCurrent = navIndex
      console.log('滚动到的菜单:' + this.navCurrent)
      //this.linkTo(navIndex)
      console.log('navIndex:' + navIndex + '########')
    }
  },

},
 deactivated() {
    window.removeEventListener('scroll', this.scrollPage)
  },
  destroyed() {
    window.removeEventListener('scroll', this.scrollPage)
  }


css:

.part-detail {
  margin-top: 15px;
  padding: 0;
  .nav-list {
    display: flex;
    border-bottom: 1px solid #ededed;
    font-size: 16px;
    margin: 0;
    li {
      padding: 16px 0;
      margin: 0 16px;
      cursor: pointer;
      &:first-child {
        margin-left: 46px;
      }
      &.current {
        color: #ff6400;
        border-bottom: 3px solid #ff6400;
      }
    }
  }
  &.fix-nav {
    padding-top: 54px;
    //color: red;
    .nav-list {
      position: fixed;
      background: #fff;
      top: 0;
      float: right;
      z-index: 5;
      left: 140px;
      right: 140px;
    }
  }
}

代码已基本如此

思路:

每一个区域加上相同的calss,滚动的时候获取距离,

得到菜单对应的下标(id)和距离上部元素的高度,便于滚动

得到当前滚动的高度和内容块的距离做比较,大于则菜单变动,出现效果

后记:前端刚上手,还有很多不会的,借助修改bug的机会能学到更多,这个本来的效果时这种实现的

 // 锚点跳转

    // linkTo(id) {

    //   this.navCurrent = id

    //   this.scrollFalg=false

    //   console.log('当前点击的菜单:' + this.navCurrent)

    //   // 要移动的距离登录本身减去nav-list底部位置

    //   const jump = document.querySelector(`#${id}`).getBoundingClientRect().top - document.querySelector('.nav-list').offsetHeight

    //   // 获取当前dom位置

    //   const domPosition = document.documentElement.scrollTop

    //   //console.log("点击时当前dom:"+domPosition)

 

    //   let index = 0

    //   let moveTime = null

    //   clearInterval(moveTime)

    //   moveTime = setInterval(() => {

    //     if (++index === 50) {

    //       clearInterval(moveTime)

    //       return

    //     }

    //     // 每次移动1/50,50次移动完毕

    //     document.documentElement.scrollTop = domPosition + (jump / 50) * index

    //   }, 10)

    //    //this.scrollFalg=true

    // },

这样很好,直接锚点跳到当前内容顶部,效果很好,但是在监听滚动的时候,反向联动和点击事件或冲突,无奈修改了,定位不如之前的准,到那时反向的效果有了,也希望有人看到后指教一下

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vue+element实现双向描点 反向联动 的相关文章

随机推荐

  • 操作系统终端输入大小限制

    问题描述 使用c 写算法题时 测试用例是一个长字符串 上万字符 但运行结果显示字符串读入的长度远远小于输入长度 并且不同操作系统下面显示出了不同的bug macos 输入字符串长度只有1000 超过这个长度成都就会卡在cin那行代码 ubu
  • 裸片IC的简单介绍以及裸片IC的封装设计

    最近项目一直用到一种比较旧的PCB生产工艺 裸片IC 也就是绑定的工艺 1 什么是裸片IC 裸片既是在加工厂生产出来的芯片 即是晶圆经过切割测试后没有经过封装的芯片 大小一般在几毫米左右 边上有用于连接金属线的的焊盘或者小孔 金属线这是连接
  • 02rapidJson学习之数组的创建、遍历

    02rapidJson学习之数组的创建 遍历 概述 创建数组时我们需要注意以下内容 1 不能直接返回数组 我试过不行 因为数组必须依赖某一对象 即若我们不将数组添加到doc上 而直接返回数组是不行的 1 数组的创建 从doc中获取strin
  • Github 本地合并 (merge) 他人提交的 pr

    Github 上有些项目可能作者长时间没有进行维护 会出现有些新的 pr 没有合并到主分支 master 上 这时如果想在本地应用这个新的 pr 呢 一般来说主要有以下几种方式 针对提交的pr 查看具体的改动文件和改动内容 然后在本地进行对
  • git log 后一直出现:(冒号)的原因以及处理方法

    博客主页 https blog csdn net mukes 欢迎点赞 收藏 留言 如有错误敬请指正 本文由 mukes 原创 首发于 csdn 问题重现 在 git bash 中输入 git log 时出现 冒号 如下图所示 问题描述 一
  • Android酷炫实用的开源框架(UI框架)

    Android酷炫实用的开源框架 UI框架 前言 忙碌的工作终于可以停息一段时间了 最近突然有一个想法 就是自己写一个app 所以找了一些合适开源控件 这样更加省时 再此分享给大家 希望能对大家有帮助 此博文介绍的都是UI上面的框架 接下来
  • web初始

    个人学习开始 写的不好 请大佬指教
  • 机器学习实战——Kmeans聚类算法

    机器学习实战 Kmeans聚类算法 1 聚类算法介绍 1 1 K 均值聚类 1 2 聚类效果的评价 2 sklearn中的实现 1 聚类算法介绍 在无监督学习中 训练样本的标记是未知的 目标是通过对无标记训练样本的学习来揭示数据的内在性质及
  • 纷玩岛演唱会下单代码

    继大麦M端之后 再发现一个演唱会平台 纷玩岛 此平台不像大麦 猫眼那么火爆 相对来说比较容易研究 通过抓包软件发现下单很简单 就一个JWT登录后的头部token而已 下载地址 https download csdn net download
  • 结构体对函数指针的高级封装应用

    分层设计考虑 作用 降低对底层应用程序的高耦合度 示例 include mac h typedef struct phy t char channel char snd fail count char name char open flag
  • 软件测试用例覆盖率怎么算,如何计算增量测试覆盖率

    为了保证代码质量 一般会要求提交的源码要有测试用例覆盖 并对测试覆盖率有一定的要求 在实践中不仅会考核存量代码覆盖率 总体覆盖率 还会考核增量代码的覆盖率 或者说增量覆盖率更有实际意义 测试用例要随源码一并提交 实时保证源码的质量 而不是代
  • 进程和线程的区别,以及应用场景

    什么是线程 Linux下线程用进程PCB模拟描述 也叫轻量级进程 线程是进程内部的一个执行流 也就是线程在进程的地址空间内运行 一个进程内的所有线程共享进程资源 线程是CPU调度的基本单位 CPU调度是按照PCB进行调度的 创建 销毁一个线
  • Mule入门——DB、Rest、Soap接口开发

    一 DB查询接口开发 这里我用的mysql数据库 首先我们先查询下我们的数据库这里有很多数据 然后我们用AnypointStudio进行我们的接口开发 首先我们先新建一个Mule工程 File gt New gt Mule project
  • 计算机网络---传输层

    两个端的会话层之间提供建立 维护和取消传输连接的功能 这一层 数据传送的协议单元成为报文 网络层只是根据网络地址将源节点发出的数据包送到目的终点 而传输层负责将数据可靠的传送到相应的端口 传输层负责将上层数据分段提供端到端 可靠不可靠的传输
  • vue3-admin-template页面

    vue3 admin template 本人学习视频网址为 视频地址 源码 github 网页采用技术框架 本管理模板采用vue3开发 使用vue router来作为路由跳转 将登录成功后产生的菜单 token放入到vuex中存储 通过ax
  • 一般Python开发面试中可能会问到的大部分问题

    python语法以及其他基础部分 可变与不可变类型 浅拷贝与深拷贝的实现方式 区别 deepcopy如果你来设计 如何实现 new 与 init 的区别 你知道几种设计模式 编码和解码你了解过么 列表推导list comprehension
  • Linux嵌入式学习——c语言选择结构设计

    Linux嵌入式学习 c语言选择结构设计 一 if语句 1 1if语句的一般格式 1 2if语句常用的3种形式 1 3if语句的嵌套 二 关系运算符和关系表达式 2 1关系运算符及其优先次序 2 2关系表达式 三 逻辑运算符和逻辑表达式 3
  • @ControllerAdvice注解使用及原理探究

    最近在新项目的开发过程中 遇到了个问题 需要将一些异常的业务流程返回给前端 需要提供给前端不同的响应码 前端再在次基础上做提示语言的国际化适配 这些异常流程涉及业务层和控制层的各个地方 如果每个地方都写一些重复代码显得很冗余 然后查询解决方
  • PowerBI入门学习笔记

    下载安装 Win10系统 在微软商店里直接下载PowerBI desktop 打开即可 界面如下 接下来导入后面要用到的数据 我目前用的都是Excel文件 获取数据 选中后选择要导入的若干个工作表 点击 加载数据 就进入到power que
  • vue+element实现双向描点 反向联动

    前端项目里经常会有锚点得操作 以及反向联动的效果 就是一个菜单 点击会定位到一个块上 滚动的当前块的时候 菜单会出现定位的效果 差不多就是这种动起来的效果 由于不太懂之前的逻辑 今天又从重新看了下 上代码 html 滚动的区域