Javascript 如何创建没有嵌套列表的下拉菜单?

Javascript 如何创建没有嵌套列表的下拉菜单?,javascript,jquery,css,drop-down-menu,html-lists,Javascript,Jquery,Css,Drop Down Menu,Html Lists,我试图实现一个基本的css下拉菜单,列表中没有嵌套列表。换句话说,正常的方式是: <ul> <li><a>Blah</a></li> <li><a>Blah Parent</a> <ul> <li><a>Blah Child</a></li> </ul>

我试图实现一个基本的css下拉菜单,列表中没有嵌套列表。换句话说,正常的方式是:

<ul>
    <li><a>Blah</a></li>
    <li><a>Blah Parent</a>
        <ul>
            <li><a>Blah Child</a></li>
        </ul>
    </li>
</ul>
<ul>
    <li><a>Blah</a></li>
    <li><a>Blah Parent</a></li>
    <li class="childitem"><a>Blah Parent</a><li>
    <li class="childitem"><a>Blah Parent</a><li>
    <li><a>Blah</a></li>
    <li><a>Blah</a></li>
    <li class="childitem"><a>Blah Parent</a><li>
    <li class="childitem"><a>Blah Parent</a><li>
</ul>
  • 废话
  • 无聊的父母
    • 胡说八道的孩子
我需要的方法是:

<ul>
    <li><a>Blah</a></li>
    <li><a>Blah Parent</a>
        <ul>
            <li><a>Blah Child</a></li>
        </ul>
    </li>
</ul>
<ul>
    <li><a>Blah</a></li>
    <li><a>Blah Parent</a></li>
    <li class="childitem"><a>Blah Parent</a><li>
    <li class="childitem"><a>Blah Parent</a><li>
    <li><a>Blah</a></li>
    <li><a>Blah</a></li>
    <li class="childitem"><a>Blah Parent</a><li>
    <li class="childitem"><a>Blah Parent</a><li>
</ul>
  • 废话
  • 无聊的父母
  • Blah Parent
  • Blah Parent
  • 废话
  • 废话
  • Blah Parent
  • Blah Parent
纯css有什么方法可以做到这一点吗?或者使用一些基本的js帮助?

事实上,“使用一些基本的js帮助”,您只需要一个简单的“一行程序”(在您的函数中)来修复HTML,在这里它的格式是为了更好的可读性(以及注释中的解释):

函数nestSubULbyClass(par、cls){
对于(var elms=par.getElementsByTagName('li'),L=elms.length,t
;L-->/反向循环元素以避免嵌套的前瞻循环
;~(''+elms[L].类名+'').indexOf(cls)//如果当前elm包含指定的类
?(t | |(t=document.createElement('ul'))//然后获取临时ul或创建一个新的
).appendChild(par.removeChild(elms[L])//并将当前elm移动到temp UL
:t&&(elms[L].appendChild(t),t=0)//否则将临时UL追加到当前elm
);//并使用falsy值清除临时值
}
//“让它成为现实,第一!!”请注意,这只是一个例子,你可以用任何方式钩住并传递UL
window.onload=function(){
nestSubULbyClass(document.getElementsByTagName('ul')[0],'childitem');
};
  • 废话
  • 无聊的父母
  • 无聊的家长
  • 无聊的家长
  • 废话
  • 废话
  • 无聊的家长
  • 无聊的家长

只要获得Id和密码,您就可以

这里

CSS


您想要的结果实际上有点模糊,但有几种方法可以实现这一点

解决方案1-更改DOM 如果要动态更改DOM,可以使用jQuery的
nextUntil()
查找要移动的同级元素:

JSFiddle:

下面是一个使用CSS和javascript的示例。
产品
服务
下面是javascript:
函数myFunction(){
var x=document.getElementById(“myTopnav”);
如果(!x.classList.contains(“responsive”)){
x、 类列表。添加(“响应”);
}否则{
x、 类列表。删除(“响应”);
}
}
还有CSS
托普纳夫先生{
背景色:#333;
溢出:;
}
.topnav::之后{
明确:两者皆有;
内容:“;
显示:块;
}
.topnav a{
浮动:左;
显示:块;
颜色:#F2F2;
文本对齐:居中;
填充:14px 16px;
文字装饰:无;
字号:17px;
}
.主动{
背景色:;
颜色:白色;
}
.topnav.icon{
显示:无;
}
.下拉列表{
浮动:左;
溢出:;
}
.下拉菜单{
字号:17px;
边界:无;
大纲:无;
颜色:白色;
填充:14px 16px;
背景色:#333;
字体家族:继承;
保证金:0;
}
.下拉内容{
显示:无;
位置:绝对位置;
背景色:#f9f9f9;
最小宽度:160px;
盒影:0px 8px 16px 0px rgba(0,0,0,0.2);
z指数:1;
}
.下拉内容a{
浮动:无;
颜色:黑色;
填充:12px 16px;
文字装饰:无;
显示:块;
文本对齐:左对齐;
}
.topnav a:悬停,.dropdown:悬停.dropbtn{
背景色:#555;
颜色:白色;
}
.下拉列表内容a:悬停{
背景色:#ddd;
颜色:黑色;
}
.下拉:悬停.下拉内容{
显示:块;
}
@媒体屏幕和屏幕(最大宽度:600px){
.topnav a:不是(:第一个孩子),.dropdown.dropbtn{
显示:无;
}
.topnav a.icon{
浮动:对;
显示:块;
}
}
@媒体屏幕和屏幕(最大宽度:600px){
.topnav.responsive{位置:相对;}
.topnav.responsive.icon{
位置:绝对位置;
右:0;
排名:0;
}
.topnav.a{
浮动:无;
显示:块;
文本对齐:左对齐;
}
.topnav.responsive.dropdown{float:none;}
.topnav.responsive.下拉列表内容{位置:相对;}
.topnav.responsive.dropdown.dropbtn{
显示:块;
宽度:100%;
文本对齐:左对齐;
}
}

问题是将子项与编码结构不明确的父项相关联。这只是其中一个问题,可以通过
.childitem
上的
数据父项=“%parent\u id%”和顶级项上的
id
来解决。更大的问题是你为什么要这么做。它打破了HTML中的语义,并将孩子与父母解除关联,只需在渲染后对元素执行一些操作。让这变得不必要的复杂的首要需求是什么?另一个大问题是使用JS来解决这一问题,这将是实现这一点的“真正的”主要方法。这是不可靠的,因为不是每个用户都允许JS,所以他们会看到一个不完整的列表。CSS是更常见的方式,因为你从来没有真正关闭过它。除非你是一个开发人员,而且已经破产了。当然,这可以通过一些DOM操作来完成,例如,但是你的结构将是非直观的,并且很难理解。你为什么要做一件简单难做的事?嵌套列表有什么问题?为什么要重新发明轮子?什么因素让你说你必须这样做?你用什么来格式化代码?这是我最近看到的可读性最低的javascript,但是你明确地说“这里它的格式是为了更好的可读性”,所以
.drp:hover
{
    cursor: pointer;   
}
ul li
{
    list-style-type: none;
}
.childitem
{
    display: none;
}
.childitem:hover
{
    background: green;
    cursor: pointer;
}
// Solution 1 - change the DOM
$("ul li:not(.childitem)").each(function () {
    var children = $(this).nextUntil(":not(.childitem)");
    if (children.length) {
        $(this).append($("<ul>").append(children));
    }
});
// Solution 2 - toggle the siblings
$("ul li.childitem").hide();
$("ul li:not(.childitem)").click(function(){
    $(this).nextUntil(":not(.childitem)").toggle();
});
Here is an example which uses CSS and a javascript.

<div class="topnav" id="myTopnav">
  <a href="home.html" class="active">Home</a>

  <div class="dropdown">
    <button class="dropbtn">Products
      <i class="fa fa-caret-down"></i>
    </button>
    <div class="dropdown-content">
      <a href="plinkone.html">Link 1</a>
      <a href="#">Link 2</a>
      <a href="#">Link 3</a>
    </div>
  </div>

  <div class="dropdown">
    <button class="dropbtn">Services
      <i class="fa fa-caret-down"></i>
    </button>
    <div class="dropdown-content">
      <a href="slinkone.html">Link 1</a>
      <a href="#">Link 2</a>
      <a href="#">Link 3</a>
    </div>
  </div>

 <a href="a.html">About</a>
  <a href="news.html">News</a>
  <a href="c.html">Contact</a>
  <a href="javascript:void(0);" style="font-size:15px;" class="icon" onclick="myFunction()">&#9776;</a>
</div>

Here is the javascript:

<script>
function myFunction() {
    var x = document.getElementById("myTopnav");

    if (!x.classList.contains("responsive")) {
        x.classList.add("responsive");
    } else {

        x.classList.remove("responsive");
    }
}
</script>

and the CSS

.topnav {
  background-color: #333;
  overflow: ;

}

.topnav::after {
    clear: both;
    content: "";
    display: block;
}

.topnav a {
  float: left;
  display: block;
  color: #f2f2f2;
  text-align: center;
  padding: 14px 16px;
  text-decoration: none;
  font-size: 17px;
}

.active {
  background-color: ;
  color: white;
}

.topnav .icon {
  display: none;
}

.dropdown {
    float: left;
    overflow: ;
}

.dropdown .dropbtn {
    font-size: 17px;   
    border: none;
    outline: none;
    color: white;
    padding: 14px 16px;
    background-color: #333;
    font-family: inherit;
    margin: 0;
}

.dropdown-content {
    display: none;
    position: absolute;
    background-color: #f9f9f9;
    min-width: 160px;
    box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2);
    z-index: 1;
}

.dropdown-content a {
    float: none;
    color: black;
    padding: 12px 16px;
    text-decoration: none;
    display: block;
    text-align: left;
}

.topnav a:hover, .dropdown:hover .dropbtn {
  background-color: #555;
  color: white;
}

.dropdown-content a:hover {
    background-color: #ddd;
    color: black;
}

.dropdown:hover .dropdown-content {
    display: block;
}

@media screen and (max-width: 600px) {
  .topnav a:not(:first-child), .dropdown .dropbtn {
    display: none;
  }
  .topnav a.icon {
    float: right;
    display: block;
  }
}

@media screen and (max-width: 600px) {
  .topnav.responsive {position: relative;}
  .topnav.responsive .icon {
    position: absolute;
    right: 0;
    top: 0;
  }
  .topnav.responsive a {
    float: none;
    display: block;
    text-align: left;
  }
  .topnav.responsive .dropdown {float: none;}
  .topnav.responsive .dropdown-content {position: relative;}
  .topnav.responsive .dropdown .dropbtn {
    display: block;
    width: 100%;
    text-align: left;
  }
}