CSS实现单选折叠菜单功能


Posted in HTML / CSS onNovember 01, 2021

不到万不得已的时候千万别引入前端UI框架,因为HTML5和CSS3已经能实现绝大多数的功能,比如上期的《CSS实现最简洁的开关》

CSS实现单选折叠菜单功能

而很多人的思维还停留在web2.0时代,用各种库来做UI,导致网页臃肿。今天教大家用纯css实现一个单选的折叠菜单,不需要JavaScript就能用。折叠菜单和标签页差不多,逻辑上都是一种单选面板,只不过折叠菜单一般是垂直堆叠的,标签页是横着排列。

CSS实现单选折叠菜单功能

标签页:

CSS实现单选折叠菜单功能

既然是单选的,就可以用<input type="radio">单选按钮来实现。首先这些单选按钮组的父元素用<form>,因为<form>可以监听按钮组的变化,同时还能通过name属性直接得到RadioNodeList列表和变化值,非常方便,不用设置其他的css选择器了。所以这个折叠菜单的html如下:

<form id="form">
    <input type="radio" name="collapse">
    <div></div>
 
    <input type="radio" name="collapse">
    <div></div>

    <input type="radio" name="collapse">
    <div></div>
</form>

给<form>设置id,这样可以直接通过window[id]找到它,每个<radio>的name属性要一致,然后通过form[name]得到单选组,form[name].value就是当前选中的按钮的value,也就是折叠按钮的标题,每个<radio>后面跟着一个<div>就是菜单展开的内容。但是<radio>默认是这样的:

CSS实现单选折叠菜单功能

还是先用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";
}

对于<div>,默认是隐藏的,只有被选中的<radio>后面的<div>才显示。至于折叠动画的话,就看需求了,对我来说,没有动画会更清爽一点。

input[type="radio"] + div {
      display: none;
}
 
 
input[type="radio"]:checked + div {
      display: block;
}

以上就是基本布局,再加上一点其他样式,就成了:

CSS实现单选折叠菜单功能

但是由于<radio>的特性,无法反选,菜单展开后想要折叠只能点别的菜单项,当然这也没什么,如果非要实现反选菜单的功能,需要记录上次展开的菜单项,每次发生点击事件时,判断是否重复点击:

// for every <radio>
radio.onclick = () => {
  if (window.radio === radio) {
    input.checked = false;
    window.radio = null;
  } else window.radio = radio;
};

这样就实现了单选折叠菜单的反选能力:

CSS实现单选折叠菜单功能

对了,图中混乱的文字是原来文字被打乱的结果(隐私需要),可以通过下面的代码将一个字符串打乱:

string.split('').sort(() => Math.random() - 0.5).join('')

到此这篇关于CSS实现单选折叠菜单功能的文章就介绍到这了,更多相关CSS单选折叠菜单内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章,希望大家以后多多支持三水点靠木!

 
HTML / CSS 相关文章推荐
常用的四种CSS透明属性介绍
Apr 12 HTML / CSS
一款纯css3实现简单的checkbox复选框和radio单选框
Nov 05 HTML / CSS
CSS3绘制六边形的简单实现
Aug 25 HTML / CSS
移动端适配 使px自动转换rem
Aug 26 HTML / CSS
HTML5本地存储之Web Storage应用介绍
Jan 06 HTML / CSS
浅谈html5标签css3的常用样式
Oct 20 HTML / CSS
HTML5 常见面试题之PC端和移动端区别介绍
Jan 22 HTML / CSS
HTML5中使用json对象的实例代码
Sep 10 HTML / CSS
详解Canvas实用库Fabric.js使用手册
Jan 07 HTML / CSS
微信小程序之html5 canvas绘图并保存到系统相册
Jun 20 HTML / CSS
AmazeUI 模态窗口的实现代码
Aug 18 HTML / CSS
HTML实现仿Windows桌面主题特效的实现
Jun 28 HTML / CSS
CSS 一行代码实现头像与国旗的融合
如何利用 CSS Overview 面板重构优化你的网站
基于HTML十秒做出淘宝页面
css 边框添加四个角的实现代码
HTML基础详解(下)
Oct 16 #HTML / CSS
HTML基础详解(上)
Oct 16 #HTML / CSS
CSS基础详解
You might like
解析CI即CodeIgniter框架在Nginx下的重写规则
2013/06/03 PHP
php中的静态变量的基本用法
2014/03/20 PHP
PHP使用PDO操作数据库的乱码问题解决方法
2016/04/08 PHP
PHP导出带样式的Excel示例代码
2016/08/28 PHP
用jQuery获取IE9下拉框默认值问题探讨
2013/07/22 Javascript
下拉列表选择项的选中在不同浏览器中的兼容性问题探讨
2013/09/18 Javascript
jquery中map函数与each函数的区别实例介绍
2014/06/23 Javascript
简述AngularJS的控制器的使用
2015/06/16 Javascript
JavaScript中数组继承的简单示例
2015/07/29 Javascript
使用jQuery+EasyUI实现CheckBoxTree的级联选中特效
2015/12/06 Javascript
结合代码图文讲解JavaScript中的作用域与作用域链
2016/07/05 Javascript
JavaScript生成.xls文件的代码
2016/12/22 Javascript
Nodejs+Socket.io实现通讯实例代码
2017/02/13 NodeJs
Vue内容分发slot(全面解析)
2017/08/19 Javascript
简单实现jQuery弹窗效果
2017/10/30 jQuery
在VUE中使用lodash的debounce和throttle操作
2020/11/09 Javascript
python实现在IDLE中输入多行的方法
2018/04/19 Python
PyQt5实现简易计算器
2020/05/30 Python
解决django model修改添加字段报错的问题
2019/11/18 Python
pytorch 使用加载训练好的模型做inference
2020/02/20 Python
Python 实现将numpy中的nan和inf,nan替换成对应的均值
2020/06/08 Python
最新PyCharm从安装到PyCharm永久激活再到PyCharm官方中文汉化详细教程
2020/11/17 Python
完美解决Pycharm中matplotlib画图中文乱码问题
2021/01/11 Python
CSS3 圆角效果
2009/07/15 HTML / CSS
英国最大的高品质珠宝和手表专家:Goldsmiths
2017/03/11 全球购物
美国女性运动零售品牌:Lady Foot Locker
2017/05/12 全球购物
shallow copy和deep copy的区别
2016/05/09 面试题
String s = new String(“xyz”);创建了几个String Object?
2015/08/05 面试题
汽车检测与维修个人求职信
2013/09/24 职场文书
架构师岗位职责
2013/11/18 职场文书
创业计划书——互联网商机
2014/01/12 职场文书
捐助贫困学生倡议书
2014/05/16 职场文书
党校毕业心得体会
2014/09/13 职场文书
李白经典诗之一:全文无一“月”字,却句句有月
2019/07/12 职场文书
使用python如何删除同一文件夹下相似的图片
2021/05/07 Python
go使用Gin框架利用阿里云实现短信验证码功能
2021/08/04 Golang