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实现自定义滚动条代码分享
Aug 18 HTML / CSS
让IE6、IE7、IE8支持CSS3的脚本
Jul 20 HTML / CSS
深入浅析css3 中display box使用方法
Nov 25 HTML / CSS
如何使用css3实现一个类在线直播的队列动画的示例代码
Jun 17 HTML / CSS
使用html2canvas将页面转成图并使用用canvas2image下载
Apr 04 HTML / CSS
html5 datalist标签使用示例(自动完成组件)
May 04 HTML / CSS
使用HTML5中的contentEditable来将多行文本自动增高
Mar 01 HTML / CSS
用html5的canvas和JavaScript创建一个绘图程序的简单实例
Jul 06 HTML / CSS
html实现弹窗的实例
Jun 09 HTML / CSS
仅仅使用 HTML/CSS 实现各类进度条的方式汇总
Nov 11 HTML / CSS
基于CSS制作创意端午节专属加载特效
Jun 01 HTML / CSS
html,css,javascript是怎样变成页面的
May 07 HTML / CSS
CSS 一行代码实现头像与国旗的融合
如何利用 CSS Overview 面板重构优化你的网站
基于HTML十秒做出淘宝页面
css 边框添加四个角的实现代码
HTML基础详解(下)
Oct 16 #HTML / CSS
HTML基础详解(上)
Oct 16 #HTML / CSS
CSS基础详解
You might like
PHP个人网站架设连环讲(二)
2006/10/09 PHP
php 搜索框提示(自动完成)实例代码
2012/02/05 PHP
php获取mysql字段名称和其它信息的例子
2014/04/14 PHP
ThinkPHP登录功能的实现方法
2014/08/20 PHP
ThinkPHP中数据操作案例分析
2015/09/27 PHP
隐藏Nginx或Apache以及PHP的版本号的方法
2016/01/03 PHP
服务器安全设置的几个注册表设置
2007/07/28 Javascript
理解Javascript_05_原型继承原理
2010/10/13 Javascript
Jquery之美中不足小结
2011/02/16 Javascript
js使用函数绑定技术改变事件处理程序的作用域
2011/12/26 Javascript
JavaScript高级程序设计 阅读笔记(四) ECMAScript中的类型转换
2012/02/27 Javascript
js onkeypress与onkeydown 事件区别详细说明
2012/12/13 Javascript
web前端设计师们常用的jQuery特效插件汇总
2014/12/07 Javascript
在浏览器中打开或关闭JavaScript的方法
2015/06/03 Javascript
Vue.js 表单校验插件
2016/08/14 Javascript
移动端基础事件总结与应用
2017/01/12 Javascript
JavaScript实现学生在线做题计时器功能
2018/12/05 Javascript
vue数据初始化initState的实例详解
2019/04/11 Javascript
ES6 Object方法扩展的应用实例分析
2019/06/25 Javascript
Element-UI+Vue模式使用总结
2020/01/02 Javascript
Vue前端判断数据对象是否为空的实例
2020/09/02 Javascript
React倒计时功能实现代码——解耦通用
2020/09/18 Javascript
Python用GET方法上传文件
2015/03/10 Python
Django Highcharts制作图表
2016/08/27 Python
Python3实现将一维数组按标准长度分隔为二维数组
2019/11/29 Python
css3实现二维码扫描特效的示例
2020/10/29 HTML / CSS
网购亚洲时装、美容产品和生活百货:YesStyle
2016/09/15 全球购物
美国零售商店:Blue&Cream
2017/04/07 全球购物
养殖人员的创业计划书范文
2013/12/26 职场文书
评析教师个人的自我评价
2014/02/19 职场文书
房产转让协议书
2014/04/11 职场文书
高中生评语大全
2014/04/25 职场文书
社区维稳工作方案
2014/06/06 职场文书
525心理活动总结
2014/07/04 职场文书
一年级语文上册复习计划
2015/01/17 职场文书
市级三好生竞选稿
2015/11/21 职场文书