【问题标题】::hover states "stick" when using React Router:hover 使用 React Router 时状态为“stick”
【发布时间】:2021-06-05 22:45:10
【问题描述】:

CODESANDBOX 链接:https://codesandbox.io/s/cranky-paper-qucsp

如果需要,我很乐意发布更多代码。

我正在学习 React,我有一个简单的页面设置,其中路由设置为其他组件。这些标签有一个 className 集并具有悬停/焦点状态。当我单击其中一个标签以加载另一个组件(页面刷新)时,这些标签的悬停/焦点状态将保持不变,直到我“单击”其他地方为止。我什至可以在其他标签上激活悬停状态,而原来的标签仍然像悬停在上面一样。有人可以告诉我为什么会发生这种情况/如何解决它/链接我解释它的文档吗?

再次,如果相关,我很乐意提供任何其他代码。谢谢大家。

下面是一个简单的 Nav.js 和 App.js 来展示我正在使用的内容。导航具有标签和标签(用于外部网站),并且悬停状态“粘”在两个标签上。

function App() {
  return (
    <Router>
      <div className="main-container">
        <Nav />
        <Switch>
          <Route path="/" exact component={Home} />
          <Route path="/About" component={About} />
          <Route path="/Projects" component={Projects} />
        </Switch>
      </div>
    </Router>
  );
}
function Nav() {
    return (
          <nav>
            <Link to="/About" className="nav-link"><li>About</li></Link>
            <a href="randomlink.com" className="nav-link"target="_blank">link1</a>
            <Link to="/" className="homeLink"><li>Home</li></Link>
            <a href="randomlink.com" className="nav-link" target="_blank">link3</a>
            <Link to="/Projects" className="nav-link"><li>Projects</li></Link>
          </nav>
    );
}

【问题讨论】:

  • 您能否也包括应用于这些“链接”的 CSS?你是渲染来自 react-router-dom 的 Link 组件,还是你重命名的 NavLink 组件?您能否尝试创建一个 running 代码框来重现我们可能在其中进行调试的这个问题?
  • @DrewReese 我在帖子中添加了一个 CodeSandbox 链接以供参考。 codesandbox.io/s/cranky-paper-qucsp
  • 好吧,我在下面回答,然后重新检查了您的代码框和 TBH,我似乎无法重现您所描述的问题,这让我相信我误解了您所说的问题(考虑到我也觉得我的回答不够充分)。我能想到的最接近的是这种情况:用户点击链接,它具有焦点并设置样式,然后用户将鼠标悬停在另一个链接上,它也设置了样式。与焦点的链接将保持它,直到焦点移动到其他地方。你能更清楚地解释问题是什么吗?提供一组步骤以在您的沙盒中重现它?
  • @DrewReese 感谢您对 Reese 的调查。 homeLink 上的第二个下划线是故意的。我注意到 Samrat 在下面做出了回应,并建议我使用的是导致问题的焦点状态。我想我不记得上次将焦点状态与悬停状态匹配是什么时候了,所以我忘记了焦点状态的怪癖。 :P 但我会根据您的要求研究 NavLink 组件。谢谢!
  • 那是我描述的场景,当您将鼠标悬停在其他元素上时,某些元素保持焦点?如果是这样,那么这就是我对沙盒代码的期望。我刚刚尝试了 Samrat 的建议,并且解耦悬停和焦点样式似乎是您想要的。一般来说,除非您有一个相当自定义的组件并且它具有次优的视觉可访问性,否则您通常希望单独保留焦点样式(为了可访问性)。浏览器通常已经很好地指示了对与之交互的项目的关注。

标签: css reactjs hover


【解决方案1】:

似乎额外的下划线是由您的 .homeLink::after 选择器和 CSS 引起的。当您将鼠标悬停在主页链接上时,您会看到这一点,并且悬停/焦点下划线会动画化。

.homeLink::after {
  content: "";
  height: 2px;
  width: 100%;
  position: absolute;
  bottom: -3px;
  left: 0;
  background-color: black;
  transform: scaleX(1);
}

当我删除此选择器时,多余的下划线将被删除,并且悬停/焦点行为似乎与您的预期一样。

我认为,如果您切换到使用 Navlink 链接组件,您可以在其中指定样式以在链接处于活动状态时应用于链接,我认为您的某些 CSS 可以得到简化。

【讨论】:

    【解决方案2】:

    这是因为当链接处于焦点时您正在应用 scaleX(1)。这导致下划线粘住。

    从以下位置更改您的 css:

    .homeLink:hover::before,
    .homeLink:focus::before {
      transform: scaleX(1);
    }
    .nav-link:hover::after,
    .nav-link:focus::after {
      transform: scaleX(1);
    }
    

    收件人:

    .homeLink:hover::before{
      transform: scaleX(1);
    }
    .nav-link:hover::after{
      transform: scaleX(1);
    }
    

    希望这会有所帮助。

    【讨论】:

    • 嘿萨姆拉特。感谢您让我知道导致样式坚持的焦点状态。单击后,我没有考虑元素成为焦点。您是否知道焦点状态的解决方案可能是什么(出于可访问性原因)?谢谢!
    猜你喜欢
    • 2017-05-19
    • 2016-06-02
    • 2019-05-12
    • 2020-03-30
    • 2018-01-29
    • 2019-03-14
    • 1970-01-01
    • 2020-08-29
    • 2016-03-13
    相关资源
    最近更新 更多