[英]Try to make a little script for responsive multi-level menu
Here is a little menu structure 这是一个小菜单结构
<nav class="main-menu">
<div id="mm-toggle">
<a href="#mm-toggle" id="mm-btn-open">MENU</a>
<a href="#close-menu" id="mm-btn-close">MENU</a>
<ul>
<li><a href="#">Link 1</a></li>
<li>
<a href="#">Link 2<i class="arrow_toggle"></i></a>
<ul>
<li>
<a href="#">Link 2-1<i class="arrow_toggle"></i></a>
<ul>
<li>
<a href="#">Link 2-1-1</a>
</li>
<li>
<a href="#">Link 2-1-2</a>
</li>
</ul>
</li>
<li>
<a href="#">Link 2-2<i class="arrow_toggle"></i></a>
<ul>
<li>
<a href="#">Link 2-1-3<i class="arrow_toggle"></i></a>
<ul>
<li><a href="#">Link 2-1-3-1</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
</nav>
and here is a little part of the css 这是CSS的一小部分
.main-menu .has-inner-sub, .has-sub a i {
padding: 3px;
margin-left: 5px;
border: 1px solid white;
}
.main-menu .has-sub > a i::after {
font-size: 12px;
content: '▼';
margin: 0 5px;
width: 0;
height: 0;
}
.main-menu .has-inner-sub > a i::after {
font-size: 12px;
content: '►';
margin: 0 5px;
width: 0;
height: 0;
}
I am trying to write a script for it to auto add css classes and open-close function when clicked on small devices. 我正在尝试为其编写脚本,以在单击小型设备时自动添加css类和打开关闭功能。
This basic script works however the first has-sub links doesn't. 此基本脚本有效,但是第一个has-sub链接无效。
$('#mm-toggle > ul > li').has("ul").addClass("has-sub");
$('#mm-toggle ul li:not(.has-sub)').has("ul").addClass("has-inner-sub");
$('#mm-toggle li.has-inner-sub, #mm-toggle li.has-sub').on('click', function(event) {
event.preventDefault();
event.stopPropagation();
$(this).children('ul').toggleClass('show');
});
Basically I would like to achive that every .has-sub and .has-inner-sub will have an arrow, and on mobiles both the main links and the dropdown should work when I click the little arrow with padding. 基本上,我希望每个.has-sub和.has-inner-sub都有一个箭头,并且在移动设备上,当我单击带填充的小箭头时,主链接和下拉列表都应该起作用。
God it is much more simple than this long explanation :D 天哪,比这个冗长的解释简单得多:D
I tried something like this, but it works a bit weird: 我尝试了类似的方法,但是效果有点奇怪:
//applying arrows that indicates nested items
$('#mm-toggle > ul > li').has("ul").addClass("has-sub");
$('#mm-toggle ul li:not(.has-sub)').has("ul").addClass("has-inner-sub");
// required only for mobile version
$('#mm-toggle li.has-inner-sub, #mm-toggle li.has-sub').on('click', function(event) {
event.preventDefault();
event.stopPropagation();
$(this).children('ul').toggleClass('show');
});
I appreciate any help :) 感谢您的帮助:)
The point of interest here is: 这里的兴趣点是:
$(this).children('ul').toggleClass('show');
Use instead: 改用:
$(this).toggleClass('has-sub has-inner-sub').children('ul').toggle();
$(function () { $('#mm-toggle > ul > li').has("ul").addClass("has-sub"); $('#mm-toggle ul li:not(.has-sub)').has("ul").addClass("has-inner-sub"); $('#mm-toggle li.has-inner-sub, #mm-toggle li.has-sub').on('click', function(event) { event.preventDefault(); event.stopPropagation(); $(this).toggleClass('has-sub has-inner-sub').children('ul').toggle(); }); });
.main-menu .has-inner-sub, .has-sub ai { padding: 3px; margin-left: 5px; border: 1px solid white; } .main-menu .has-sub > ai::after { font-size: 12px; content: '▼'; margin: 0 5px; width: 0; height: 0; } .main-menu .has-inner-sub > ai::after { font-size: 12px; content: '►'; margin: 0 5px; width: 0; height: 0; }
<script src="https://code.jquery.com/jquery-1.12.1.min.js"></script> <nav class="main-menu"> <div id="mm-toggle"> <a href="#mm-toggle" id="mm-btn-open">MENU</a> <a href="#close-menu" id="mm-btn-close">MENU</a> <ul> <li><a href="#">Link 1</a></li> <li> <a href="#">Link 2<i class="arrow_toggle"></i></a> <ul> <li> <a href="#">Link 2-1<i class="arrow_toggle"></i></a> <ul> <li> <a href="#">Link 2-1-1</a> </li> <li> <a href="#">Link 2-1-2</a> </li> </ul> </li> <li> <a href="#">Link 2-2<i class="arrow_toggle"></i></a> <ul> <li> <a href="#">Link 2-1-3<i class="arrow_toggle"></i></a> <ul> <li><a href="#">Link 2-1-3-1</a></li> </ul> </li> </ul> </li> </ul> </li> </ul> </div> </nav>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.