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中的calc()功能
Jul 14 HTML / CSS
利用纯CSS3实现tab选项卡切换示例代码
Sep 21 HTML / CSS
如何用css3实现switch组件开关的方法
Feb 09 HTML / CSS
CSS3 不定高宽垂直水平居中的几种方式
Mar 26 HTML / CSS
CSS3制作圆形滚动进度条动画的示例
Nov 05 HTML / CSS
HTML5的结构和语义(2):结构
Oct 17 HTML / CSS
html5时钟实现代码
Oct 22 HTML / CSS
深入理解HTML5定时器requestAnimationFrame的使用
Dec 12 HTML / CSS
Html5与App的通讯方式详解
Oct 24 HTML / CSS
Html5页面点击遮罩层背景关闭遮罩层
Nov 30 HTML / CSS
CSS3 实现的图片悬停的切换按钮
Apr 13 HTML / CSS
浅析CSS在DevTools 中架构演变
Oct 05 HTML / CSS
CSS 一行代码实现头像与国旗的融合
如何利用 CSS Overview 面板重构优化你的网站
基于HTML十秒做出淘宝页面
css 边框添加四个角的实现代码
HTML基础详解(下)
Oct 16 #HTML / CSS
HTML基础详解(上)
Oct 16 #HTML / CSS
CSS基础详解
You might like
PHP中文分词的简单实现代码分享
2011/07/17 PHP
PHP处理Ajax请求与Ajax跨域问题
2017/02/13 PHP
PHP设计模式之观察者模式定义与用法分析
2019/04/04 PHP
颜色选择器 Color Picker,IE,Firefox,Opera,Safar
2010/11/25 Javascript
[将免费进行到底]在Amazon的一年免费服务器上安装Node.JS, NPM和OurJS博客
2014/08/18 Javascript
javascript实现图像循环明暗变化的方法
2015/02/25 Javascript
jQuery实现的漂亮表单效果代码
2015/08/18 Javascript
JS中页面与页面之间超链接跳转中文乱码问题的解决办法
2016/12/15 Javascript
bootstrap组件之按钮式下拉菜单小结
2017/01/19 Javascript
常用jQuery选择器汇总
2017/02/02 Javascript
利用Jquery实现几款漂亮实用的时间轴(附示例代码)
2017/02/15 Javascript
node跨域转发 express+http-proxy-middleware的使用
2018/05/31 Javascript
js中的reduce()函数讲解
2019/01/18 Javascript
微信小程序学习笔记之获取位置信息操作图文详解
2019/03/29 Javascript
Promise扫盲贴
2019/06/24 Javascript
在vue中动态添加class类进行显示隐藏实例
2019/11/09 Javascript
vue组件入门知识全梳理
2020/09/21 Javascript
Vue实现图书管理案例
2021/01/20 Vue.js
Python使用win32com实现的模拟浏览器功能示例
2017/07/13 Python
python dataframe astype 字段类型转换方法
2018/04/11 Python
Python入门学习指南分享
2018/04/11 Python
使用CSS3制作倾斜导航条和毛玻璃效果
2017/09/12 HTML / CSS
css3学习系列之移动属性详解
2017/07/04 HTML / CSS
墨西哥皇宫度假村预订:Palace Resorts
2018/06/16 全球购物
英国时尚优质的女装:Hope Fashion
2018/08/14 全球购物
小米俄罗斯授权商店:Xiaomi俄罗斯
2019/12/08 全球购物
机械专业毕业生自荐信
2013/11/02 职场文书
中文专业毕业生自荐书范文
2014/01/04 职场文书
致短跑运动员广播稿
2014/01/09 职场文书
司机工作自我鉴定
2014/09/19 职场文书
思想作风建设心得体会
2014/10/22 职场文书
检讨书模板大全
2015/05/07 职场文书
起诉意见书范文
2015/05/19 职场文书
2015年市场营销工作总结
2015/07/23 职场文书
写作指导:怎么书写竞聘演讲稿?
2019/07/04 职场文书
Pandas自定义选项option设置
2021/07/25 Python