前端scrollIntoView和scrollTo锚点实际项目运用

方法一: scrollIntoView

html部分

<!-- 按钮区,点击滚动 tagList = ["科目1", "科目2", "科目3"] -->
 <span
        @click="tagHandle(index, '#a' + index)"
        :class="tagIndex === index ? 'tab_select_color' : ''"
        v-for="(item, index) in tagList"
        :key="index"
        >{{ item }}</span>

<!-- 监听滚动,给按钮对应切换 -->

<div
     @wheel="handleScroll"
     class="soroll"
     ref="box">
     <div id="a0" class="at_item></div>
     <div id="a1" class="at_item></div>
     <div id="a2" class="at_item></div>
     <div id="a3" class="at_item></div>
</div>

JS部分

// 点击锚点后的平滑到对应下标元素
// selector: #a1(id选择器)
const tagIndex = ref<number>(0)

const tagHandle = (idx: number, selector: any) => {
  tagIndex.value = idx

  document.querySelector(selector).scrollIntoView({
    behavior: "smooth" // 平滑
  })
}
// 监听滚动,同步按钮的切换

const box = ref<any>(null)

const handleScroll = (i: any) => {
  const navs = document.querySelectorAll(".at_item")
  const offsetTopArr = []
  navs.forEach((item) => {
    offsetTopArr.push(item.offsetTop)
  })
  const scrollTop = box.value.scrollTop
  offsetTopArr.forEach((item, index) => {
    if (scrollTop >= item) {
      tagIndex.value = index
    }
  })
}

方法二: scrollTo

html部分

<!-- 监听用户滚动,联动按钮切换 -->
<div class="scroll_class" ref="anchorRef" @scroll="handleScroll">

<!-- 点击按钮,滚动到对应高度 -->
<span @click="tagHandle(index,'#a'+ index)" :class="tagIndex ===index ? 'right_select_color' :''" v-for="(item,index) in tagList" :key="index"> {{item}} </span>
     <div id="a0" class="at_item></div>
     <div id="a1" class="at_item></div>
     <div id="a2" class="at_item></div>
     <div id="a3" class="at_item></div>
</div>

JS部分

  const anchorRef = ref<any>(null)

    const handleScroll = (i: any) => {
        const navs = document.querySelectorAll('.at-item')
        const offsetTopArr = <any>[]
        navs.forEach((item) => {
            offsetTopArr.push(item.offsetTop)
        })
        const scrollTop = anchorRef.value.scrollTop
        offsetTopArr.forEach((item, index) => {
            if (scrollTop >= item) {
                tagIndex.value = index
            }
        })
    }
  const tagIndex = ref<number>(0)

  const tagHandle = (idx: number, selector: any) => {
       console.log(idx ,selector)
       let curDiv = document.querySelector(selector);
       setTimeout(() => {
          tagIndex.value = idx
       }, 1000);
       const element:any = document.querySelector('.scroll_class');
       element.scrollTo({
          top: curDiv.offsetTop + 180,
          behavior: 'smooth' // 可选,平滑滚动效果
       });
    }

scrollTo相对来说更灵活,可以自定需要上下移动多少。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值