用JS怎样实现锚点定位功能?
Admin 2021-09-02 群英技术资讯 2813 次浏览
这篇文章给大家分享的是用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进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
使用node.js怎么样实现发送邮件提醒?邮件在学习和工作中的使用还是比较多的,有时候我们需要定期的发送一些邮件,而要确保能按时发送不忘记,定时自动邮件提醒功能还是很关键的,下面我们就来看看这个功能要怎样做?
这篇文章主要为大家详细介绍了vue3实现CSS无限无缝滚动效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
本篇文章给大家带来了关于javascript的相关知识,其中主要介绍了关于鼠标事件以及键盘事件的相关问题,还包括了页面事件、焦点事件、表单事件,下面一起来看一下,希望对大家有帮
我们学习了JS 之后,能够用JS实现很多有意思的炫酷效果。这篇文章就给大家分享一个模拟电灯开关的小案例,生活中,我们用手一按就可以让电灯亮起和熄灭,下面我们来看看如何用JS实现点灯开关效果。
目录表单校验背景常规写法:策略模式介绍真实世界类比更广义的“算法”策略模式的组成利用策略模式改写策略模式优缺点优点:缺点:策略模式适合应用场景总结表单校验背景假设我们正在编写一个注册页面,在点击注册按钮之时,有如下几条校验逻辑:用户名不能为空密码长度不能少于6位手机号码必须符合格式常规写法:const form = d
成为群英会员,开启智能安全云计算之旅
立即注册关注或联系群英网络
7x24小时售前:400-678-4567
7x24小时售后:0668-2555666
24小时QQ客服
群英微信公众号
CNNIC域名投诉举报处理平台
服务电话:010-58813000
服务邮箱:service@cnnic.cn
投诉与建议:0668-2555555
Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 ICP核准(ICP备案)粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008