slideDown菜单-添加更多级别的问题

slideDown Menu - Issue adding more levels

本文关键字:问题 多级 菜单 添加 slideDown      更新时间:2023-10-07

我有这个菜单正在处理…

最初,"二级"将出现在"一级"之下。我一直能把它移到第二列,一直坚持到顶部。据我所见,它在起作用!

我遇到的问题是添加更多的列,因为我至少需要另一个级别,可能是两个级别。

我想我已经处理了HTML部分(参见项目2-项目2-1-项目2-1-1),现在的问题是脚本。我试着复制当前的,但就是无法使其工作。。。

如有任何帮助,我们将不胜感激。感谢

Fiddle

HTML:

<div class="wrapper">
<ul>
    <li class="level-1"><a href="#">Item 1</a>
        <ul class="level-2">
        <li><a href="#">Item 1-1</a></li>
        <li><a href="#">Item 1-2</a></li>
        </ul>
    </li>
    <li class="level-1"><a href="#">Item 2</a>
        <ul class="level-2">
        <li><a href="#">Item 2-1</a>
            <ul class="level-3">
            <li><a href="#">Item 2-1-1</a></li>
            </ul>
        </li>
        </ul>
    </li>
    <li class="level-1"><a href="#">Item 3</a>
        <ul class="level-2">
        <li><a href="#">Item 3-1</a></li>
        <li><a href="#">Item 3-2</a></li>
        <li><a href="#">Item 3-3</a></li>
        </ul>
    </li>
    <li class="level-1"><a href="#">Item 4</a>
        <ul class="level-2">
        <li><a href="#">Item 4-1</a></li>
        <li><a href="#">Item 4-2</a></li>
        </ul>
    </li>
    </ul>
</div>

JS:

$('.level-2').hide();
  $('.level-1').on('click', function(){
    if(!($(this).children('.level-2').is(':visible'))){
      $('.level-2').slideUp();
      $(this).children('.level-2').slideDown();
    } else {
    $('.level-2').slideUp();
  }
});
$('.level-2').on('click', function(e){
  e.stopPropagation();
});

CSS:

body{
    margin: 0px;
    border: 0;
    overflow: hidden;
}
ul {
    list-style: none;
    margin: 0;
    padding: 0;
    color: #000000;
}
ul li {
    position: relative;
}
li ul {
    position: absolute;
    left: 120px;
    top: 0;
    display: none;
}
ul li a {
    text-decoration: none;
    color: #000000;
}
.level-1 {
    position: relative;
    top: 20px;
    left: 20px;
    font-family: Arial, Helvetica, sans-serif;
    font-size: 11px;
    font-weight: normal;
    line-height: 15px;
    letter-spacing: 0em;
    text-transform: uppercase;
}
.level-2 {
    position: fixed;
    top: 20px;
    font-family: Arial, Helvetica, sans-serif;
    font-size: 11px;
    font-weight: normal;
    line-height: 15px;
    letter-spacing: 0em;
    text-transform: uppercase;
}
.level-3 {
    position: fixed;
    top: 20px;
    font-family: Arial, Helvetica, sans-serif;
    font-size: 11px;
    font-weight: normal;
    line-height: 15px;
    letter-spacing: 0em;
    text-transform: uppercase;
}

我已经更新了CSS,请尝试一下。它会帮助你的。

body{
	margin: 0px;
	border: 0;
  overflow: hidden;
}
ul {
	list-style: none;
	margin: 0;
	padding: 0;
	color: #000000;
}
ul li {
	position: relative;
}
li ul {
	position: absolute;
	left: 120px;
	top: 0px;
	display: none;
}
ul li a {
	text-decoration: none;
	color: #000000;
}
.level-1 {
	position: relative;
	top: 20px;
	left: 20px;
	font-family: Arial, Helvetica, sans-serif;
	font-size: 11px;
	font-weight: normal;
	line-height: 15px;
	letter-spacing: 0em;
	text-transform: uppercase;
    background:#f5f5f5;
    width:220px;
}
.level-2, .level-3 {
	top: 20px;
	font-family: Arial, Helvetica, sans-serif;
	font-size: 11px;
	font-weight: normal;
	line-height: 15px;
	letter-spacing: 0em;
	text-transform: uppercase;
}
.level-1 > .level-2, .level-1 .level-2 > .level-3{position:absolute; right:10px; top:0px; left:220px; width:220px; background:#f8f8f8;}

感谢

通过你的小提琴,我可以看到两个问题:

  1. 您正在JS中检查:visible,但CSS正在li ul规则上设置display:none
  2. 当可见时,第三个菜单级别将出现在第二个级别的下面(这更像是一个UX/设计问题,而不是JS的问题)

第二个问题很容易通过一些CSS来解决,例如:

.level-3 { left: 200px; }

我认为,第一个问题是因为您在CSS中使用"display"将元素设置为隐藏,但试图在JS检查:visible而不是display规则的值时切换它。这个stackoverflow的答案解释了为什么这可能会导致问题,可能比我更好,但我认为问题是JS找不到用CSS设置为display:none的对象。

我创建了一个fiddle,它给出了一个例子,说明如何通过替换JS:中的这一行来避免这个问题

if(!($(this).children('.level-2').is(':visible'))){

这个:

if($('.level-3').css('display') === 'none'){ 

(我保留了单击.level-1的逻辑,但为了便于比较,更改了单击.level-2的逻辑。)

在我的例子中,我还为不同的列表项目添加了彩色背景,以提高可见性——这样可以更容易地看到项目是否以这种方式出现在一起。我希望这些能有所帮助!