vue+导航锚点联动-滚动监听和点击平滑滚动跳转实例


Posted in Javascript onNovember 13, 2019

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

vue+导航锚点联动-滚动监听和点击平滑滚动跳转实例

完成这个功能需要注意:

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

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

代码如下:

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

<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+导航锚点联动-滚动监听和点击平滑滚动跳转实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js 事件处理函数间的Event物件是否全等
Apr 08 Javascript
模拟电子签章盖章效果的jQuery插件源码
Jun 24 Javascript
Get中文乱码IE浏览器Get中文乱码解决方案
Dec 26 Javascript
Angularjs在初始化未完毕时出现闪烁问题的解决方法分析
Aug 05 Javascript
把多个JavaScript函数绑定到onload事件处理函数上的方法
Sep 04 Javascript
jQuery Ztree行政地区树状展示(点击加载)
Nov 09 Javascript
微信小程序图片选择、上传到服务器、预览(PHP)实现实例
May 11 Javascript
vue填坑之webpack run build 静态资源找不到的解决方法
Sep 03 Javascript
jquery实现选项卡切换代码实例
May 14 jQuery
新手快速入门微信小程序组件库 iView Weapp
Jun 24 Javascript
JS获取表格视图所选行号的ids过程解析
Feb 21 Javascript
vue-cli点击实现全屏功能
Mar 07 Javascript
jquery获取input输入框中的值
Nov 13 #jQuery
Vue 实现CLI 3.0 + momentjs + lodash打包时优化
Nov 13 #Javascript
在vue中使用防抖和节流,防止重复点击或重复上拉加载实例
Nov 13 #Javascript
在vue-cli中引入lodash.js并使用详解
Nov 13 #Javascript
vue 解除鼠标的监听事件的方法
Nov 13 #Javascript
在vue+element ui框架里实现lodash的debounce防抖
Nov 13 #Javascript
element实现合并单元格通用方法
Nov 13 #Javascript
You might like
香妃
2021/03/03 冲泡冲煮
PHP中函数内引用全局变量的方法
2008/10/20 PHP
PHP将整个网站生成HTML纯静态网页的方法总结
2012/02/05 PHP
safari,opera嵌入iframe页面cookie读取问题解决方法
2010/06/23 Javascript
JS 表单验证大全
2011/11/23 Javascript
jQuery LigerUI 使用教程入门篇
2012/01/18 Javascript
使用javascript将时间转换成今天,昨天,前天等格式
2015/06/25 Javascript
JavaScript实现的多个图片广告交替显示效果代码
2015/09/04 Javascript
使用node+vue.js实现SPA应用
2016/01/28 Javascript
利用jquery制作滚动到指定位置触发动画
2016/03/26 Javascript
jquery注册文本框获取焦点清空,失去焦点赋值的简单实例
2016/09/08 Javascript
利用jquery实现下拉框的禁用与启用
2016/12/07 Javascript
VUE开发一个图片轮播的组件示例代码
2017/03/06 Javascript
vue环形进度条组件实例应用
2018/10/10 Javascript
nodejs aes 加解密实例
2018/10/10 NodeJs
详解ES6中的Map与Set集合
2019/03/22 Javascript
详解从vue-loader源码分析CSS Scoped的实现
2019/09/23 Javascript
一分钟学会JavaScript中的try-catch
2020/12/14 Javascript
[29:59]完美世界DOTA2联赛PWL S3 Forest vs access 第二场 12.11
2020/12/13 DOTA
python的dict,set,list,tuple应用详解
2014/07/24 Python
Python中使用select模块实现非阻塞的IO
2015/02/03 Python
Python中isnumeric()方法的使用简介
2015/05/19 Python
Python+Selenium+PIL+Tesseract自动识别验证码进行一键登录
2017/09/20 Python
Python中的 enum 模块源码详析
2019/01/09 Python
python 内置函数汇总详解
2019/09/16 Python
HTML5印章绘制电子签章图片(中文英文椭圆章、中文英文椭圆印章)
2019/06/03 HTML / CSS
美国畅销的跑步机品牌:ProForm
2017/02/06 全球购物
SportsDirect.com新加坡:英国第一体育零售商
2019/03/30 全球购物
东方通信股份有限公司VC面试题
2014/08/27 面试题
《巨人的花园》教学反思
2014/02/12 职场文书
网络文明传播志愿者活动方案
2014/08/20 职场文书
未中标通知书
2015/04/17 职场文书
pycharm 如何查看某一函数源码的快捷键
2021/05/12 Python
MySQL查看表和清空表的常用命令总结
2021/05/26 MySQL
Python 中的单分派泛函数你真的了解吗
2021/06/22 Python
java版 联机五子棋游戏
2022/05/04 Java/Android