vue实现锚点跳转scrollIntoView()使用案例

来自:网络
时间:2023-07-25
阅读:
目录

vue实现锚点跳转:scrollIntoView()

说明:

滚动到某个特定元素 :scrollIntoView();例如form表单或者div滚动到底部,

document.getElementsByClassName(‘’)或者document.getElementsById(‘’)

获取到元素后即可实现回到可视化区域(也可理解为回到顶部)。

使用案例:

<div> v-for="(value,index) in data" class="roll">{{...}}</div>  

js部分

methods:{
  scrollToPosition(index){
     document.getElementsByClassName('roll')[index].scrollIntoView()
}

这样就利用scrollIntoView()简单实现了一个锚点跳转,下边讲解scrollIntoView中的一些属性:

scrollIntoView(true)相等于scrollIntoView();元素的顶端将和其所在滚动区的可视区域的顶端对齐为true时相应的 scrollIntoViewOptions: {block: “start”, inline:“nearest”}。这是这个参数的默认值。

scrollIntoView(false)元素的底端将和其所在滚动区的可视区域的底端对齐为false时相应的scrollIntoViewOptions: {block: “end”, inline: “nearest”}。

同时他的参数也可以配置成一个object对象

  scrollIntoView({
  behavior:auto //定义动画过渡效果"auto"或 "smooth" 之一。默认为 "auto"。
  block:start//定义垂直方向的对齐, "start", "center", "end", 或 "nearest"之一。默认为 "start"。
  inline:nearest//"start", "center", "end", 或 "nearest"之一。默认为 "nearest"。
  })

其中smooth是平滑滚动 start和end是目标滚动到的位置

注意:兼容性的问题多数主流浏览器已经支持其基本功能,也就是说,使用true,false两个参数,来实现木讷的定位(没有滚动动画)是没有任何问题的,但是传入object参数时,IE各种版本会直接忽略,全部看成true参数属性,如果想看到滚动动画,使用火狐和chrome。

vue锚点跳转的三种方式(页内跳转,跨页跳转,函数跳转)

1.需求

最近遇到一个需求,需要从一个页面跳到另一个页面的指定锚点,如果是页面上的锚点还简单,但是那个锚点在页面的组件里面。所以稍微研究了一下

2.跳转锚点的基本方式

2.1 页面内通过点击来跳转

即添加一个a标签,href以#开头,然后在需要跳转的地方添加一个element,id设置为a标签href属性相同的值,只是不要#,就可以了,这是最简单的方式

<a href="#miao">去找喵星人</a>
<h3 id="miao">喵星人基地</h3>

2.2 从A页面跳转到B页面的指定锚点(锚点就在页面上,不在子组件中)

我用的vue,所以在vue路由跳转时只要在path后面加上#锚点就可以了,比如我要跳到B页面id为miao的锚点,那么path=xxxx?#miao,当遇到query参数的情况,将#miao放到url的最后就行了,其他的也一样,反正只要把锚点放在url最后就行了,然后进行跳转即可

 this.$router.push({
            path: `/detail?#miao`,
            query: {
              comment: `${commentId}`
            }
          })

注意:因为默认的vue单页使用的是hash模式,以#作为路由分割标识符,就会导致有歧义而无法正常达到需求,如果你又不想使用history模式,那么就使用2.3的方式,使用代码进行锚点跳转

2.3 直接使用代码进行锚点跳转

有的情况,只能使用代码进行锚点跳转,比如从一个页面跳到另一页面子组件内的指定锚点,这与2.2还是有区别的,我已经试过,如果锚点在子组件内,不在当前路由页面中,那么2.2的方式并不会起作用。解决方法:
将锚点作为query属性,或者其他的方式,将锚点的值传给B页面,然后B页面再通过props的方式传给他的子组件,最后在子组件中使用代码进行锚点跳转

// 这是传到组件中的数据
 props: {
      commentId: String
  }
  mounted () {
  // 判断commentId 是否有值,如果没有的话,就不进行跳转,我这里就用'null'来判断了,你们随意
  // document.querySelector用来获取element,有个坑,id值不能全为数字,否则报错,所以我在id值前面加了id,id格式大致是:id123456
  // scrollIntoView就是用来跳转到锚点的函数
        if (this.commentId !== 'null') {
          let inter = setInterval(() => {
            let target = document.querySelector(`#id${this.commentId}`)
            if (target) {
              clearInterval(time)
              target.scrollIntoView()
            }
          },100)
        }
    },
返回顶部
顶部