基于vue监听滚动事件,实现锚点链接平滑滚动
近日在做一个vue项目的餐饮模块,小编需要实现一个菜单列表显示的功能(如图所示:左边为菜单类别,右边显示相对应的菜品)
小编将此分为三个功能模块来实现(本来一张动画就清晰明了,小编太笨,只得口述一下):
1.左边点击类别,右边显示相应类别的菜品列表(平滑滚动)
2.滚动右边的滚动条,左边对应的显示当前样式
3.若从别的页面点击菜品进来该页面,则该菜品为指定效果
小编也是vue的初学者,在阅读了大量的文章后,其中借鉴https://www.jb51.net/article/110325.htm 该文章,收到了很多启发后,结合我们的功能加以完善。小编的和借鉴的文章侧重点不同,建议大家在看之前可以先看一下上面的,以便于梳理的更清楚。
:scrollTop(滚动之根本)
在初写项目的尝试过程中,小编一直改变的是document.body.scrollTop的值来实现滚动,但是后来逐渐发现很邪门,有时给其赋值并没有作用,而且过程也很麻烦,又查阅了一些资料也没有解决办法,所以不得已放弃。
之后无意中看到:scrollTop, 便尝试开始使用vue中的属性直接进行绑定滚动的变量值,功能实现反而简单了。下面详细讲述:
一、组件html结构:
结构布局很简单,在此多说是想给大家讲述清楚一点儿右边菜品的结构,方便绑定:scrollTop属性,小编就踩了这个坑...
注意看注释::scrollTop 的位置改变菜品列表的scrollTop值,来实现相应的滚动
二、实现锚链接平滑滚动
该功能是参考之前博主的文章的,方法基本没改什么,简单易懂,直接放代码
jump(index){ const cateItem = document.querySelectorAll('.cate-item'); let total = cateItem[index].offsetTop; let distance = this.container.scrollTop // 获取到顶部的距离(this.container便是.cate-list,为了方便存起来了) let step = total / 50; this.isActive = index; // 菜单列表显示当前样式 const _this = this; if (total > distance) { smoothDown() } else { let newTotal = distance - total step = newTotal / 50 smoothUp() } function smoothDown () { if (distance < total) { distance += step _this.scrollTop = distance; setTimeout(smoothDown, 10); } else { _this.scrollTop = total } } function smoothUp () { if (distance > total) { distance -= step _this.scrollTop = distance setTimeout(smoothUp, 10) } else { _this.scrollTop = total } } }
三、监听滚动事件,修改锚点状态
在vue中钩子函数监听菜品列表(this.container)的滚动事件,
mounted(){ // 监听scroll事件 const _this = this; setTimeout(function(){ _this.currentStick(); const rightItem = document.querySelectorAll('.cate-item'); const catelist = document.querySelectorAll('.cate-list')[0]; var length = rightItem.length; var height = rightItem[length-1].offsetHeight; var scrollHeight = document.querySelectorAll('.cate-menu-wrapper')[0].offsetHeight; // 设置最后一个类别菜品列表的高度(小于适配器高度的话与适配器等高),不然点击锚点不能够置顶 if(height < scrollHeight){ rightItem[length-1].style.height = scrollHeight+'px'; } var arr =[]; rightItem.forEach(function(v, i){ arr.push({top: v.offsetTop, height: v.offsetHeight, index: i}); }) _this.itemVal = arr; const cateList = document.querySelectorAll('.cate-list')[0]; cateList.addEventListener('scroll', _this.onScroll); _this.container = cateList; }, 500) },
这里写的有点啰嗦了,设置setTimeout延迟是为了能够获取到元素(谁有好办法快推荐给我),为了在滚动中能够对应列表显示锚点当前状态,存了一个数据itemAll,存了该菜品类别区域的scrollTop,索引,高度。(啰嗦,太啰嗦了)
methods: { onScroll () { var _this = this; _this.itemVal.forEach(function(obj, i){ _this.scrollTop = _this.container.scrollTop; if(_this.scrollTop >= obj.top && _this.scrollTop < (obj.top + obj.height-10)){ // scrollTop的移动位置要在类别的菜品列表中才显示对应锚点的当前状态 _this.isActive = obj.index; } }) }, }
三、点击菜品进入页面,该菜品置顶的联动效果(该功能其实有隐藏性的bug,我们项目已取消该功能)
currentStick(){ const {dishId} = this.$route.query; const cateContent = document.querySelectorAll('.cate-content'); const _this = this; cateContent.forEach(function(v, i){ if(v.id == dishId){ _this.scrollTop = v.offsetTop; } }) },
该功能用:scrollTop绑定的话便简单了许多,之前用document.body.scrollTop 设置值一直没有作用。
好了,基本上所有的代码都帖出来了,说的应该也详细吧(我尽力了),该方法感觉其实还是在操作dom元素和js,枉用vue。但是一时也没有更好的办法来实现。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
RTX 5090要首发 性能要翻倍!三星展示GDDR7显存
三星在GTC上展示了专为下一代游戏GPU设计的GDDR7内存。
首次推出的GDDR7内存模块密度为16GB,每个模块容量为2GB。其速度预设为32 Gbps(PAM3),但也可以降至28 Gbps,以提高产量和初始阶段的整体性能和成本效益。
据三星表示,GDDR7内存的能效将提高20%,同时工作电压仅为1.1V,低于标准的1.2V。通过采用更新的封装材料和优化的电路设计,使得在高速运行时的发热量降低,GDDR7的热阻比GDDR6降低了70%。
更新日志
- 小骆驼-《草原狼2(蓝光CD)》[原抓WAV+CUE]
- 群星《欢迎来到我身边 电影原声专辑》[320K/MP3][105.02MB]
- 群星《欢迎来到我身边 电影原声专辑》[FLAC/分轨][480.9MB]
- 雷婷《梦里蓝天HQⅡ》 2023头版限量编号低速原抓[WAV+CUE][463M]
- 群星《2024好听新歌42》AI调整音效【WAV分轨】
- 王思雨-《思念陪着鸿雁飞》WAV
- 王思雨《喜马拉雅HQ》头版限量编号[WAV+CUE]
- 李健《无时无刻》[WAV+CUE][590M]
- 陈奕迅《酝酿》[WAV分轨][502M]
- 卓依婷《化蝶》2CD[WAV+CUE][1.1G]
- 群星《吉他王(黑胶CD)》[WAV+CUE]
- 齐秦《穿乐(穿越)》[WAV+CUE]
- 发烧珍品《数位CD音响测试-动向效果(九)》【WAV+CUE】
- 邝美云《邝美云精装歌集》[DSF][1.6G]
- 吕方《爱一回伤一回》[WAV+CUE][454M]