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。这将创造平等的平衡,徽标可以居中。
或者,您可以使用绝对定位从正常流程中删除徽标。然后使用 left
和 transform
使徽标居中。
此处详细介绍了这两种方法(和其他方法):
这是一个例子:
.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>
我有以下菜单(.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。这将创造平等的平衡,徽标可以居中。
或者,您可以使用绝对定位从正常流程中删除徽标。然后使用 left
和 transform
使徽标居中。
此处详细介绍了这两种方法(和其他方法):
这是一个例子:
.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>