vue项目页面滚动到特定元素的的四种方法

最近在做一个关于语音识别的项目, 涉及到语音消息的实时推送, 语音内容的识别与内容关联话术推荐, 做的时候需要实现一个识别出来的内容关联客户对话内容的功能, 简而言之就是实现一个点击跳转到在实时更新的对话框内与当前内容相关联的特定元素的功能, 实现的过程中用一个很巧妙的办法解决了, 这里记录一下.

方法一: 利用锚链接 / 直接改变hash值

说道页面内的跳转, 有过一段时间开发经验的同学想到的第一种方法应该就是这种,锚链接的使用方式也很简单, 如果想要跳转到id为targetBox 的 div

只需要加上window.location.hash = ''#targetBox" z或者加上如下点击链接就行:

<a href="#targetBox">点我就能跳转</a>

 但是使用此种方法也是有缺陷的, 因为它改变了页面的路由地址, 在vue的项目中,实现spa单页应用的原理就是通过修改hash值来改变加载内容, 一旦这样跳转, 页面路由就会出现问题,因此在vue项目中这种方式基本上无法使用.

 

方法二: 利用scrollTop

这种方式也是很常见的一种, 利用页面的高度差,跳转到特定位置, 如果高度差为100:

document.getElementById('targetBox').scrollTop = 100

由于项目当中的语音对话框是实时更新的,这种方法在当高度差实时发生变换的时候并不好用.

 

方法三: 通过让元素获得焦点

这个方法之前没有用过,其原理是通过让元素支持focus事件,让元素获取焦点,div正常情况下是无法像input元素一样获得焦点的,但是正如我们可以通过给div加上conteneditable属性让div元素变得可以编辑一样,在这里我们也可以通过给div元素加上tabindex = "0"的属性让元素可以获取焦点:

<div id="targetBox" tabindex = "0"></div>

document.getElementById("targetBox").focus();

这样实现跳转之后的元素会加上一个蓝色的选中边框,可通过设置outline:none;属性取消.

 

方法四: 利用scrollIntoView方法

此方法可以简单的通过获取元素就让当前的元素滚动到浏览器窗口的可视区域内:

<div id="targetBox" tabindex = "0"></div>

document.getElementById("targetBox").scrollIntoView();

通过设置alignToTop参数来设置元素的显示位置, 如果为true,元素的顶端将和其所在滚动区的可视区域的顶端对齐,如果为false,元素的底端将和其所在滚动区的可视区域的底端对齐.显然这种方式最是简单,推荐这种.

Vue 中,可以通过 router 进行页面的跳转。具体步骤如下: 1. 安装 Vue Router: ``` npm install vue-router ``` 2. 在 main.js 中引入 Vue Router: ``` import Vue from 'vue' import VueRouter from 'vue-router' Vue.use(VueRouter) ``` 3. 创建路由实例并配置路由: ``` const router = new VueRouter({ routes: [ { path: '/', name: 'Home', component: Home }, { path: '/about', name: 'About', component: About } ] }) ``` 其中,`routes` 是一个数组,每个元素表示一个路由规则,包括路径 `path`、名称 `name` 和组件 `component`。 4. 在组件中使用 `router-link` 组件进行跳转: ``` <router-link to="/">Home</router-link> <router-link to="/about">About</router-link> ``` `to` 属性指定跳转的路径。 5. 在组件中使用 `$router.push()` 方法进行编程式跳转: ``` this.$router.push('/') ``` 其中,参数为要跳转的路径。 完整代码示例: ``` // main.js import Vue from 'vue' import VueRouter from 'vue-router' import App from './App.vue' import Home from './components/Home.vue' import About from './components/About.vue' Vue.use(VueRouter) const router = new VueRouter({ routes: [ { path: '/', name: 'Home', component: Home }, { path: '/about', name: 'About', component: About } ] }) new Vue({ router, render: h => h(App), }).$mount('#app') // App.vue <template> <div> <router-link to="/">Home</router-link> <router-link to="/about">About</router-link> </div> </template> <script> export default { name: 'App' } </script> // Home.vue <template> <div> <h1>Home</h1> </div> </template> <script> export default { name: 'Home' } </script> // About.vue <template> <div> <h1>About</h1> </div> </template> <script> export default { name: 'About' } </script> ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值