如何将我的 React 组件放置在导航栏下方(这样导航栏不会与它重叠)?

Posted

技术标签:

【中文标题】如何将我的 React 组件放置在导航栏下方(这样导航栏不会与它重叠)?【英文标题】:How do I position my React component beneath the navbar (so that the navbar doesn't overlap it)? 【发布时间】:2020-08-20 10:22:42 【问题描述】:

我正在尝试构建一个 React 16.13.0 应用程序,它的布局相当简单——顶部的导航栏和下面的组件...

  return (<Router>
    <div className="App">
      <Flash />
      <nav className="navbar navbar-expand-lg navbar-light fixed-top">
        <div className="container">
          <Link className="navbar-brand" to="/add">Chicommons</Link>
          <NavBar />
        </div>
      </nav>

      <div className="auth-wrapper">
        <div className="auth-inner">
          <Switch>
            <Route exact path='/' component=Add />
            <Route path="/add" component=Add />
            <Route path="/search" component=Search />
          </Switch>
        </div>
      </div>
    </div>
    </Router>
  );

我为不同的部分创建了以下样式...

.navbar-light 
  background-color: #ffffff;
  box-shadow: 0px 14px 80px rgba(34, 35, 58, 0.2);


.auth-wrapper 
  display: flex;
  justify-content: center;
  flex-direction: column;
  text-align: left;


.auth-inner 
  width: 450px;
  margin: auto;
  background: #ffffff;
  box-shadow: 0px 14px 80px rgba(34, 35, 58, 0.2);
  padding: 40px 55px 45px 55px;
  border-radius: 15px;
  transition: all .3s;

但是,导航栏与组件重叠。 Demo可以看这里——http://prod.chicommons.coop,或者这个截图

我该如何调整,使我的组件出现在导航栏下方并且完全可见(如果必须滚动也可以)?

【问题讨论】:

根据我自己的经验,您应该避免使用粘性固定顶部...改用 css 网格,您将永远不会有重叠 【参考方案1】:

您需要更改文件 scss/utilities/_position.scss 中的 position 属性。它可以是 position:stickyposition:initial 或除绝对或相对之外的任何内容。

例如:-

.fixed-bottom, .fixed-top 
position: initial;
right: 0;
left: 0;
z-index: 1030;

【讨论】:

你说的是引导程序安装的默认文件,即 ./node_modules/bootstrap/scss/utilities/_position.scss 吗?有没有办法在不更改我没有编写的已安装模块的情况下进行您建议的编辑? 是的,你可以在不编辑引导程序的情况下做到这一点。将这些中的任何一个添加到您的 css 文件中。 nav.navbar position: static; nav.navbar position: inherit; nav.navbar position: initial; 【参考方案2】:

事实上你的导航栏上有position: fixed,你的auth-wrapper DOM 元素从顶部开始

现在有多种解决方案,具体取决于您希望导航栏的行为方式

由于您希望导航栏贴在顶部并且不与 DOM 的其余部分一起滚动,您可以将其设为 position: sticky 而不是 position: fixed 并在您的 authWrapper 中添加一个小填充以提供足够的空间顶

由于您现在使用bootstrapfixed-top。我建议你用你自己的自定义类替换它

 <nav className="navbar navbar-expand-lg navbar-light navbar-fixed-top">
    <div className="container">
      <Link className="navbar-brand" to="/add">Chicommons</Link>
      <NavBar />
    </div>
  </nav>


.navbar.navbar-fixed-top 
  position: sticky;
  top: 0;
  right: 0;
  left: 0;


.auth-wrapper 
  padding-top: 2rem;
  display: flex;
  justify-content: center;
  flex-direction: column;
  text-align: left;

但是,当您滚动到页面末尾时,上述解决方案会导致您的导航栏看起来不合适

这里更好的解决方案是使用 position: fixed 而不是 position: sticky 并将 padding-toptop css 添加到 auth-wrapper

.navbar.navbar-fixed-top 
  position: fixed;
  top: 0;
  right: 0;
  left: 0;


.auth-wrapper 
  padding-top: 6rem; // enough space towards the top to be not overlapped by navbar
  display: flex;
  justify-content: center;
  flex-direction: column;
  text-align: left;

【讨论】:

我注意到您正在硬编码“6rem”。是否有某种方法可以指示样式始终将内容定位在导航组件下方,而不必知道导航的确切大小?如果 CSS 有这种能力,那我就想走。 @Dave 这就是第一个解决方案所提供的。它有一个小缺点。【参考方案3】:

你已经为你的导航提供了固定的***课程。它会导致它重叠所有东西(就像它没有其他元素的高度一样)。删除固定顶部类,然后如果需要,在滚动后将其添加到导航栏,以便在用户向下滚动时它会粘在顶部。 (你也可以给你的表单留一点margin-top,这样它就不会粘在你的导航上,变得更漂亮。)

【讨论】:

【参考方案4】:

在此类 .fixed-bottom, .fixed-top 上使用 position: sticky; 而不是 position: fixed;

【讨论】:

以上是关于如何将我的 React 组件放置在导航栏下方(这样导航栏不会与它重叠)?的主要内容,如果未能解决你的问题,请参考以下文章

在导航栏下方放置圆形按钮

为啥我的 react-router 链接会将我带到页面中间?

如何抵消固定导航栏将我带到的位置?

如何编辑默认导航栏?

是否可以将 UIView 的顶部固定到导航栏的底部?

使用 NSLayoutConstraints 添加第二个子视图控制器,始终将其放置在导航栏下方,而不是导航栏之后