简体   繁体   English

带下拉菜单

[英]Menu with dropdown

I need this menu to have more than one Menu ex: "Item 2". 我需要此菜单具有多个菜单,例如:“项目2”。

Once "Item 2" opens the "Item 1" closes. 一旦“项目2”打开,“项目1”将关闭。

All the rest should work as it works now. 所有其余部分都应该按现在的方式工作。

arrow rotates 箭头旋转

menu stay open if user clicks in the website or sub menus 如果用户单击网站或子菜单,则菜单保持打开状态

etc 等等

HTML: HTML:

<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/font-
awesome/4.3.0/css/font-awesome.min.css">

<div id="container">
 Item 1<i id="icon" class="fa fa-arrow-down"></i>
</div>
<ul id="test" class="hide">
  <li>sub item 1</li>
  <li>sub item 2</li>
</ul>

CSS: CSS:

.fa-arrow-down{
transform: rotate(-90deg);
transition: transform 1s linear;
}

.fa-arrow-down.open{
transform: rotate(0deg);
transition: transform 1s linear;
}

.hide {
display:none;
}

.show {
display: inline;
}

JS: JS:

(function(document) {
    var div = document.getElementById('container');
    var icon = document.getElementById('icon');
    var test = document.getElementById('test');
    var open = false;

    div.addEventListener('click', function() {
        if (open) {
            icon.className = 'fa fa-arrow-down';  
            test.className = 'hide';  
        } else {
            icon.className = 'fa fa-arrow-down open';
            test.className = 'show';  
        }

        open = !open;
    });
})(document);

JS Bin JS斌

please find working solution at following JS Bin Link 请在以下JS Bin Link中找到有效的解决方案

https://jsbin.com/jedulux/1/edit?html,css,js,output https://jsbin.com/jedulux/1/edit?html,css,js,输出

I have added JQuery for handling toggling 我已经添加了用于处理切换的JQuery

$('#container').on('click', 'ul li', function() {
    $(this).find('ul').toggle()
    $(this).find('i').toggleClass('open')
});

Modified HTML 修改后的HTML

<div id="container" style="display:inline-block">
    <ul id="items">
      <li>
        Item 1 <i id="icon" class="fa fa-arrow-down"></i>
        <ul style="display:none">
          <li>Sub Item 1</li>
          <li>Sub Item 2</li>
        </ul>
      </li>
      <li>
        Item 2 <i id="icon" class="fa fa-arrow-down"></i>
        <ul style="display:none">
          <li>Sub Item 3</li>
          <li>Sub Item 4</li>
        </ul>
      </li> 
    </ul>
  </div>

Modified CSS 修改后的CSS

.fa-arrow-down{
  transform: rotate(-90deg);
  transition: transform 1s linear;
}

.fa-arrow-down.open{
  transform: rotate(0deg);
  transition: transform 1s linear;
}

.hide {
  display:none;
}

.show {
  display: block;
}

ul {
  list-style-type: none;
  padding: 0;
}

ul#items > li {
  float: left
}

ul#items > li > ul {
  position: absolute;
}

Please note that styling may be not what you have expected, but I guess you can style it as per your need. 请注意,样式可能不是您期望的,但是我想您可以根据需要对其进行样式设置。

Edited: 编辑:

JS Bin : https://jsbin.com/jedulux/edit?html,css,output JS Bin: https//jsbin.com/jedulux/edit? html,css, output

JavaScript: JavaScript:

$('#container').on('click', 'ul li', function() {
  var self = this;
  $('#container > ul > li').each(function(index, item) {
    if (item == self) {
      $(item).find('ul').toggle()
      $(this).find('i').toggleClass('open')
    } else {
      $(item).find('ul').hide()
      $(this).find('i').removeClass('open')
    }
  })
});

Maybe this would solve your problem: 也许这可以解决您的问题:

HTML 的HTML

<div id="container">
  Item 1<i id="icon" class="fa fa-arrow-down"></i>
</div>  
<ul id="test" class="hide">
  <li>
    <div id="containers1">
      Item 1-1<i id="icons1" class="fa fa-arrow-down"></i>
    </div>
    <ul id="tests1" class="hide">
      <li>Item 1-1-1</li>
      <li>Item 1-1-2</li>
    </ul>
  </li>
  <li>
    <div id="containers2">
      Item 1-2<i id="icons2" class="fa fa-arrow-down"></i>
    </div>
    <ul id="tests2" class="hide">
      <li>Item 1-1-1</li>
      <li>Item 1-2-2</li>
    </ul>
  </li>
</ul>

You can of course use classes and use parent element and child element selectors to further simplify it (I did not have enough Time for it.) 您当然可以使用classes并使用parent elementchild element选择器进一步简化它(我没有足够的时间来做)。

CSS 的CSS

.fa-arrow-down{
  transform: rotate(-90deg);
  transition: transform 1s linear;
}
.fa-arrow-down.open{
  transform: rotate(0deg);
  transition: transform 1s linear;
}
.hide {
  display:none;
}
.show {
  display: inline;
}

JavaScript (No jQuery) JavaScript (无jQuery)

(function(document){
  var div = document.getElementById('container');
  var icon = document.getElementById('icon');
  var test = document.getElementById('test');
  var open = false;
  div.addEventListener('click', function(){
    if(open){
      icon.className = 'fa fa-arrow-down';  
      test.className = 'hide';  
    }
    else{
      icon.className = 'fa fa-arrow-down open';
      test.className = 'show';  
    }
    open = !open;
  });
  var divs1 = document.getElementById('containers1');
  var icons1 = document.getElementById('icons1');
  var tests1 = document.getElementById('tests1');
  var opens1 = false;
  divs1.addEventListener('click', function(){
    if(opens1){
      icons1.className = 'fa fa-arrow-down';  
      tests1.className = 'hide';  
    }
    else{
      icons1.className = 'fa fa-arrow-down open';
      tests1.className = 'show';  
    }
    opens1 = !opens1;
  });
  var divs2 = document.getElementById('containers2');
  var icons2 = document.getElementById('icons2');
  var tests2 = document.getElementById('tests2');
  var opens2 = false;
  divs2.addEventListener('click', function(){
    if(opens2){
      icons2.className = 'fa fa-arrow-down';  
      tests2.className = 'hide';  
    }
    else{
      icons2.className = 'fa fa-arrow-down open';
      tests2.className = 'show';  
   }    
   opens2 = !opens2;
 });
})(document);

Here is where using classes, etc. would have helped (like I made 3 separate functions, however, using classes would shorten to 1). 这是使用类等会有所帮助的地方(例如我制作了3个单独的函数,但是使用类会缩短为1)。

Include this 包括这个

 <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css">

No jquery, but I have written my own logic instead of yours; 没有jquery,但是我写了我自己的逻辑而不是你的逻辑;

Some issue with loading font-awesome.css; 加载font-awesome.css时出现一些问题; logic wise the code is solid; 在逻辑上,代码是可靠的;

Note: You may not feel the arrow movement in snippet; 注意:您可能不会感觉到片段中的箭头移动; copy into html and see it working. 复制到html并查看它是否有效。

Hope that's OK. 希望没事。

 var icon = document.getElementById('icon'); var icon1 = document.getElementById('icon1'); var test = document.getElementById('test'); var test1 = document.getElementById('test1'); var secondMenuOpen = false; var firstMenuOpen = false; icon.onclick = function() { if(!firstMenuOpen) openFirstMenu(); else closeFirstMenu(); } icon1.onclick = function() { if(!secondMenuOpen) openSecondMenu(); else closeSecondMenu(); checkFirstMenu(); } function checkFirstMenu() { if(firstMenuOpen) closeFirstMenu(); } function closeFirstMenu() { icon.classList.remove('open'); test.classList.add('hide'); firstMenuOpen = false; } function openFirstMenu() { icon.classList.add('open'); test.classList.remove('hide'); firstMenuOpen = true; } function closeSecondMenu() { icon1.classList.remove('open'); test1.classList.add('hide'); secondMenuOpen = false; } function openSecondMenu() { icon1.classList.add('open'); test1.classList.remove('hide'); secondMenuOpen = true; } 
 .fa-arrow-down{ transform: rotate(-90deg); transition: transform 1s linear; } .fa-arrow-down.open{ transform: rotate(0deg); transition: transform 1s linear; } .hide { display:none; } .show { display: inline; } 
 <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css"> <div id="container"> Item 1<i id="icon" class="fa fa-arrow-down"></i> </div> <ul id="test" class="hide"> <li>sub item 1</li> <li>sub item 2</li> </ul> <div id="container1"> Item 2<i id="icon1" class="fa fa-arrow-down"></i> </div> <ul id="test1" class="hide"> <li>sub item 1</li> <li>sub item 2</li> </ul> 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM