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实现自定义Tooltip边框涂鸦风格的教程
Nov 05 HTML / CSS
详解HTML5通讯录获取指定多个人的信息
Dec 20 HTML / CSS
使用phonegap检测网络状态的方法
Mar 30 HTML / CSS
基于Canvas+Vue的弹幕组件的实现
Jul 23 HTML / CSS
input元素的url类型和email类型简介
Jul 11 HTML / CSS
html5表单及新增的改良元素详解
Jun 07 HTML / CSS
HTML5+CSS3:3D展示商品信息示例
Jan 03 HTML / CSS
canvas探照灯效果的示例代码
Nov 30 HTML / CSS
怎样实现H5+CSS3手指滑动切换图片的示例代码
May 05 HTML / CSS
Html5+CSS3+EL表达式问题小结
Dec 19 HTML / CSS
html+css实现文字折叠特效实例
Jun 02 HTML / CSS
CSS浮动引起的高度塌陷问题
Aug 05 HTML / CSS
CSS 一行代码实现头像与国旗的融合
如何利用 CSS Overview 面板重构优化你的网站
基于HTML十秒做出淘宝页面
css 边框添加四个角的实现代码
HTML基础详解(下)
Oct 16 #HTML / CSS
HTML基础详解(上)
Oct 16 #HTML / CSS
CSS基础详解
You might like
PHP写的求多项式导数的函数代码
2012/07/04 PHP
PHP函数eval()介绍和使用示例
2014/08/20 PHP
PHP批量去除BOM头代码分享
2015/06/26 PHP
Laravel中validation验证 返回中文提示 全局设置的方法
2019/09/29 PHP
解决laravel(5.5)访问public报错的问题
2019/10/12 PHP
javascript 面向对象编程  function是方法(函数)
2009/09/17 Javascript
基于jQuery的固定表格头部的代码(IE6,7,8测试通过)
2010/05/18 Javascript
Ext JS 4官方文档之三 -- 类体系概述与实践
2012/12/16 Javascript
jquery实现marquee效果(文字或者图片的水平垂直滚动)
2013/01/07 Javascript
JS阻止用户多次提交示例代码
2014/03/26 Javascript
jquery实现仿JqueryUi可拖动的DIV实例
2015/07/31 Javascript
JavaScript控制浏览器全屏及各种浏览器全屏模式的方法、属性和事件
2015/12/20 Javascript
玩转JavaScript OOP - 类的实现详解
2016/06/08 Javascript
JS实现颜色梯度与渐变效果完整实例
2016/12/30 Javascript
vue2.0 自定义 饼状图 (Echarts)组件的方法
2018/03/02 Javascript
vue axios请求超时的正确处理方法
2018/04/02 Javascript
nodejs读取并去重excel文件
2018/04/22 NodeJs
angularjs使用div模拟textarea文本框的方法
2018/10/02 Javascript
简单了解vue 插值表达式Mustache
2020/07/22 Javascript
vue 实现超长文本截取,悬浮框提示
2020/07/29 Javascript
解决vue addRoutes不生效问题
2020/08/04 Javascript
[02:14]2016国际邀请赛中国区预选赛Ehome晋级之路
2016/07/01 DOTA
用python实现对比两张图片的不同
2018/02/05 Python
Python后台开发Django会话控制的实现
2019/04/15 Python
numpy按列连接两个维数不同的数组方式
2019/12/06 Python
Python3使用xlrd、xlwt处理Excel方法数据
2020/02/28 Python
Selenium 安装和简单使用的实现
2020/12/04 Python
编写html5时调试发现脚本php等网页js、css等失效
2013/12/31 HTML / CSS
Linux常见面试题
2016/10/04 面试题
门卫岗位安全职责
2013/12/13 职场文书
外贸业务员工作职责
2014/01/06 职场文书
抽奖活动主持词
2014/03/31 职场文书
领导班子作风建设年个人整改措施
2014/09/29 职场文书
学校政风行风评议工作总结
2014/10/21 职场文书
《巨人的花园》教学反思
2016/02/19 职场文书
Linux磁盘管理方法介绍
2022/06/01 Servers