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 相关文章推荐
使用CSS3的appearance属性改变任何元素的浏览器默认风格
Dec 24 HTML / CSS
html5中地理位置定位api接口开发应用小结
Jan 04 HTML / CSS
用HTML5实现网站在windows8中贴靠的方法
Apr 21 HTML / CSS
HTML5实现动画效果的方式汇总
Feb 29 HTML / CSS
HTML5页面音视频在微信和app下自动播放的实现方法
Oct 20 HTML / CSS
HTML5语义化元素你真的用对了吗
Aug 22 HTML / CSS
Html5写一个简单的俄罗斯方块小游戏
Dec 03 HTML / CSS
HTML5 HTMLCollection和NodeList的区别详解
Apr 29 HTML / CSS
浅析图片上传及canvas压缩的流程
Jun 10 HTML / CSS
AmazeUI 列表的实现示例
Aug 17 HTML / CSS
移动端HTML5 input常见问题(小结)
Sep 28 HTML / CSS
HTML5 语义化标签(移动端必备)
Aug 23 HTML / CSS
CSS 一行代码实现头像与国旗的融合
如何利用 CSS Overview 面板重构优化你的网站
基于HTML十秒做出淘宝页面
css 边框添加四个角的实现代码
HTML基础详解(下)
Oct 16 #HTML / CSS
HTML基础详解(上)
Oct 16 #HTML / CSS
CSS基础详解
You might like
Windows2003 下 MySQL 数据库每天自动备份
2006/12/21 PHP
8个出色的WordPress SEO插件收集
2011/02/26 PHP
PHP获取MSN好友列表类的实现代码
2013/06/23 PHP
使用PHPExcel操作Excel用法实例分析
2015/03/26 PHP
PHP错误机制知识汇总
2016/03/24 PHP
PHPTree――php快速生成无限级分类
2018/03/30 PHP
JavaScript实现按照指定长度为数字前面补零输出的方法
2015/03/19 Javascript
JQuery插件Quicksand实现超炫的动画洗牌效果
2015/05/03 Javascript
JavaScript队列、优先队列与循环队列
2016/11/14 Javascript
详解为Angular.js内置$http服务添加拦截器的方法
2016/12/20 Javascript
AngularJs表单校验功能实例代码
2017/02/09 Javascript
Vue.js开发环境快速搭建教程
2017/03/17 Javascript
微信小程序实现自定义modal弹窗封装的方法
2018/06/15 Javascript
angularjs性能优化的方法
2018/09/05 Javascript
NodeJS 实现多语言的示例代码
2018/09/11 NodeJs
JS复杂判断的更优雅写法代码详解
2018/11/07 Javascript
[04:36]DOTA2国际邀请赛 ti3精彩集锦
2013/08/19 DOTA
[01:36]极致酷炫!TI9典藏宝瓶+撼地者至宝展示
2019/06/11 DOTA
python SSH模块登录,远程机执行shell命令实例解析
2018/01/12 Python
关于Python正则表达式 findall函数问题详解
2018/03/22 Python
使用 Python 实现文件递归遍历的三种方式
2018/07/18 Python
python经典趣味24点游戏程序设计
2019/07/26 Python
python机器学习包mlxtend的安装和配置详解
2019/08/21 Python
Html5 video标签视频的最佳实践
2020/02/26 HTML / CSS
英国在线发型和美容产品商店:Beauty Cutie
2019/04/27 全球购物
集团公司总经理岗位职责
2013/12/20 职场文书
小学教学随笔感言
2014/02/26 职场文书
销售人员职业生涯规划范文
2014/03/01 职场文书
工程力学专业自荐信范文
2014/03/17 职场文书
小学生我的梦想演讲稿
2014/08/21 职场文书
优秀党员学习焦裕禄精神思想汇报范文
2014/09/10 职场文书
入股合作协议书
2014/10/12 职场文书
离婚协议书范本
2015/01/26 职场文书
证券区域经理岗位职责
2015/04/10 职场文书
Redis 持久化 RDB 与 AOF的执行过程
2021/11/07 Redis
Python中异常处理用法
2021/11/27 Python