我在一个网站上有不同的部分(都在同一个页面上),而且我还有一个导航栏,它总是固定在顶部。我希望当我停留在该部分时,导航栏中的文本是粗体的,表明我在那里,我如何才能做到这一点?
以下是应用程序的结构:
export default function Main() {
return (
<div className="App relative">
<NavBar fixed />
<Home />
<Purpose />
<WhoWeAre />
<FinancialSolutions />
<Products />
<ComercialPartners/>
<SocialMedia />
<Footer />
</div>
);
}
所有的组件都在不同的文件中,每个组件都有它们的id标签。导航栏有除了页脚之外的每一部分。
1条答案
按热度按时间noj0wjuj1#
您可以使用交叉点观察器来实现这一点。交叉点观察器会检测当前屏幕上的元素。您的情况很棘手,因为您需要检测您首先滚动的方向。因为当您向下滚动时,您想要在某个部分的标题在页面顶部消失时表示您正在该部分中。但是当你向上滚动的时候,你想说的是当这个部分的标题出现在页面的顶部时,你就在这个部分中了。所以首先我们需要检测滚动的方向,然后检测哪个元素出现或消失。
钩子返回引用。你必须给予你的代码中的元素一个引用,你想检测它们是否相交。比如:
const [idVisible, setIdVisible] = useState("");
你的主组件需要实现
const [idVisible, setIdVisible] = useState("");
然后将'idVisible传递给你的导航栏来决定哪一个应该突出显示。另一个useState
const [clickedSection, setIsClickedSection] = useState(false);
可能不需要。这取决于当你点击导航栏中的一个部分时,它是否会导航到页面上的该部分。如果是这样的话,你需要将setIsClickedSection函数也传递到你的导航栏。当你点击一个链接时,你需要将它设置为'true'。原因是导航到一个部分会触发滚动,并会产生奇怪的结果。这有点复杂。我花了一两天的时间才得到这个结果。如果你的最后一部分很小,它可能永远不会在屏幕的顶部相交。处理这个问题的一个方法是使用来检测你是否到达了页面的底部,然后setIdVisible
到页面的最后一部分。这是我为类似目的制作的钩子: