响应式菜单,多级,CSS和Javascript,没有jQuery

时间:2016-10-16 12:57:49

标签: javascript css menu responsive

所有

仅使用javascript和CSS ,我需要创建一个自适应菜单。菜单还必须支持一级子菜单。

由于嵌入式硬件的内存限制,我无法使用外部库/框架。

我尽可能多地浏览。我发现的例子并没有完全解决我的问题。

  • 如果菜单有响应,则不支持子菜单......
  • 如果它支持子菜单,子菜单会在菜单中展开,而不是替换它们......
  • 如果它能完成我需要的一切,那么它就是jQuery,我不能使用它......

我一直在'拼凑'代码片段(http://codepen.io/vpappano/pen/NRLRWJ

但是,我现在遇到了以下问题。因为我嵌入了子菜单(id =“myDropdown”)

<div class="dropdown-content"  id="myDropdown">
   <a href="#">Link 1</a>
   <a href="#">Link 2</a>
   <a href="#">Link 3</a>
</div>

在主菜单(id =“myTopnav”)中,我无法在最小化状态下显示子菜单。

我能想出的唯一解决方案是复制子菜单(id =“myDropdown2”)

<div class="dropdown-content"  id="myDropdown2">
   <a href="#">Link 1</a>
   <a href="#">Link 2</a>
   <a href="#">Link 3</a>
</div>

当然,“在如此多的不同层面上是如此错误”......: - )

您是否可以通过仅使用一次子菜单的方式改进我的代码?指向JSFiddle,CodePen或类似链接的链接非常有用......

请不要jQuery 。我只能使用javascript和CSS。但是,如果你知道一个小的js-css-only库可以实现我正在寻找的东西(麻省理工学院许可证),那也可以解决问题...: - )

非常感谢你......

蒙特拉

1 个答案:

答案 0 :(得分:1)

这是一个&#34;不那么简单&#34;来自w3schools的responsive navigation的演示,并由我修改以显示简单的子菜单行为。

此处需要注意的最重要的部分是,当您打开另一个子菜单并编辑非响应CSS时,您可能必须创建一个关闭其他子菜单的函数。

&#13;
&#13;
vCiph
&#13;
function myFunction() {
    var x = document.getElementById("myTopnav");
    if (x.className === "topnav") {
        x.className += " responsive";
    } else {
        x.className = "topnav";
    }
}
function openSubMenu() {
    var x = document.getElementById("submenuNav");
    if (x.hidden === true) {
        x.hidden = false;
    } else {
        x.hidden = true;
    }
}
&#13;
body {margin:0;}
ul.topnav {
  list-style-type: none;
  margin: 0;
  padding: 0;
  overflow: hidden;
  background-color: #333;
}

ul.topnav li {float: left;}

ul.topnav li a {
  display: inline-block;
  color: #f2f2f2;
  text-align: center;
  padding: 14px 16px;
  text-decoration: none;
  transition: 0.3s;
  font-size: 17px;
}

ul.topnav li a:hover {background-color: #555;}

ul.topnav li.icon {display: none;}

@media screen and (max-width:680px) {
  ul.topnav li:not(:first-child) {display: none;}
  ul.topnav li.icon {
    float: right;
    display: inline-block;
  }
}

@media screen and (max-width:680px) {
  ul.topnav.responsive {position: relative;}
  ul.topnav.responsive li.icon {
    position: absolute;
    right: 0;
    top: 0;
  }
  ul.topnav.responsive li {
    float: none;
    display: inline;
  }
  ul.topnav.responsive li a {
    display: block;
    text-align: left;
  }
}
&#13;
&#13;
&#13;