【问题标题】:Dynamic indenting of dropdown menu下拉菜单的动态缩进
【发布时间】:2016-04-01 15:15:29
【问题描述】:

我创建了一个嵌套列表,下拉菜单。

问题:CSS 仅处理 1 级嵌套菜单。我不知道如何设置嵌套项的位置,以便它可以处理多个级别,而无需我在 CSS 文件中设置这些规则。

这是我一直在使用的fiddle

CSS:

ul {
  text-align: left;
  display: inline;
  margin: 0;
  padding: 15px 4px 17px 0;
  list-style: none;
  -webkit-box-shadow: 0 0 5px rgba(0, 0, 0, 0.15);
  -moz-box-shadow: 0 0 5px rgba(0, 0, 0, 0.15);
  box-shadow: 0 0 5px rgba(0, 0, 0, 0.15);
}
ul li {
  font: bold 12px/18px sans-serif;
  display: inline-block;
  margin-right: -4px;
  position: relative;
  padding: 15px 20px;
  background: #fff;
  cursor: pointer;
  -webkit-transition: all 0.2s;
  -moz-transition: all 0.2s;
  -ms-transition: all 0.2s;
  -o-transition: all 0.2s;
  transition: all 0.2s;
}
ul li:hover {
  background: #555;
  color: #fff;
}
ul li ul {
  padding: 0;
  position: absolute;
  top: 48px;
  left: 0;
  width: 150px;
  -webkit-box-shadow: none;
  -moz-box-shadow: none;
  box-shadow: none;
  display: none;
  opacity: 0;
  visibility: hidden;
  -webkit-transiton: opacity 0.2s;
  -moz-transition: opacity 0.2s;
  -ms-transition: opacity 0.2s;
  -o-transition: opacity 0.2s;
  -transition: opacity 0.2s;
}
ul li ul li { 
  background: #555; 
  display: block; 
  color: #fff;
  text-shadow: 0 -1px 0 #000;
}
ul li ul li:hover { background: #666; }
ul li:hover ul {
  display: block;
  opacity: 1;
  visibility: visible;
}

【问题讨论】:

    标签: javascript jquery html css drop-down-menu


    【解决方案1】:

    尝试使用child selector a > b 而不是descendant selector a b

    您可能不需要到处都有子选择器,对于常见的样式,您可以使用后代选择器本身,我只是到处都使用它,它可能不适合您!

    var items = [{
      "id": "1",
      "title": "Menu A",
      "link": "http: //www.google.com"
    }, {
      "id": "2",
      "title": "Menu B",
      "link": "http://www.google.com"
    }, {
      "id": "3",
      "title": "Menu C",
      "link": "http://www.google.com"
    }, {
      "id": "4",
      "title": "Menu D",
      "link": "http://www.google.com"
    }, {
      "id": "5",
      "title": "Menu E",
      "link": "http://www.google.com"
    }, {
      "id": "6",
      "title": "Menu 1A",
      "link": "http://www.google.com",
      "parent": "1;#Menu A"
    }, {
      "id": "7",
      "title": "Menu 2A",
      "link": "http://www.google.com",
      "parent": "1;#Menu A"
    }, {
      "id": "8",
      "title": "Menu 3A",
      "link": "http://www.google.com",
      "parent": "1;#Menu A"
    }, {
      "id": "9",
      "title": "Menu 1B",
      "link": "http://www.google.com",
      "parent": "2;#Menu B"
    }, {
      "id": "10",
      "title": "Menu 2B",
      "link": "http://www.google.com",
      "parent": "2;#Menu B"
    }, {
      "id": "11",
      "title": "Menu 1C",
      "link": "http://www.google.com",
      "parent": "3;#Menu C"
    }, {
      "id": "12",
      "title": "Menu 2C",
      "link": "http://www.google.com",
      "parent": "3;#Menu C"
    }, {
      "id": "13",
      "title": "Menu 3C",
      "link": "http://www.google.com",
      "parent": "3;#Menu C"
    }, {
      "id": "14",
      "title": "Menu 1D",
      "link": "http://www.google.com",
      "parent": "4;#Menu D"
    }, {
      "id": "15",
      "title": "Menu 2D",
      "link": "http://www.google.com",
      "parent": "14;#Menu 1D"
    }, {
      "id": "16",
      "title": "Menu 3D",
      "link": "http://www.google.com",
      "parent": "15;#Menu 2D"
    }, {
      "id": "17",
      "title": "Menu 1E",
      "link": "http://www.google.com",
      "parent": "5;#Menu E"
    }, {
      "id": "18",
      "title": "Menu 2E",
      "link": "http://www.google.com",
      "parent": "17;#Menu 1E"
    }]
    
    items = $.map(items, function(item) {
      return {
        id: item.id,
        title: item.title,
        link: item.link,
        parent: (item.parent) ? item.parent.split(";")[0] : false
      }
    })
    console.log(items)
    
    
    var container = $("#container");
    
    (function createMenu() {
      $.each(items, function(i, v) {
        //Check if item has parent
        if (v.parent == false) {
            // Check if container has first level ul
            if (container.find("ul#topLevel").length == 0) {
              container.append($("<ul>").attr("id","topLevel"))
            } else {
              console.log('firstlevel exist')
            }
    
          //Add items to first level
          container
          .find('ul')
          .append($("<li>")
            .text(v.title)
            .attr('id', v.id)
            )
        }else{
          var parent = v.parent;
          var parentElement = $("#"+parent);
    
          if( parentElement.find('ul').length == false ) {
            
            parentElement.append($("<ul>").attr({
              id: 'subLevelFor_'+ parent
            }))
          }
    
          $("ul#subLevelFor_"+ parent)
          .append($("<li>")
            .text(v.title)
            .attr('id', v.id)
            )
        }
      })
      console.log('done')
    })();
    body {
      font-family: 'Lucida Grande', 'Helvetica Neue', Helvetica, Arial, sans-serif;
      padding: 20px 50px 150px;
      font-size: 13px;
      text-align: center;
      background: #E3CAA1;
    }
    
    ul {
      text-align: left;
      display: inline;
      margin: 0;
      padding: 15px 4px 17px 0;
      list-style: none;
      -webkit-box-shadow: 0 0 5px rgba(0, 0, 0, 0.15);
      -moz-box-shadow: 0 0 5px rgba(0, 0, 0, 0.15);
      box-shadow: 0 0 5px rgba(0, 0, 0, 0.15);
    }
    ul > li {
      font: bold 12px/18px sans-serif;
      display: inline-block;
      margin-right: -4px;
      position: relative;
      padding: 15px 20px;
      background: #fff;
      cursor: pointer;
      -webkit-transition: all 0.2s;
      -moz-transition: all 0.2s;
      -ms-transition: all 0.2s;
      -o-transition: all 0.2s;
      transition: all 0.2s;
    }
    ul > li:hover {
      background: #555;
      color: #fff;
    }
    ul > li > ul {
      padding: 0;
      position: absolute;
      top: 48px;
      left: 0;
      width: 150px;
      -webkit-box-shadow: none;
      -moz-box-shadow: none;
      box-shadow: none;
      display: none;
      opacity: 0;
      visibility: hidden;
      -webkit-transiton: opacity 0.2s;
      -moz-transition: opacity 0.2s;
      -ms-transition: opacity 0.2s;
      -o-transition: opacity 0.2s;
      -transition: opacity 0.2s;
    }
    ul > li > ul > li { 
      background: #555; 
      display: block; 
      color: #fff;
      text-shadow: 0 -1px 0 #000;
    }
    ul > li > ul > li:hover { background: #666; }
    ul > li:hover > ul {
      display: block;
      opacity: 1;
      visibility: visible;
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <div id="container"></div>

    【讨论】:

      【解决方案2】:

      我只是在你的 css 中更改了一些规则:

      ul li:hover > ul { /* I just added ">" so it affect's only next ul. */
        display: block;
        opacity: 1;
        visibility: visible;
      }
      
      ul ul li > ul { /* This will fix the position for children uls */
          top: 0;
          left: 100%;
      }
      

      现场示例:https://jsfiddle.net/xwazzo/pk7kcqb9/

      【讨论】:

      • 给孩子们定位是个好主意。
      • 谢谢@sabithpocker!我将把这个链接留给Horizontal submenus for a vertical main menu post,因为我认为相关并且解释得很好。
      • 该死,我想在li 内的锚链接中,它把一切都搞砸了
      • 如果您有现场示例或更多详细信息,我可以为您提供帮助。 @蝙蝠侠
      • 没关系,我最终弄明白了。再次感谢您的帮助
      【解决方案3】:

      不要直接覆盖标签,否则扩展起来会更复杂。创建 CSS 类以节省您的时间。如果您像这样编写 css,例如:“ul li ul li”,将来会变得更加复杂。并且还尝试使用“ul > li”选择器将样式应用于孩子。不是孩子的孩子。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-11-05
        • 2018-09-29
        • 2012-08-29
        • 2014-06-16
        • 1970-01-01
        相关资源
        最近更新 更多