【问题标题】:How to align item in middle of navbar? [duplicate]如何在导航栏中间对齐项目? [复制]
【发布时间】:2019-10-12 20:52:09
【问题描述】:

导航栏中有6个项目:

  1. 前 3 个项目应对齐为 flex-start - 在导航栏的开头。

  2. 那么 Logo 应该在导航栏的中心

  3. 最后 -> flex-end 应该有 2 个图标

这是导航栏当前状态的截图:

问题:是徽标的位置 - 我正在使用 margin-left: '27%'。并且在不同的屏幕尺寸上,logo 并没有很好地对齐。

我想通过flex 调整一些徽标,有没有办法用flex 做到这一点?

检查代码:

HTML/jsx:

 <div className="container">
  <header className="header">
    <nav className="user-nav">
      <div className="user-nav-item">
        <Link href="/">
          <a className="user-nav-item-link">Overview</a>
        </Link>
      </div>
      <div className="user-nav-item">
        <Link href="/search">
          <a className="user-nav-item-link">Search</a>
        </Link>
      </div>
      <div className="user-nav-item">
        <Link href="/feed">
          <a className="user-nav-item-link">Feed</a>
        </Link>
      </div>
      <h3 className="logo">Logo</h3>
    </nav>

    <div className="user-nav-icon">
      <div className="user-nav-icon-box">
        <img src={bellIcon} alt="notify icon" />
      </div>
      <div className="user-nav-icon-box">
        <img src={settingsIcon} alt="settings icon" />
      </div>
    </div>
  </header>
</div>

CSS:

.container {
  max-width: 100vw;
  display: flex;
  flex-direction: column;


.header {
  display: flex;
  align-items: center;
  height: 5rem;
  color: #fff;
  background-color: black;

  .user-nav {
    width: 100%;
    display: flex;
    align-items: center;

    &-item {
      width: 5.5rem;
      padding: 1.5rem;
      cursor: pointer;
    }

    &-item-link {
      text-decoration: none;
      color: white;
    }

    .logo {
      margin-left: 27%;
    }

    &-icon {
      display: flex;
      align-items: center;
      background-color: white;
      color: red;
      margin-right: 3rem;

      & > * {
        padding: 0 0.8rem;
        cursor: pointer;
      }

      &-icon-notification {
        color: red;
      }
    }
  }
}

}

【问题讨论】:

  • 您必须注意,您的徽标不再是您的弹性容器的直接子代。它更像是一个孙子……哈哈!因此,尝试将徽标作为直接子节点放在 flex 容器中。不要将它放在 flex 容器中的另一个元素中。
  • 好的,当我将徽标作为容器的子项时,我需要给他一些属性以将他移动到 nabvar 中间
  • 在下面试试我的答案。 Flex Box 的问题在于,在容器中,您只能使用 flex-start、flex-end 等方式一次对齐所有项目。因此,请使用不同的方法。请参阅下面的代码,我已经对其进行了测试,它应该适合您。

标签: html css sass flexbox


【解决方案1】:

使用弹性盒子。这将更难实现,我有一个选择。请在 codepen 上测试此代码:

* {
  box-sizing: border-box;
}

.parent{
  width: 100%;
  min-height: 80px;
  background-color: yellow;
  display: relative;
}
.nav-menu,
.icons{
  display: inline-block;
}
.icons{
  float: right;
  margin-left: 75px; /*This will help your icons to never go below the logo element*/
}
.nav-menu{
  margin-right: 75px; /*This will help your nav-menu items to never go below the logo element*/
}
.logo{
  width: 150px;
  height: 40px;
  position: absolute;
  left: 50%;
   background-color: green;
  transform: translateX(-50%);
}
<div class="parent">
  <div class="nav-menu"> Your Menu</div>
  <div class="logo"></div>
  <div class="icons">Your Icons</div>
</div>

【讨论】:

  • 这会将图标从文档流中拉出。响应能力不佳。
  • 你说的“它把图标从文档流中拉出来”是对的,但相对于什么?因为您将它相对于标题定位...并且它将始终位于中间,因为您使用了 % 不固定 px 值。我每次都使用这种方法,因为 flexbox 会根据它们的 with 来定位项目,在这种情况下,徽标不会总是居中...如果构成标题的所有三个部分的宽度都相同,那么它将始终居中。响应能力完全取决于您对@media 的使用...您可以在其中更改任何您想要的内容。
  • 当屏幕变窄时,文字很可能会消失在徽标下方,而不是至少环绕
  • 不,那不是真的...当屏幕变窄时,您需要注意@media 内部发生的情况,即使您没有使用absolute 位置,元素也会变形在某个时候,最左边元素内的文本超出了元素宽度
  • 你作为编码员,控制屏幕变窄时应该发生的事情:)...当文本隐藏在徽标下时...很久以前你会想要隐藏菜单和只需放置菜单切换按钮即可将其转换为移动视图...
【解决方案2】:

您可以简单地将徽标从导航中取出,以便徽标、导航和图标这三者都成为弹性项目,并使用space-between 证明标题的内容。下面是简化的代码。

附: - 将呈现的代码共享为您将来的实现,而不是 JSX/SASS

.container {
  max-width: 100vw;
  display: flex;
  flex-direction: column;
}
.container .header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  height: 5rem;
  color: #fff;
  background-color: black;
}
.container .header .user-nav {
  display: flex;
  align-items: center;
}
.container .header .user-nav-item {
  padding: 1.5rem;
  cursor: pointer;
}
.container .header .user-nav-item-link {
  text-decoration: none;
  color: white;
}
.container .header .user-nav-icon {
  display: flex;
  align-items: center;
  background-color: white;
  color: red;
  margin-right: 3rem;
}
.container .header .user-nav-icon > * {
  padding: 0 0.8rem;
  cursor: pointer;
}
.container .header .user-nav-icon-icon-notification {
  color: red;
}
<div class="container">
  <header class="header">
    <nav class="user-nav">
      <div class="user-nav-item">
        <a class="user-nav-item-link">Overview</a>
      </div>
      <div class="user-nav-item">
        <a class="user-nav-item-link">Search</a>
      </div>
      <div class="user-nav-item">
        <a class="user-nav-item-link">Feed</a>
      </div>
    </nav>
    <h3 class="logo">Logo</h3>
    <div class="user-nav-icon">
      <div class="user-nav-icon-box">
        Bell
      </div>
      <div class="user-nav-icon-box">
        Settings
      </div>
    </div>
  </header>
</div>

【讨论】:

    【解决方案3】:

    这是一个使用 display: flex; 的答案。 Flexbox 最好且优雅地将项目与页面中间对齐,而无需通过 Margin、Transform 等进行俗气的计算...

    <html>
      <head>
        <style>
          *, .container {
            width: 100%;
            top: 0;
            left: 0;
            padding: 0;
            margin: 0;
            color: ivory;
            font-family: Arial,"Helvetica Neue",Helvetica,sans-serif;
            font-size: 13px;
          }
    
          .header {
            display: flex;
            align-items: center;
            padding: 10px;
            background-color: gray;
          }
    
          .user-nav {
            display: flex;
            align-items: center;
            justify-content: center;
            width: 30%;
          }
    
          .user-nav-item {
            display: flex;
            align-items: center;
            justify-content: center;
          }
    
          .logo {
            display: flex;
            align-items: center;
            justify-content: center;
            width: 40%;
          }
    
          .user-nav-icon {
            display: flex;
            align-items: center;
            justify-content: center;
            width: 30%;
          }
        </style>
      </head>
      <body>
        <div class="container">
          <header class="header">
            <nav class="user-nav">
              <div class="user-nav-item">
                <Link href="/">
                  <a class="user-nav-item-link">Overview</a>
                </Link>
              </div>
              <div class="user-nav-item">
                <Link href="/search">
                  <a class="user-nav-item-link">Search</a>
                </Link>
              </div>
              <div class="user-nav-item">
                <Link href="/feed">
                  <a class="user-nav-item-link">Feed</a>
                </Link>
              </div>
            </nav>
            <h3 class="logo">Logoooooooooooooooooooooo</h3>
            <div class="user-nav-icon">
              <div class="user-nav-icon-box">
                <img src={bellIcon} alt="notify icon" />
              </div>
              <div class="user-nav-icon-box">
                <img src={settingsIcon} alt="settings icon" />
              </div>
            </div>
          </header>
        </div>
      </body>
    </html>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-17
      • 2015-12-18
      • 2021-03-03
      • 1970-01-01
      • 2021-04-02
      • 2017-06-11
      • 2017-08-02
      • 2021-12-20
      相关资源
      最近更新 更多