欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

vue 导航锚点_点击平滑滚动,导航栏对应变化详解

程序员文章站 2022-03-08 08:13:25
最终效果如下:(注意需要做锚点联动的部分并不在页面的顶部而是页面的某个div内)-chrome完成这个功能需要注意:1、点击导航平滑滚动到导航内容处2、div内滚动时当前导航需要做响应代码如下:1、h...

最终效果如下:(注意需要做锚点联动的部分并不在页面的顶部而是页面的某个div内)-chrome

vue 导航锚点_点击平滑滚动,导航栏对应变化详解

完成这个功能需要注意:

1、点击导航平滑滚动到导航内容处

2、div内滚动时当前导航需要做响应

代码如下:

1、html结构(因为从项目里截取代码,allmenulist数据内容就不贴出来了,不算难点,这个可以根据自己的项目进行调整,相应的方法和类名别弄错就行)

<div class="all-title">
    全部应用
    <p class="fr">
     <span v-for="(item, index) in allmenulist" :key="item.id" :class="[index===activemenu?'active':'']" @click="jump(index)">{{ item.name }}</span>
    </p>
   </div>
   <div id="scrollbox" class="applications-content">
    <div v-for="(val, index) in allmenulist" :key="val.id" class="all-list do-jump">
     <p class="applications-title">{{ val.name }}</p>
     <ul class="applications-list">
      <li v-for="item in val.children" :key="item.id" class="applications-item" @click="changerouterforright(item.pathname,item.menucode)">
       <img src="">
       <span>{{ item.name }}</span>
       <template v-if="showedit">
        <i v-if="addorremove(item.menucode)==0" class="el-icon-circle-plus add-btn" @click="addmenu(item.menucode)" />
        <i v-if="addorremove(item.menucode)==1" class="el-icon-remove remove-btn" @click="removemenu(item.menucode)" />
       </template>
      </li>
     </ul>
    </div>
   </div>

需要说明的数据:activemenu-当前导航序号,scrollbox-需要在里面滚动的元素即设为overflow-y:scroll的父元素div

2、点击导航平滑滚动的方法:jump(index)

// 跳转
  jump(index) {
   this.activemenu = index // 当前导航
   const jump = jquery('.do-jump').eq(index)
   const scrolltop = jump.position().top + this.scrollbox.scrolltop // 获取需要滚动的距离
   // chrome
   this.scrollbox.scrollto({
    top: scrolltop,
    behavior: 'smooth' // 平滑滚动
   })
  }

这里有两点需要说明:一是因为我vue项目里装了jquery所以这里直接用了jquery的position().top来获取元素到父元素的距离,如果项目里没装jquery需要把这里换成js的方法来获取元素到父元素的距离(万事有google和度娘),二是点击之后需要滚动的距离计算时别忘了加上当前div已经滚动的距离即已经被卷起的高度

-----到这里我们就可以实现1的功能

3、监听scrollbox的滚动:

写在mounted里

// 获取滚动dom元素
  this.scrollbox = document.getelementbyid('scrollbox')
  const jump = jquery('.do-jump')
  const toparr = []
  for (let i = 0; i < jump.length; i++) {
   toparr.push(jump.eq(i).position().top)
  }
  // 监听dom元素的scroll事件
  this.scrollbox.addeventlistener('scroll', () => {
   const current_offset_top = that.scrollbox.scrolltop
   for (let i = 0; i < toparr.length; i++) {
    if (current_offset_top <= toparr[i]) { // 根据滚动距离判断应该滚动到第几个导航的位置
     that.activemenu = i
     break
    }
   }
  }, true)

这里需要注意addeventlistener里有三个参数:'scroll' 、function、true

补充知识:vue搭建脚手架报错:rollbackfailedoptinal:verb npm-session解决

vue搭建脚手架报错:

rollbackfailedoptinal:verb npm-session

解决

如果你是在公司,而你的公司又用了代理连的外网

想办法直接连外网吧,问题就是代理造成的

我用手机连电脑usb共享网络 哎,心好累

以上这篇vue 导航锚点_点击平滑滚动,导航栏对应变化详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。