【发布时间】:2017-08-24 03:53:45
【问题描述】:
出于好奇,我正在尝试提供带有子菜单(无 js)的纯 CSS 菜单。
要求是:
- 应该可以折叠所有子菜单
- 只能同时显示一个子菜单
- 不使用悬停:鼠标点击时触发子菜单
- 没有javascript
这是我到目前为止所做的:
链接到jsfiddle 和下面的代码sn-p:
// no javascript
label {
cursor: pointer;
user-select: none;
}
label:hover {
text-decoration: underline;
}
ul > li > ul {
display: none;
}
#example1,
#example2,
#example3,
#example4 {
background: #eee;
display: inline-block;
}
#example1 > li > input,
#example2 > li > input {
/*display: none;*/
}
#example1 > li > input:checked + ul,
#example2 > li > input:checked + ul {
display: block;
}
#example3 > li > input[type="radio"]:checked + input[type="checkbox"]:checked + ul {
display: block;
}
#example4:hover > li > input[type="radio"]:checked + ul {
display: block;
}
<h3>Can collapse all, <u>BUT</u> can't display a sigle submenu at the time</h3>
<ul id="example1">
<li>
<label for="categories">Category</label>
<input id="categories" type="checkbox">
<ul>
<li>cars</li>
<li>animals</li>
</ul>
</li>
<li>
<label for="settings">Settings</label>
<input id="settings" type="checkbox">
<ul>
<li>general</li>
<li>notifications</li>
</ul>
</li>
</ul>
<h3>Can display a sigle submenu at the time, <u>BUT</u> can't collapse all</h3>
<ul id="example2">
<li>
<label for="categories2">Category</label>
<input id="categories2" type="radio" name="menu">
<ul>
<li>cars</li>
<li>animals</li>
</ul>
</li>
<li>
<label for="settings2">Settings</label>
<input id="settings2" type="radio" name="menu">
<ul>
<li>general</li>
<li>notifications</li>
</ul>
</li>
</ul>
<h3>Can display a sigle submenu at the time <u>and</u> can collapse all, <u>BUT</u> requires more then 1 click</h3>
<ul id="example3">
<li>
<label for="categories3check">Category</label>
<input id="categories3radio" type="radio" name="menu">
<input id="categories3check" type="checkbox">
<ul>
<li>cars</li>
<li>animals</li>
</ul>
</li>
<li>
<label for="settings3check">Settings</label>
<input id="settings3radio" type="radio" name="menu">
<input id="settings3check" type="checkbox">
<ul>
<li>general</li>
<li>notifications</li>
</ul>
</li>
</ul>
<h3>Can display a sigle submenu at the time <u>and</u> can collapse all, <u>BUT</u> uses hover and if radio is selected it opens submenu on hover</h3>
<ul id="example4">
<li>
<label for="categories4radio">Category</label>
<input id="categories4radio" type="radio" name="menu">
<ul>
<li>cars</li>
<li>animals</li>
</ul>
</li>
<li>
<label for="settings4radio">Settings</label>
<input id="settings4radio" type="radio" name="menu">
<ul>
<li>general</li>
<li>notifications</li>
</ul>
</li>
</ul>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
我试图跳出框框思考,但没有选择。
应该是这样的:
链接到jsfiddle 和下面的代码sn-p,带有大量的jQuery:
$("span").click(function() {
var display = $(this).next()[0].style.display;
$("ul > li > ul").hide();
if (display == "" || display == "none")
$(this).next().show();
else if (display == "block")
$(this).next().hide();
});
ul > li > ul {
display: none;
}
span {
user-select: none;
cursor: pointer;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<ul>
<li>
<span>Category</span>
<ul>
<li>cars</li>
<li>animals</li>
</ul>
</li>
<li>
<span>Settings</span>
<ul>
<li>general</li>
<li>notifications</li>
</ul>
</li>
</ul>
这样的子菜单功能可以不用js来完成吗?如果是,如何。如果不是,为什么不呢?只要使用 html/css 而没有 js,任何顺序的任何数量的 hack 都是可以接受的。
【问题讨论】:
标签: html css drop-down-menu submenu