完全合理的水平菜单,带有图像和分隔符

时间:2016-08-06 15:22:51

标签: html css html5 css3 flexbox

我想实现这个完全合理的水平菜单: enter image description here

使用flexbox进行对齐并且可以正常工作,但我也无法将分离的中点对齐;它们是通过伪类使用css-content制作的。此外,我想知道是否有更好的方法来垂直居中项目,而不是通过添加填充来伪造它。

这是我的代码和fiddle

ul {
  list-style: none;
  padding: 0;
  margin: 0;
  display: flex;
  justify-content: space-between;
}
li.home {
  padding: 0;
}
li {
  vertical-align: middle;
  padding-top: 10px;
}
nav {
  border-bottom: 1px solid black;
  border-top: 1px solid black;
  height: 40px;
}
li::after {
  //padding: 0em 0.4em;
  content: '\00b7';
  pointer-events: none;
}
li.home::after,
li.last::after {
  content: none;
  text-align: justify;
}
<nav id="main-menu">
  <ul>
    <li class="home">
      <a href="/de"><img src="http://dummyimage.com/40x40/000/fff"></a>
    </li>
    <li class="second"><a href="#">Item 1</a></li>
    <li><a href="#">Item 2</a></li>
    <li><a href="#">One more Item</a></li>
    <li><a href="#">Another Item</a></li>
    <li class="last"><a href="#">Contact</a></li>
  </ul>
</nav>

2 个答案:

答案 0 :(得分:3)

&#13;
&#13;
body { margin: 0; }                              /* 1 */

nav {
  height: 40px;
  border-bottom: 1px solid black;
  border-top: 1px solid black;
}

ul {
    display: flex;
    justify-content: space-between;              /* 2 */
    align-items: center;                         /* 2 */
    height: 100%;
    list-style: none;
    padding: 0;
    margin: 0;
}

li:not(.home) {
    flex: 1;                                      /* 3 */
    height: 100%;
    border: 1px dashed red;                       /* 4 */
    background-color: lightgreen;                 /* 4 */
}

li:not(.home) > a {                               /* 5 */
    display: flex;                    
    justify-content: center;
    align-items: center;
    height: 100%;
}

li img { vertical-align: bottom; }                /* 6 */

li { position: relative; }                        /* 7 */

li:not(.home):not(:last-child)::before {          /* 8 */
    position: absolute;
    content: '\26AB';                             /* 4 */
    left: 100%;
    top: 50%;
    transform: translate(-50%,-50%);
    z-index: 1;
    pointer-events: none;        
}
&#13;
<nav id="main-menu">
  <ul>
    <li class="home">
      <a href="/de"><img src="http://dummyimage.com/40x40/000/fff"></a>
    </li>
    <li class="second"><a href="#">Item 1</a></li>
    <li><a href="#">Item 2</a></li>
    <li><a href="#">One more Item</a></li>
    <li><a href="#">Another Item</a></li>
    <li class="last"><a href="#">Contact</a></li>
</ul>
&#13;
&#13;
&#13;

jsFiddle

注意:

  1. Remove default margins on body element
  2. Methods for Aligning Flex Items
  3. Consume all remaining space with flex-grow property
  4. 边框,背景颜色和较大的子弹仅用于说明目的
  5. 启用锚元素以完全覆盖列表项空间并将文本与flex属性对齐
  6. Remove baseline alignment(即图片下方的空白处)
  7. Establish nearest positioned ancestor for absolute positioning
  8. Use absolute positioning to align bullets

答案 1 :(得分:1)

您可以使用array垂直居中项目,但我认为使用align-self: center;:before等伪元素无法实现点分隔符。

我建议对分隔符使用单独的:after标记,如下所示:

请注意,您的图片元素需要<li>才能拥有合适的高度。

&#13;
&#13;
display: block;
&#13;
ul {
  list-style: none;
  padding: 0;
  margin: 0;
  display: flex;
  justify-content: space-between;
}
img {
    display: block;
}
li.home {
  padding: 0;
}
li {
  align-self: center;
}
nav {
  border-bottom: 1px solid black;
  border-top: 1px solid black;
  height: 40px;
}
&#13;
&#13;
&#13;

Fiddle version