Flexbox - 如何在中心制作徽标并将其他项目包裹起来

Flexbox - how to make logo in the center and wrap others items around

我有以下菜单(.logo.socials 由 JS 放在里面)我需要 .logo 总是在页面中间,其他项目同样环绕.

<ul class="menu">
  <li><a href="/">Homepage</a></li>
  <li><a href="/contact/">Contact</a></li>
  <li><a href="/documentary/">Documentary</a></li>
  <div class="logo"></div>
  <li><a href="/stories/">Stories</a></li>
  <li><a href="/weddings/">Weddings</a></li>
  <div class="socials">
    <a href="https://www.instagram.com"><i class="sprite-instagram">i</i></a>
    <a href="https://www.facebook.com"><i class="sprite-email">f</i></a>
  </div>
</ul>

使用 CSS 居中项目,但我不知道如何将 .logo 放在中间:

.menu {
  bottom: 0;
  margin-left: auto;
  margin-right: auto;
  left: 0;
  right: 0;
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  width: 100%;
  position: relative;
  -ms-flex-pack: distribute;
  justify-content: space-around;
  -webkit-box-align: center;
  -ms-flex-align: center;
  align-items: center;
}

这里是fiddle如果你想看一看:https://jsfiddle.net/kybernaut/134L25vc/1/

另一个 li 通过推动 flex 项目使其变小。这是不可能的,而您所有的 li 都没有足够的 space 来显示。

您正在使用弹性容器,它使用 space 分布来定位项目。

为了使徽标水平居中,其左右两侧的内容需要占据相同数量的 space。这将创造平等的平衡,徽标可以居中。

或者,您可以使用绝对定位从正常流程中删除徽标。然后使用 lefttransform 使徽标居中。

此处详细介绍了这两种方法(和其他方法):

这是一个例子:

.menu {
  display: flex;
  position: relative;
  justify-content: space-around;
  height: 80px;  
  margin-left: auto;
  margin-right: auto;
  padding: 0;
}

.menu > * {
  flex: 1;                 /* see linked explanation below */
  list-style-type: none;
  border: 1px dashed black;
  display: flex;
  align-items: center;
  justify-content: center;
  text-align: center;
}

.logo {
  flex: 0 0 200px;           /* also try `flex: 2` */
  background-color: red;  
}
<ul class="menu">
  <li><a href="/">Homepage</a></li>
  <li><a href="/contact/">Contact</a></li>
  <li><a href="/documentary/">Documentary</a></li>
  <div class="logo"></div>
  <li><a href="/stories/">Stories</a></li>
  <li><a href="/weddings/">Weddings</a></li>
  <div class="socials">
    <a href="https://www.instagram.com"><i class="sprite-instagram">i</i></a>
    <a href="https://www.facebook.com"><i class="sprite-email">f</i></a>
  </div>
</ul>

flex: 1 的工作原理:

此代码应该适合您(我假设您不想要要点,所以我还添加了(列表样式:none)....

.menu {
  sisplay: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  width: 100%;
  position: relative;
  -ms-flex-pack: distribute;
  justify-content: space-around;
  -webkit-box-align: center;
  -ms-flex-align: center;
  align-items: center;
  list-style: none;
  padding: 0px;
  margin: 0px;
}

.menuitem {
  width: 14.28%;
  text-align: center;
}

.logo {
  width: 14.28%;
  text-align: center;
}
<ul class="menu">
  <li class="menuitem"><a href="/">Homepage</a></li>
  <li class="menuitem"><a href="/contact/">Contact</a></li>
  <li class="menuitem"><a href="/documentary/">Documentary</a></li>
  <li class="logo"><img src="https://www.logogarden.com/wp-content/uploads/lg-index/Example-Logo-6.jpg" width="100%"></li>
  <li class="menuitem"><a href="/stories/">Stories</a></li>
  <li class="menuitem"><a href="/weddings/">Weddings</a></li>
  <li class="menuitem">
    <div class="socials">
      <a href="https://www.instagram.com"><i class="sprite-instagram">i</i></a>
      <a href="https://www.facebook.com"><i class="sprite-email">f</i></a>
    </div>
  </li>
</ul>