vue页面添加锚点

本文实例为大家分享了vue实现锚点定位的具体代码,供大家参考,具体内容如下

这里主要是实现了一个简单的滚动触发锚点高亮,以及点击锚点触发滚动的功能
如果是获取浏览器的滚动高度,各个浏览器有所差异,使用以下几种方式:

Chrome: document.body.scrollTop
Firefox: document.documentElement.scrollTop
Safari: window.pageYOffset

我这里是局部元素滚动,因此稍有差异。先附上html及css代码块:

scroll-content为滚动区域, operation-btn为控制锚点行为的按钮。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

<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)

1

2

3

4

5

6

7

8

9

10

11

12

// 滚动触发按钮高亮

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在浏览器的兼容性上还有问题,所以改用如下距离分割的方式。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

// 点击切换锚点

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'

 //     })

 //   }

 // })

}

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue中实现跨页面跳转锚点有两种方法。第一种是非跨页面锚点跳转,可以在标签中使用JavaScript方法实现。例如,在组件A中,可以使用以下代码实现跳转到组件B的指定位置的锚点: ```html <div class="content"> <a href="javascript:void(0)" @click="goAnchor()">gotoOther</a> </div> ``` 然后,在组件A的methods中添加goAnchor方法: ```javascript methods: { goAnchor() { var anchor = this.$el.querySelector("#锚点的id或name值") document.body.scrollTop = anchor.offsetTop } } ``` 第二种方法是跨页面锚点跳转,可以使用路由来实现。在组件A中,可以使用以下代码实现跳转到组件B的指定位置的锚点: ```html <div class="content"> <a href="/b组件路由#锚点的id或name值">gotoOther</a> </div> ``` 需要注意的是,需要将跳转目标的路由和锚点的id或name值组合在一起。 在组件B中,需要设置对应的锚点位置。例如: ```html <div class="content-modal" id="c"> // 设置id ccc </div> <div class="content-modal" id="d"> // 设置id ddd </div> <div class="content-modal" id="e"> // 设置id eee </div> <div class="content-modal" id="f"> // 设置id fff </div> ``` 为了在组件B加载时自动滚动到指定的锚点位置,可以在mounted钩子函数中添加以下代码: ```javascript mounted() { if (window.location.hash) { this.goAnchor(window.location.hash) } }, methods: { goAnchor(selector) { setTimeout(() => { // 获取锚点元素 const anchor = this.$el.querySelector(selector) anchor.scrollIntoView() }, 500) } } ``` 这样,在组件B加载时,如果URL中包含锚点信息,页面会自动滚动到对应的锚点位置。 请根据你的需求选择合适的方法来实现Vue页面跳转锚点。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [vue 实现跨页面锚点跳转](https://blog.csdn.net/yimaode/article/details/104649672)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [VUE—跨页面锚点(nuxt同样适用)](https://blog.csdn.net/Poppy_LYT/article/details/119995904)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值