前端锚点 点击 滑动双向绑定

一. 页面样式

二. 代码

<div class="flexBox">
	<div class="mdDiv" v-for="(item,index) in tabList" :key="index" :class="nowChoose==index?'choosed':''"   @click="jumpMD(index, item.id)">
		{{item.name}}
	</div>
</div>
<div class="mainDiv" @scroll="onscroll">
	<div id="intro">
		课程简介
	</div>
	<div id="bright">
		课程简介
	</div>
	<div id="formAndTime">
		培训形式与时间
	</div>
	<div id="content">
		课程内容
	</div>
</div>
import { ref, nextTick } from "vue"
nextTick(() =>{
	getTop() // 在nextTick中获取dom元素
})
const tabList = ref([
	{ name: "课程简介",id:"intro" },
	{ name: "课程亮点",id:"bright" },
	{ name: "培训形式与时间",id:"formAndTime" },
	{ name: "课程内容",id:"content" },
  ])

const nowChoose = ref(0)
const isTap = ref(false) // 是否为点击滑动
const jumpMD = (index, id) =>{
	isTap.value = true // 点击滑动  下标直接变
	nowChoose.value= index
	document.getElementById(id).scrollIntoView({behavior: "smooth"})
	setTimeout(() =>{
		isTap.value = false 
	}, 300)
}
const scrollList = [] // 几个锚点距离父顶部的距离
const getTop = () =>{ // 获取锚点div到父级的距离
	scrollList.value = []
	tabList.value.forEach(item =>{
		scrollList.value.push(document.getElementById(item.id).offsetTop)
	})
}
const onscroll = (e) =>{ // 监听页面滚动
	if (!isTap.value) { // 非点击滑动走这里
		if (scrollList.value.length) {
			scrollList.value.forEach((item, index) =>{
				if (e.target.scrollTop + 60 > item) {
					nowChoose.value = index
				}
			})
		}
	}
	
}

三. 易错点讲解

1. 获取子元素到父元素最上方的高
document.getElementById(item.id).offsetTop

在父元素上一定要加

position: relative;

否则就获取到页面顶部的距离了

2. 点击滚动 跟 滚动切换要区分开

监听滚动的事件是一直触发的  我们点击的时候就判断一下 不走滚动里的  当然  滚动也不走监听里的  不然会鬼畜哦

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值