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中的元素过渡属性transition示例详解
Nov 30 HTML / CSS
CSS3实现任意图片lowpoly动画效果实例
May 11 HTML / CSS
使用css3制作登录表单的步骤
Apr 07 HTML / CSS
CSS3 3D酷炫立方体变换动画的实现
Mar 26 HTML / CSS
CSS3制作3D立方体loading特效
Nov 09 HTML / CSS
HTML5 Canvas 起步(2) - 路径
May 12 HTML / CSS
HTML5 常用语法一览(列举不支持的属性)
Jan 26 HTML / CSS
html5之Canvas路径绘图、坐标变换应用实例
Dec 26 HTML / CSS
HTML5 通信API 跨域门槛将不再高、数据推送也不再是梦
Apr 25 HTML / CSS
5个你不知道的HTML5的接口介绍
Aug 07 HTML / CSS
Html5 canvas画图白板踩坑
Jun 01 HTML / CSS
canvas画图被放大且模糊的解决方法
Aug 11 HTML / CSS
CSS 一行代码实现头像与国旗的融合
如何利用 CSS Overview 面板重构优化你的网站
基于HTML十秒做出淘宝页面
css 边框添加四个角的实现代码
HTML基础详解(下)
Oct 16 #HTML / CSS
HTML基础详解(上)
Oct 16 #HTML / CSS
CSS基础详解
You might like
阿拉伯的咖啡与水烟
2021/03/03 咖啡文化
php使用反射插入对象示例分享
2014/03/11 PHP
php打开本地exe程序,js打开本地exe应用程序,并传递相关参数方法
2018/02/06 PHP
javascript 出生日期和身份证判断大全
2008/11/13 Javascript
再次分享18个非常棒的jQuery表格插件
2011/04/10 Javascript
jQuery ajax 路由和过滤器使用说明
2011/08/02 Javascript
『jQuery』取指定url格式及分割函数应用
2013/04/22 Javascript
Augularjs-起步详解
2016/07/08 Javascript
一篇看懂vuejs的状态管理神器 vuex状态管理模式
2017/04/20 Javascript
Bootstrap输入框组件使用详解
2017/06/09 Javascript
自定义vue全局组件use使用、vuex的使用详解
2017/06/14 Javascript
vue自定义底部导航栏Tabbar的实现代码
2018/09/03 Javascript
vue实现密码显示与隐藏按钮的自定义组件功能
2019/04/23 Javascript
探索JavaScript中私有成员的相关知识
2019/06/13 Javascript
vue中通过使用$attrs实现组件之间的数据传递功能
2019/09/01 Javascript
Angular之jwt令牌身份验证的实现
2020/02/14 Javascript
谈谈node.js中的模块系统
2020/09/01 Javascript
Python函数中定义参数的四种方式
2014/11/30 Python
python如何拆分含有多种分隔符的字符串
2018/03/20 Python
面向初学者的Python编辑器Mu
2018/10/08 Python
在Python中使用defaultdict初始化字典以及应用方法
2018/10/31 Python
python文件选择对话框的操作方法
2019/06/27 Python
Python实现滑动平均(Moving Average)的例子
2019/08/24 Python
tensorflow实现读取模型中保存的值 tf.train.NewCheckpointReader
2020/02/10 Python
Python基于class()实现面向对象原理详解
2020/03/26 Python
python实现测试工具(一)——命令行发送get请求
2020/10/19 Python
通过代码简单了解django model序列化作用
2020/11/12 Python
使用Python爬虫爬取小红书完完整整的全过程
2021/01/19 Python
气象学专业个人求职信
2014/04/22 职场文书
小学班主任评语大全
2014/04/23 职场文书
师德师风自查总结
2014/10/14 职场文书
校园歌手大赛主持词
2015/07/03 职场文书
环保建议书作文500字
2015/09/14 职场文书
基于Redis延迟队列的实现代码
2021/05/13 Redis
MySQL查看表和清空表的常用命令总结
2021/05/26 MySQL
Python基于百度API识别并提取图片中文字
2021/06/27 Python