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中border-radius属性设定圆角的使用技巧
May 10 HTML / CSS
CSS3之边框多颜色Border-color属性使用示例
Oct 11 HTML / CSS
css3 transform及原生js实现鼠标拖动3D立方体旋转
Jun 20 HTML / CSS
使用纯 CSS 创作一个脉动 loader效果的源码
Sep 28 HTML / CSS
CSS3 实现童年的纸飞机
May 05 HTML / CSS
解决H5的a标签的download属性下载service上的文件出现跨域问题
Jul 16 HTML / CSS
html5 兼容IE6结构的实现代码
May 14 HTML / CSS
使用javascript和HTML5 Canvas画的四渐变色播放按钮效果
Apr 10 HTML / CSS
HTML5制作3D爱心动画教程 献给女友浪漫的礼物
Nov 05 HTML / CSS
canvas压缩图片以及卡片制作的方法示例
Dec 04 HTML / CSS
基于HTML5+tracking.js实现刷脸支付功能
Apr 16 HTML / CSS
详解CSS3.0(Cascading Style Sheet) 层叠级联样式表
Jul 16 HTML / CSS
CSS 一行代码实现头像与国旗的融合
如何利用 CSS Overview 面板重构优化你的网站
基于HTML十秒做出淘宝页面
css 边框添加四个角的实现代码
HTML基础详解(下)
Oct 16 #HTML / CSS
HTML基础详解(上)
Oct 16 #HTML / CSS
CSS基础详解
You might like
php自定义函数之递归删除文件及目录
2010/08/08 PHP
基于php split()函数的用法详解
2013/06/05 PHP
php函数serialize()与unserialize()用法实例
2014/11/06 PHP
PHP用mysql_insert_id()函数获得刚插入数据或当前发布文章的ID
2016/11/25 PHP
PHP isset()与empty()的使用区别详解
2017/02/10 PHP
Windows Live的@live.com域名注册漏洞 利用代码
2006/12/27 Javascript
Jquery 获得服务器控件值的方法小结
2010/05/11 Javascript
JS获取文本框,下拉框,单选框的值的简单实例
2014/02/26 Javascript
node.js中使用q.js实现api的promise化
2014/09/17 Javascript
js图片翻书效果代码分享
2015/08/20 Javascript
基于JavaScript代码实现兼容各浏览器的设为首页和加入收藏
2016/01/07 Javascript
全面解析jQuery $(document).ready()和JavaScript onload事件
2016/06/08 Javascript
AngularJS通过$sce输出html的方法
2016/09/22 Javascript
浅谈js键盘事件全面控制
2016/12/01 Javascript
BootStrap Tooltip插件源码解析
2016/12/27 Javascript
基于canvas的二维码邀请函生成插件
2017/02/14 Javascript
原生js实现鼠标跟随效果
2017/02/28 Javascript
详解JavaScript调用栈、尾递归和手动优化
2017/06/03 Javascript
微信小程序上传图片到服务器实例代码
2017/11/07 Javascript
Angular实现的table表格排序功能完整示例
2017/12/22 Javascript
[51:17]Mski vs VGJ.S Supermajor小组赛C组 BO3 第三场 6.3
2018/06/04 DOTA
python字典基本操作实例分析
2015/07/11 Python
python学习笔记之调用eval函数出现invalid syntax错误问题
2015/10/18 Python
Python轻量级ORM框架Peewee访问sqlite数据库的方法详解
2017/07/20 Python
python3利用venv配置虚拟环境及过程中的小问题小结
2018/08/01 Python
在Python中pandas.DataFrame重置索引名称的实例
2018/11/06 Python
Python 绘制可视化折线图
2020/07/22 Python
雅虎笔试题(字符串操作)
2015/03/24 面试题
团组织推优材料
2014/12/29 职场文书
暑假安全保证书
2015/02/28 职场文书
公司捐书倡议书
2015/04/27 职场文书
MySQL学习总结-基础架构概述
2021/04/05 MySQL
基于Go Int转string几种方式性能测试
2021/04/28 Golang
Linux中Nginx的防盗链和优化的实现代码
2021/06/20 Servers
Python装饰器的练习题
2021/11/23 Python
SQL Server使用PIVOT与unPIVOT实现行列转换
2022/05/25 SQL Server