本篇文章小编给大家分享一下CSS实现单选折叠菜单功能代码示例,文章代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看。
折叠菜单和标签页差不多,逻辑上都是一种单选面板,只不过折叠菜单一般是垂直堆叠的,标签页是横着排列。
标签页:
既然是单选的,就可以用单选按钮来实现。首先这些单选按钮组的父元素用
,因为 可以监听按钮组的变化,同时还能通过name属性直接得到RadioNodeList列表和变化值,非常方便,不用设置其他的css选择器了。所以这个折叠菜单的html如下:给
设置id,这样可以直接通过window[id]找到它,每个的name属性要一致,然后通过form[name]得到单选组,form[name].value就是当前选中的按钮的value,也就是折叠按钮的标题,每个后面跟着一个还是先用appearance: none禁用如上图的默认样式,然后利用::before作为按钮左侧的名称(读取value属性),::after作为右侧的小箭头(字符>和v),通过:checked属性表示折叠状态。
input[type="radio"] {
cursor: pointer;
appearance: none;
display: block;
}
input[type="radio"]::before {
content: attr(value);
}
input[type="radio"]::after {
float: right;
content: ">";
}
input[type="radio"]:checked::after {
content: "v";
}
对于
input[type="radio"] + div {
display: none;
}
input[type="radio"]:checked + div {
display: block;
}
以上就是基本布局,再加上一点其他样式,就成了:
但是由于的特性,无法反选,菜单展开后想要折叠只能点别的菜单项,当然这也没什么,如果非要实现反选菜单的功能,需要记录上次展开的菜单项,每次发生点击事件时,判断是否重复点击:
// for every
radio.onclick = () => {
if (window.radio === radio) {
input.checked = false;
window.radio = null;
} else window.radio = radio;
};
这样就实现了单选折叠菜单的反选能力:
对了,图中混乱的文字是原来文字被打乱的结果(隐私需要),可以通过下面的代码将一个字符串打乱:
string.split('').sort(() => Math.random() - 0.5).join('')