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 23 HTML / CSS
纯CSS3实现圆角效果(含IE兼容解决方法)
May 07 HTML / CSS
CSS的background属性及CSS3的背景图片设置总结
Jun 13 HTML / CSS
CSS3的 fit-content实现水平居中
Sep 07 HTML / CSS
深入浅析CSS3中的Flex布局整理
Apr 27 HTML / CSS
css3 利用transform打造走动的2D时钟
Oct 20 HTML / CSS
canvas像素画板的实现代码
Nov 21 HTML / CSS
简单聊聊H5的pushState与replaceState的用法
Apr 03 HTML / CSS
HTML5 Canvas基本线条绘制的实例教程
Mar 17 HTML / CSS
HTML5事件方法全部汇总
May 12 HTML / CSS
CSS3点击按钮圆形进度打钩效果的实现代码
Mar 30 HTML / CSS
html+css实现环绕倒影加载特效
Jul 07 HTML / CSS
CSS 一行代码实现头像与国旗的融合
如何利用 CSS Overview 面板重构优化你的网站
基于HTML十秒做出淘宝页面
css 边框添加四个角的实现代码
HTML基础详解(下)
Oct 16 #HTML / CSS
HTML基础详解(上)
Oct 16 #HTML / CSS
CSS基础详解
You might like
小议Function.apply()之二------利用Apply的参数数组化来提高 JavaScript程序性能
2006/11/30 Javascript
关于取不到由location.href提交而来的上级页面地址的解决办法
2009/07/30 Javascript
ExtJS下grid的一些属性说明
2009/12/13 Javascript
Js 刷新框架页的代码
2010/04/13 Javascript
jQuery实用基础超详细介绍
2013/04/11 Javascript
Javascript基础 函数“重载” 详细介绍
2013/10/25 Javascript
简述JavaScript的正则表达式中test()方法的使用
2015/06/16 Javascript
使用JavaScript制作一个简单的计数器的方法
2015/07/07 Javascript
基于JS实现导航条之调用网页助手小精灵的方法
2016/06/17 Javascript
AngularJS基础 ng-open 指令简单实例
2016/08/02 Javascript
JavaScript学习笔记--常用的互动方法
2016/12/07 Javascript
通俗解释JavaScript正则表达式快速记忆
2017/08/23 Javascript
BootStrap 标题设置跨行无效的解决方法
2017/10/25 Javascript
Angular实现点击按钮控制隐藏和显示功能示例
2017/12/29 Javascript
详解easyui 切换主题皮肤
2019/04/04 Javascript
利用js-cookie实现前端设置缓存数据定时失效
2019/06/18 Javascript
layui实现给某一列加点击事件
2019/10/26 Javascript
flask使用session保存登录状态及拦截未登录请求代码
2018/01/19 Python
python验证码识别教程之利用滴水算法分割图片
2018/06/05 Python
python3 property装饰器实现原理与用法示例
2019/05/15 Python
django实现类似触发器的功能
2019/11/15 Python
Python 序列化和反序列化库 MarshMallow 的用法实例代码
2020/02/25 Python
python根据字典的键来删除元素的方法
2020/08/16 Python
Python2.6版本pip安装步骤解析
2020/08/17 Python
HTML5响应式(自适应)网页设计的实现
2017/11/17 HTML / CSS
HealthElement海外旗舰店:新西兰大卖场
2018/02/23 全球购物
Harman Audio官方商店:购买JBL、Harman Kardon、Infinity和AKG
2019/12/05 全球购物
给幼儿园老师的表扬信
2014/01/19 职场文书
广告学毕业生求职信
2014/01/30 职场文书
班子群众路线教育实践个人对照检查材料思想汇报
2014/09/30 职场文书
学习群众路线的心得体会
2014/11/05 职场文书
2015年技术员工作总结
2015/04/10 职场文书
公司辞职信模板
2015/05/13 职场文书
法制教育观后感
2015/06/17 职场文书
员工工作心得体会
2019/05/07 职场文书
MySQL安装失败的原因及解决步骤
2022/06/14 MySQL