vue跳转时根据url锚点(#xxx)实现页面内容定位的方法

 更新时间:2024年04月30日 08:44:43   作者:前端炒粉仔  
本前端仔在做页面跳转的时候,被要求跳转到页面时候,把对应部分的内容自动滚动到顶部,我一开始想到的就是根据锚点<a href="#xxid">进行处理,但是发现不太好实现,于是便自己研究了一个比较取巧的方法,需要的朋友可以参考下

介绍

本前端仔在做页面跳转的时候,被要求跳转到页面时候,把对应部分的内容自动滚动到顶部~

我一开始想到的就是根据锚点<a href="#xxid">进行处理,但是发现不太好实现~

于是便自己研究了一个比较取巧的方法

一、实现原理

为了能够方便处理这个跳转逻辑,我首先就想要把定位的锚点放到 url 上面,

事实上很多网站都是这样做的,比如掘金就是这样做的:

https://www.jb51.net/server/320459u0g.htm#heading-2

上面的链接中 # 后面拼接的就是定位的锚点,这种就是给页面对应位置的标签添加 id 即可

但是我的项目要定位的地方在一个子组件的滚动区域内,触发不了这个自动滚动效果,不知道为啥~

于是我便使用 watch 进行监听,如果发现url中存在锚点,也就是#拼接的字符串,就根据这个字符串为id获取对应的元素,然后将其进行滚动~

二、代码(vue3 setup)

1、首先在需要跳转的页面的父组件上进行监听,最好是页面框架组件,这样这个监听效果会一直存在:

import { watch, nextTick } from 'vue';
import { useRoute } from 'vue-router';

const route = useRoute();

// 监听路由变化,滚动到对应位置
watch(() => route.hash, (newVal, oldVal) => {
    let hash = window.location.hash;
    // hash 删除第一个字符(当前项目是hsah模式)
    hash = hash.slice(1);
    if(hash.indexOf('#') != -1) {
        nextTick(() => {
            let id = hash.split('#')[1];
            id = decodeURIComponent(id);
            let el = document.getElementById(id);
            console.log('滚动到:', id, el)
            if(el) {
                // 平滑滚动
                setTimeout(() => {
                    el.scrollIntoView({behavior: 'smooth'});
                }, 0);
            }
        })
    }
})

由于我的项目路由是哈希模式,于是便先清除一个#,接着便获取到锚点id,然后获取对应的标签,最后进行滚动 为啥使用setTimeout呢?因为vue的数据更新会有延迟的,代码并不会立即执行,因此使用定时器把这次滚动推迟到下一个事件循环,确保成功触发~

2、在对应的子组件中,也就是滚动容器组件,只需要给对应的位置的标签添加 id 即可

3、使用方法,router 跳转:

import { useRouter } from 'vue-router';
const router = useRouter()

// 跳转
router.push({ path: '/xxx/xxxxx', hash: '#位置'})

三、演示:

四、结束

到此这篇关于vue跳转时根据url锚点(#xxx)实现页面内容定位的方法的文章就介绍到这了,更多相关vue根据url锚点定位内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 解决在vue的mounted中获取对象为null问题

    解决在vue的mounted中获取对象为null问题

    这篇文章主要介绍了解决在vue的mounted中获取对象为null问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • 通过vue方式实现二维码扫码功能

    通过vue方式实现二维码扫码功能

    这篇文章给大家介绍了通过vue的方式,实现扫码功能,实现步骤分为两步,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2021-11-11
  • element-ui中el-table不显示数据的问题解决

    element-ui中el-table不显示数据的问题解决

    这篇文章主要介绍了element-ui中el-table不显示数据的问题解决,这是最近在做列表首页时遇到的一个问题,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-07-07
  • element前端实现压缩图片的功能

    element前端实现压缩图片的功能

    本文主要介绍了element前端实现压缩图片的功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • 记一次微信小程序与webviewH5通信的踩坑记录

    记一次微信小程序与webviewH5通信的踩坑记录

    uniapp开发小程序的过程中主、分包有大小限制,随着业务的增加,使用web-view加载H5的方式,往往纯加载并不能满足业务需求,这个时候就得了解小程序与H5的交互,这篇文章主要给大家介绍了关于微信小程序与webviewH5通信的踩坑记录,需要的朋友可以参考下
    2024-07-07
  • Monorepo风格的组件工程搭建示例详解

    Monorepo风格的组件工程搭建示例详解

    这篇文章主要介绍了Monorepo风格的组件工程搭建示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • vue里的data要用return返回的原因浅析

    vue里的data要用return返回的原因浅析

    这篇文章主要介绍了vue里的data要用return返回的原因浅析,需要的朋友可以参考下
    2019-05-05
  • vue项目实现页面跳转的方法

    vue项目实现页面跳转的方法

    这篇文章主要给大家分享的是vue项目实现页面跳转的方法,vue-router是前端开发中用来实现路由页面跳转的一个模块。下面小编将带来如何在已经创建好的vue-router项目基础下实现页面跳转,需要的朋友可以参考一下
    2021-11-11
  • vue+ESLint 配置保存 自动格式化代码

    vue+ESLint 配置保存 自动格式化代码

    这篇文章主要介绍了vue+ESLint 配置保存 自动格式化代码的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-03-03
  • vue登录成功之后的token处理详细步骤

    vue登录成功之后的token处理详细步骤

    Token是身份验证后服务端返回的令牌,常用于访问授权API和页面权限校验,Token数据可存储在本地或Vuex中,本地存储可实现数据持久化,这篇文章主要介绍了vue登录成功之后的token处理详细步骤,需要的朋友可以参考下
    2024-10-10

最新评论