Next.js -有没有可能在不改变URL的情况下滚动到页面上的ID?

qyswt5oh  于 2023-02-08  发布在  其他
关注(0)|答案(2)|浏览(126)

我希望通过单击滚动到页面的不同部分,但不希望地址栏中的URL更新。
例如,我的页面上有一个about部分,ID为about:

<div id='about'>

通过单击页面上的链接,我想滚动到此部分。我可以使用<Link>组件和router来完成此操作,但是如果同时使用这两个组件,我无法在不更新URL的情况下完成此操作。
例如,使用router,我将具有:

router.replace(`/#about`);

这工作正常,除了URL被更新为myurl.com/#about,而我想保持URL为myurl.com
我尝试使用第二个as参数来设置URL,例如:

router.replace(`/#about`, '/');

然而,这恰恰打破了这种联系。
有人知道如何做到这一点 * 而不 * 更新网址?我没有找到任何例子,也没有什么有用的文档。
感谢所有能帮忙的人!

2w3kk1z5

2w3kk1z51#

您可以使用next自己的“Link”组件,只需添加“href”,指示屏幕应该滚动到哪个ID。
所有的样式都放在'a'标签中,所以如果你有一个项目列表,它不会生成错误。
例如,在导航栏中输入:

<Link href="#home">
   <a>Home</a>
</Lins>

在这一节中,你要写:

<div id="home"></div>

如果你使用Styled-components,看看这个例子中的样式,因为你可能会看到一个关于'Link'样式的错误,因为他不能有孩子,所以只要把样式放在'a':

import Link from "next/link";
export const NavLinks = styled(Link)``;

export const Links = styled.a`
 margin-right: 3rem;
 cursor: pointer;
 font-weight: 500;
 color: #3B3B51;
 font-size: 1rem;

&:last-child {
  margin-right:0;
}`;
lf5gs5x2

lf5gs5x22#

export const scrollIntoTheView = (id: string) => {
    let element = document.getElementById(id) as HTMLElement;
    if (!element) return;

    element.scrollIntoView({
        behavior: "smooth",
        block: "start",
        inline: "nearest",
    });
};

你可以使用这个函数,它获取HTML元素的id,通过点击一个按钮来调用这个函数。

相关问题