用JS怎样实现锚点定位功能?
Admin 2021-09-02 群英技术资讯 1303 次浏览
这篇文章给大家分享的是用JS实现锚点定位的内容,小编觉得挺实用的,因此分享给大家做个参考,下文是实现了一个简单的滚动触发锚点高亮,以及点击锚点触发滚动的功能,接下来一起跟随小编看看吧。
这里要注意的是,如果是获取浏览器的滚动高度,各个浏览器有所差异,使用以下几种方式:
Chrome: document.body.scrollTop
Firefox: document.documentElement.scrollTop
Safari: window.pageYOffset
我这里是局部元素滚动,因此稍有差异。先附上html及css代码块:
scroll-content为滚动区域, operation-btn为控制锚点行为的按钮。
<template> <div class="anchor-point"> <!-- 滚动区域 --> <div class="scroll-content" @scroll="onScroll"> <div class="scroll-item" style="height: 500px;background: #3a8ee6;">一层</div> <div class="scroll-item" style="height: 500px;background: red;">二层</div> <div class="scroll-item" style="height: 500px;background: #42b983">三层</div> <div class="scroll-item" style="height: 1000px;background: yellow;">四层</div> </div> <!-- 按钮 --> <div class="operation-btn"> <div v-for="(item, index) in ['一层','二层','三层','四层']" :key="index" @click="jump(index)" :style="{background: activeStep === index ? '#eeeeee' : '#ffffff'}">{{item}} </div> </div> </div> </template> <style lang="scss" scoped> .anchor-point { flex-basis: 100%; display: flex; overflow: hidden; .scroll-content { height: 100%; width: 90%; overflow: scroll; } .operation-btn { width: 10%; height: 100%; } } </style>
通过监听滚动事件,高亮显示锚点按钮
这里是通过遍历滚动项,判断滚动条滚动距离是否大于当前项的可滚动距离(即距离其offsetParent顶部的距离,这里是body)
// 滚动触发按钮高亮 onScroll (e) { let scrollItems = document.querySelectorAll('.scroll-item') for (let i = scrollItems.length - 1; i >= 0; i--) { // 判断滚动条滚动距离是否大于当前滚动项可滚动距离 let judge = e.target.scrollTop >= scrollItems[i].offsetTop - scrollItems[0].offsetTop if (judge) { this.activeStep = i break } } },
添加点击事件,根据锚点滚动至对应区域并实现平滑滚动
这里参考网上的方法,将滚动距离细分为多个小段,并考虑向上及向下的的滚动,实现滚动的过渡动画。本来是打算使用scrollIntoView实现滚动动画,scrollIntoView在各个浏览器已经有很好的支持性,但是ScrollIntoViewOptions在浏览器的兼容性上还有问题,所以改用如下距离分割的方式。
// 点击切换锚点 jump (index) { let target = document.querySelector('.scroll-content') let scrollItems = document.querySelectorAll('.scroll-item') // 判断滚动条是否滚动到底部 if (target.scrollHeight <= target.scrollTop + target.clientHeight) { this.activeStep = index } let total = scrollItems[index].offsetTop - scrollItems[0].offsetTop
// 锚点元素距离其offsetParent(这里是body)顶部的距离(待滚动的距离)
let distance = document.querySelector('.scroll-content').scrollTop
// 滚动条距离滚动区域顶部的距离 // let distance = document.body.scrollTop || document.documentElement.scrollTop || window.pageYOffset
// 滚动条距离滚动区域顶部的距离(滚动区域为窗口) // 滚动动画实现, 使用setTimeout的递归实现平滑滚动,将距离细分为50小段,10ms滚动一次 // 计算每一小段的距离 let step = total / 50 if (total > distance) { smoothDown(document.querySelector('.scroll-content')) } else { let newTotal = distance - total step = newTotal / 50 smoothUp(document.querySelector('.scroll-content')) } // 参数element为滚动区域 function smoothDown (element) { if (distance < total) { distance += step element.scrollTop = distance setTimeout(smoothDown.bind(this, element), 10) } else { element.scrollTop = total } } // 参数element为滚动区域 function smoothUp (element) { if (distance > total) { distance -= step element.scrollTop = distance setTimeout(smoothUp.bind(this, element), 10) } else { element.scrollTop = total } } // document.querySelectorAll('.scroll-item').forEach((item, index1) => { // if (index === index1) { // item.scrollIntoView({ // block: 'start', // behavior: 'smooth' // }) // } // }) }
此处附上效果图:
以上就是关于vue 锚点定位实现的介绍,希望本文对大家学习vue框架作有帮助,想要了解更多vue框架vue 锚点定位的知识,大家可以关注群英网络其它相关文章。
文本转载自脚本之家
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
我们知道JavaScript设计模式有很多,本文主要给大家介绍JavaScript观察者模式的内容。那么究竟JavaScript观察者模式是什么呢?如何实现?接下来我们详细的了解看看。
这篇文章给大家分享的是JavaScript如何清空文本框的值。在网页设计中,文本框的使用是很常见的,为了提供网页访问者的使用体验,一键清除文本框的内容很加分,那么这个效果怎样做呢?文中的示例代码介绍得很详细,有需要的朋友可以参考,接下来就跟随小编一起了解看看吧。
本文给大家分享vue的两个属性,分别是vue的计算属性和vue的侦听属性,那么究竟vue的计算属性和侦听属性有什么用呢?如何运用?接下来我们一起了解看看。
盲猜一个:如果你有看过《medium 五万赞好文-《我永远不懂 JS 闭包》》你一定会对 JS 的【函数】有更多兴趣!皮一下,很舒服~ 没错!JS 就是轻量级的函数式编程!拆解一下这句话,品味一下~本瓜将借助《JavaScript 轻量级函数式编程》一书带领你先透析它的落脚点函数式编程,然后再看看 JS 为什么被称为是
这篇文章主要给大家介绍了关于React获取input值并提交的2种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008