锚点定位平滑滑动

1、a链接 锚点定位,地址url改变,刷新页面会导致有问题,推荐使用下面第二种方法

<template>
  <div>
		<div class="nav" :class="{active: active===0}" @click="scrollTo(0)">
			<a href="#courseSystem" >课程体系</a>
		</div>
		<div class="nav" :class="{active: active===1}" @click="scrollTo(1)">
				<a href="#clickanchor" >作品广场</a>
		</div>

		<div class="con" id="courseSystem" >课程体系</div>
		<div class="con" id="opusSquare" >作品广场</div>
	</div>
</template>

data(){
	return{
		active: 0
	}
}
mounted() {
    this.$nextTick(function() {
      window.addEventListener("scroll", this.onScroll);
    });
  },
  methods:{
  	// 滚动事件触发下拉加载
    onScroll(e) {
      // 获取所有锚点元素
      const navContents = document.querySelectorAll('.contentTit')
      // 所有锚点元素的 offsetTop
      const offsetTopArr = []
      navContents.forEach(item => {
        offsetTopArr.push(item.offsetTop)
      })
      // 获取当前文档流的 scrollTop
      const scrollTop = document.documentElement.scrollTop || document.body.scrollTop
      // 定义当前点亮的导航下标
      let navIndex = 0
      for (let n = 0; n < offsetTopArr.length; n++) {
        // 如果 scrollTop 大于等于第n个元素的 offsetTop 则说明 n-1 的内容已经完全不可见
        // 那么此时导航索引就应该是n了
        if (scrollTop >= offsetTopArr[n]) {
          navIndex = n
        }
      }
      this.active = navIndex
    },
    scrollTo(index) {
      const targetOffsetTop = document.querySelector(`.contentTit`).offsetTop
      let scrollTop = document.documentElement.scrollTop || document.body.scrollTop
      const STEP = 50
      if (scrollTop > targetOffsetTop) {
        smoothUp()
      } else {
        smoothDown()
      }
      function smoothDown() {
        // 如果当前 scrollTop 小于 targetOffsetTop 说明视口还没滑到指定位置
        if (scrollTop < targetOffsetTop) {
          if (targetOffsetTop - scrollTop >= STEP) {
            scrollTop += STEP
          } else {
            scrollTop = targetOffsetTop
          }
          document.body.scrollTop = scrollTop
          document.documentElement.scrollTop = scrollTop
          requestAnimationFrame(smoothDown)
        }
      }
      // 定义往上滑函数
      function smoothUp() {
        if (scrollTop > targetOffsetTop) {
          if (scrollTop - targetOffsetTop >= STEP) {
            scrollTop -= STEP
          } else {
            scrollTop = targetOffsetTop
          }
          document.body.scrollTop = scrollTop
          document.documentElement.scrollTop = scrollTop
          requestAnimationFrame(smoothUp)
        }
      }
    }
  }

2、简单操作,不改变url地址,也能平滑的滚动

<template>
    <div>
		<div class="btn" :class="{active: active===0}" @click="clickanchor('#courseSystem', 0)">课程体系</div>
		<div class="btn" :class="{active: active===1}" @click="clickanchor('#opusSquare', 1)">作品广场</div>

		<div class="con" id="courseSystem" >课程体系</div>
		<div class="con" id="opusSquare" >作品广场</div>
	</div>
</template>
data(){
	return{
		active: 0
	}
}
methods:{
	clickanchor(idName,n){
      this.active = n
      document.querySelector(idName).scrollIntoView({ behavior: "smooth" });
    },	
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值