响应式菜单仅使用 "nav" 和 "a" 标签(无 "ul")

Responsive menu using only "nav" and "a" tags (no "ul")

我正在阅读 HTML5 标签的语义,我突然意识到 CSS 菜单的全部是使用无序列表( ul 标签)完成的。这背后是否有特殊原因,或者是否可以仅使用 nava 标签来创建响应式菜单?

最先进的技术:

<nav class="nav_menu">
<ul>
    <li class="nav-item"><a href="#"> Item 1 </a></li>
    <li class="nav-item"><a href="#"> Item 2 </a></li>
    <li class="nav-item"><a href="#"> Item 3 </a></li>
</ul>
</nav>

CSS:

.nav_menu {
  position:relative;
  display:inline-block;
  width:100%;
}
.nav-item {
  width:100%;
  float:none;
}
.nav-item a {
  display:block;
}
@media all and (min-width: 500px) {
  .nav-item {
    float:left;
    width:auto;
  }
  .nav-item a {
    padding:15px 20px;
  }
}

我想达到的效果:

<nav class="nav_menu">
    <a href="#"> Item 1 </a>
    <a href="#"> Item 2 </a>
    <a href="#"> Item 3 </a>
</nav>

CSS:

.nav_menu{
    /*... blah*/
    @media all and (min-width : 500 px){
         /*... blah*/
    }
}
.nav_menu a{
    /*... blah*/
    @media all and (min-width : 500 px){
         /*... blah*/
    }
}

我所说的响应式菜单是指当页面足够大时菜单保持水平,否则它会退回到垂直菜单。我正在寻找没有 Javascript 的简约解决方案(如果可能的话,否则我想解释一下为什么不可能)。

从技术上讲,您没有理由必须使用无序列表和列表项。从语义上讲,锚点是锚点的列表,因此通常导航菜单都是这样构建的。但是,您为 <ul><li> 元素放置的所有样式都可以轻松地放置在 <a> 本身上。

如果这是您想要的极简主义解决方案,那么 CSS3 的 Flexbox 会帮助您...

.nav_menu {
  display: flex;
  align-items: center;
}
.nav_menu a {
    padding: 1em 1.4em;
}
@media all and (max-width: 500px) {
    .nav_menu {
      flex-direction: column; /* CHANGE THE FLOW OF THE ITEMS ON SMALL SCREENS */
    }
}

/* demo */
a{background: orange;}
a:nth-of-type(odd){background: yellow;} 
<nav class="nav_menu">
  <a href="#"> Item 1 </a>
  <a href="#"> Item 2 </a>
  <a href="#"> Item 3 </a>
</nav>