为啥即使我能够获得对我试图滚动到的元素的引用,scrollIntoView 在 Vue 3 中也不起作用

Posted

技术标签:

【中文标题】为啥即使我能够获得对我试图滚动到的元素的引用,scrollIntoView 在 Vue 3 中也不起作用【英文标题】:Why doesn't scrollIntoView work in Vue 3 even though I'm able to get a reference to the element that I'm trying to scroll to为什么即使我能够获得对我试图滚动到的元素的引用,scrollIntoView 在 Vue 3 中也不起作用 【发布时间】:2021-01-14 13:35:29 【问题描述】:

我有一个 Vue 3 组件,我试图将其设置为单页应用程序的导航。当用户点击一个项目时,我希望页面滚动到包含该部分内容的元素。

奇怪的是,我可以使用document.querySelector 获得对 div 的引用。我可以将 div 记录到控制台,但是当我尝试在 div 上调用 scrollIntoView 时,它不会做任何事情,除非我将 element.scrollIntoView 包装在 setTimeout 函数中。

我确定这与 Vue 组件生命周期有关。我尝试将我的代码包装在 onMounted 函数中,这只会使我的 scrollPageTo 函数超出范围。

<template>
    <div id="navigation-view" class="navigation-bar bg-gradient-to-tr w-full mx-auto flex items-start py-4">
        <div class="w-full mx-auto text-right">
                <nav>
                    <a class="top-nav-item" href="#" v-on:click="scrollPageTo('home-view')">
                        <i class="fa fa-home fa-lg"></i> Home
                    </a>

                    <a class="top-nav-item" href="#" v-on:click="scrollPageTo('hello-view')">
                        <i class="fa fa-hands-helping fa-lg"></i> Hello
                    </a>

                    <a class="top-nav-item" href="#" v-on:click="scrollPageTo('contact-view')">
                        <i class="fa fa-envelope fa-lg"></i> Contact
                    </a>
                </nav>
        </div>
    </div>
    <div class="logo">
        <img src="/assets/img/615io-logo-wbg.png" >
    </div>
</template>
<script lang="ts">
import defineComponent, onMounted from "vue";
export default defineComponent(
    setup() 

        const scrollPageTo = (navEl) => 
            console.log(`#$navEl`);
            let element = document.querySelector(`#$navEl`);
            console.log(element);
            element.scrollIntoView(behavior: 'smooth');
        

        return 
            scrollPageTo,
        


    
);
</script>

【问题讨论】:

嗨,我也是 Vue 3 的新手,但这似乎工作正常。 jsfiddle.net/r1xbej3d @User28 很好的例子,但是如果你使用a 而不是button,这将不起作用,但如果你添加了 prevent 修饰符,它会起作用 哦,你是对的,我没有注意到从 OP 代码中使用 a 标签。 【参考方案1】:

prevent 修饰符添加到单击事件,因为此修饰符会阻止默认行为,即导航到#

v-on:click.prevent="scrollPageTo('home-view')"

LIVE DEMO

【讨论】:

以上是关于为啥即使我能够获得对我试图滚动到的元素的引用,scrollIntoView 在 Vue 3 中也不起作用的主要内容,如果未能解决你的问题,请参考以下文章

为啥用offsetTop获取到的距离不对

为啥平滑滚动在滚动之前会闪烁?

获取span web元素的Xpath

重叠时如何滚动div

为啥滚动视图即使没有 contentView 滚动到仍然滚动

为啥即使我覆盖 touchesMoved:withEvent:,UIScrollView 的子类仍会滚动?