响应式菜单,多级,仅 CSS 和 Javascript,无 jQuery
Responsive Menu, Multi-level, CSS and Javascript ONLY, no jQuery
全部,
仅使用 javascript 和 CSS,我需要创建一个响应式菜单。菜单还必须支持一级子菜单。
由于嵌入式硬件的内存限制,我无法使用外部libraries/frameworks。
我已经尽可能多地浏览了。我发现的示例并不能完全解决我的问题。
- 如果菜单是响应式的,则不支持子菜单...
- 如果它支持子菜单,则子菜单会在菜单内展开,而不是替换它们...
- 如果它满足了我的所有需求,那么它就在 jQuery 中,我无法使用它...
我已经 'piecing' 代码片段 (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>
当然是 "so wrong on so many different levels" ... :-)
你能改进我的代码,使我只使用一次子菜单吗?对 JSFiddle、CodePen 或类似工具的 link 会非常有帮助...
请否jQuery。我只能使用 javascript 和 CSS。但是,如果您知道一个小的 js-css-only 库可以实现我正在寻找的东西(麻省理工学院许可证),那也可以解决问题...... :-)
非常感谢...
文森佐
这是取自 w3schools 的 responsive navigation 的 "not so simple" 演示,由我修改以显示简单的子菜单行为。
此处需要注意的最重要部分是,当您打开另一个子菜单并编辑无响应时,您可能必须创建一个功能来关闭其他子菜单 CSS。
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;
}
}
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;
}
}
<ul class="topnav" id="myTopnav">
<li><a class="active" href="#home">Home</a></li>
<li><a href="#news">News</a></li>
<li><a href="#contact" onclick="openSubMenu()">Contact</a>
<ul class="subnav" id="submenuNav" hidden >
<li><a href="#contact" class="submenu">Sub Menu1</a></li>
<li><a href="#contact" class="submenu">Sub Menu2</a></li>
<li><a href="#contact" class="submenu">Sub Menu3</a></li>
</ul>
</li>
<li><a href="#about">About</a></li>
<li class="icon">
<a href="javascript:void(0);" style="font-size:15px;" onclick="myFunction()">☰</a>
</li>
</ul>
<div style="padding-left:16px">
<h2>Responsive Topnav Example</h2>
<p>Resize the browser window to see how it works.</p>
</div>
全部,
仅使用 javascript 和 CSS,我需要创建一个响应式菜单。菜单还必须支持一级子菜单。
由于嵌入式硬件的内存限制,我无法使用外部libraries/frameworks。
我已经尽可能多地浏览了。我发现的示例并不能完全解决我的问题。
- 如果菜单是响应式的,则不支持子菜单...
- 如果它支持子菜单,则子菜单会在菜单内展开,而不是替换它们...
- 如果它满足了我的所有需求,那么它就在 jQuery 中,我无法使用它...
我已经 'piecing' 代码片段 (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>
当然是 "so wrong on so many different levels" ... :-)
你能改进我的代码,使我只使用一次子菜单吗?对 JSFiddle、CodePen 或类似工具的 link 会非常有帮助...
请否jQuery。我只能使用 javascript 和 CSS。但是,如果您知道一个小的 js-css-only 库可以实现我正在寻找的东西(麻省理工学院许可证),那也可以解决问题...... :-)
非常感谢...
文森佐
这是取自 w3schools 的 responsive navigation 的 "not so simple" 演示,由我修改以显示简单的子菜单行为。
此处需要注意的最重要部分是,当您打开另一个子菜单并编辑无响应时,您可能必须创建一个功能来关闭其他子菜单 CSS。
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;
}
}
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;
}
}
<ul class="topnav" id="myTopnav">
<li><a class="active" href="#home">Home</a></li>
<li><a href="#news">News</a></li>
<li><a href="#contact" onclick="openSubMenu()">Contact</a>
<ul class="subnav" id="submenuNav" hidden >
<li><a href="#contact" class="submenu">Sub Menu1</a></li>
<li><a href="#contact" class="submenu">Sub Menu2</a></li>
<li><a href="#contact" class="submenu">Sub Menu3</a></li>
</ul>
</li>
<li><a href="#about">About</a></li>
<li class="icon">
<a href="javascript:void(0);" style="font-size:15px;" onclick="myFunction()">☰</a>
</li>
</ul>
<div style="padding-left:16px">
<h2>Responsive Topnav Example</h2>
<p>Resize the browser window to see how it works.</p>
</div>