Flexbox - 如何在中心制作徽标并包装其他物品

时间:2017-09-07 19:56:08

标签: html css css3 flexbox centering

我有以下菜单(.logo.socials由JS放在里面)我需要.logo总是在页面中间,其他项目同样包围。< / p>

<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;
}

如果你想看看,这是小提琴:https://jsfiddle.net/kybernaut/134L25vc/1/

3 个答案:

答案 0 :(得分:2)

您正在使用Flex容器,该容器使用空间分布来定位项目。

为了使徽标水平居中,左侧和右侧的内容需要占用相同的空间。这将创造平衡,徽标可以居中。

或者,您可以使用绝对定位从正常流中移除徽标。然后使用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如何运作:

答案 1 :(得分:0)

另一个li通过推动它使弹性项更小。这是不可能的,而你的所有li都没有足够的空间来展示。

答案 2 :(得分:0)

这段代码应该适合你(我觉得你不想要子弹点,所以我添加了(list-style: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>