Vue3页面内跳转锚点-scrollIntoView()

scrollIntoView() 

scrollIntoView()方法将调用它的元素滚动到浏览器窗口的可见区域。 

  • element.scrollIntoView(); // 等同于element.scrollIntoView(true)
  • element.scrollIntoView(alignToTop); //布尔参数。接受布尔值主要还是为了兼容不支持平滑滚动(老版)的浏览器
  • element.scrollIntoView(scrollIntoViewOptions); //对象参数

alignToTop

  • 当传入参数true时,相当于{behavior: 'auto', block: 'start', inline: 'nearest'}
  • 当传入参数false时,相当于{behavior: 'auto', block: 'end', inline: 'nearest'}
当未传入参数时,默认值为: {behavior: 'auto', block: 'start', inline: 'nearest'}

scrollIntoViewOptions,一个包含下列属性的对象。

  • behavior定义过渡动画,默认值为auto

    • auto,表示没有平滑的滚动动画效果。
    • smooth,表示有平滑的滚动动画效果。
  • block定义垂直方向的对齐,默认值为start

    • start,表示顶端对齐。
    • center,表示中间对齐。
    • end,表示底端对齐。
    • nearest

      • 如果元素完全在视口内,则垂直方向不发生滚动。
      • 如果元素未能完全在视口内,则根据最短滚动距离原则,垂直方向滚动父级容器,使元素完全在视口内。
  • inline定义水平方向的对齐,默认值为nearest

    • start,表示左端对齐。
    • center,表示中间对齐。
    • end,表示右端对齐。
    • nearest

      • 如果元素完全在视口内,则水平方向不发生滚动。
      • 如果元素未能完全在视口内,则根据最短滚动距离原则,水平方向滚动父级容器,使元素完全在视口内。

效果图: 

 示例代码:

<template>
  <div class="box">
    <div class="left">
      <p @click="test('id1')">第一段内容</p>
      <p @click="test('id2')">第二段内容</p>
      <p @click="test('id3')">第三段内容</p>
    </div>
    <div class="right">
      <div class="content" id="id1">我是第一段内容</div>
      <div class="content" id="id2">我是第二段内容</div>
      <div class="content" id="id3">我是第三段内容</div>
    </div>
  </div>
</template>

<script setup lang="ts">
const test = (data: any) => {
  document?.getElementById(data)?.scrollIntoView({
    behavior: "smooth", //smooth:平滑,auto:直接定位
    block: "start",
    inline: "start",
  });
};
</script>

<style scoped lang="scss">
.box {
  width: 50vw;
  height: 50vh;
  display: flex;
  overflow: hidden;
  border: 1px solid gray;

  .left {
    width: 100px;
    height: 100%;
    border-right: 2px solid gray;
    p {
      height: 40px;
      width: 100%;
      display: flex;
      align-items: center;
      justify-content: center;
      cursor: pointer;
      border: 1px solid #ccc;
    }
  }

  .right {
    flex: auto;
    overflow: auto;
    .content {
      width: 100%;
      height: 1000px;
      border-top: 2px solid blue;
      padding: 20px;
      box-sizing: border-box;
    }
  }
}
</style>

a标签锚点定位

无平滑效果。需要平滑的话用上面的方式

 

<template>
  <div class="box">
    <div class="left">
      <a href="#id1">第一段内容</a>
      <a href="#id2">第二段内容</a>
      <a href="#id3">第三段内容</a>
    </div>
    <div class="right">
      <div class="content" id="id1">我是第一段内容</div>
      <div class="content" id="id2">我是第二段内容</div>
      <div class="content" id="id3">我是第三段内容</div>
    </div>
  </div>
</template>

<script setup lang="ts"></script>

<style scoped lang="scss">
.box {
  width: 50vw;
  height: 50vh;
  display: flex;
  overflow: hidden;
  border: 1px solid gray;
  scroll-behavior: smooth;

  .left {
    width: 100px;
    height: 100%;
    border-right: 2px solid gray;
    a {
      height: 40px;
      width: 100%;
      display: flex;
      align-items: center;
      justify-content: center;
      cursor: pointer;
      border: 1px solid #ccc;
    }
  }

  .right {
    flex: auto;
    overflow: auto;
    .content {
      width: 100%;
      height: 1000px;
      border-top: 2px solid blue;
      padding: 20px;
      box-sizing: border-box;
    }
  }
}
</style>

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值