经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » HTML/CSS » CSS » 查看文章
CSS实现单选折叠菜单功能_CSS教程_CSS
来源:jb51  时间:2021/11/8 12:38:25  对本文有异议

不到万不得已的时候千万别引入前端UI框架,因为HTML5和CSS3已经能实现绝大多数的功能,比如上期的《CSS实现最简洁的开关》

dca0a8cfcb26d3cd87aed4ceeceee3b4.png

而很多人的思维还停留在web2.0时代,用各种库来做UI,导致网页臃肿。今天教大家用纯css实现一个单选的折叠菜单,不需要JavaScript就能用。折叠菜单和标签页差不多,逻辑上都是一种单选面板,只不过折叠菜单一般是垂直堆叠的,标签页是横着排列。

873ecdccbd4a9eda8905fa3dda8a95f3.gif

标签页:

6af435a8d5daf3680c52d09d86cf2254.gif

既然是单选的,就可以用<input type="radio">单选按钮来实现。首先这些单选按钮组的父元素用<form>,因为<form>可以监听按钮组的变化,同时还能通过name属性直接得到RadioNodeList列表和变化值,非常方便,不用设置其他的css选择器了。所以这个折叠菜单的html如下:

  1. <form id="form">
  2. <input type="radio" name="collapse">
  3. <div></div>
  4. <input type="radio" name="collapse">
  5. <div></div>
  6.  
  7. <input type="radio" name="collapse">
  8. <div></div>
  9. </form>

给<form>设置id,这样可以直接通过window[id]找到它,每个<radio>的name属性要一致,然后通过form[name]得到单选组,form[name].value就是当前选中的按钮的value,也就是折叠按钮的标题,每个<radio>后面跟着一个<div>就是菜单展开的内容。但是<radio>默认是这样的:

3734ce405520be5e763445ce517388d4.gif

还是先用appearance: none禁用如上图的默认样式,然后利用::before作为按钮左侧的名称(读取value属性),::after作为右侧的小箭头(字符>和v),通过:checked属性表示折叠状态。

  1. input[type="radio"] {
  2. cursor: pointer;
  3. appearance: none;
  4. display: block;
  5. }
  6. input[type="radio"]::before {
  7. content: attr(value);
  8. }
  9. input[type="radio"]::after {
  10. float: right;
  11. content: ">";
  12. }
  13. input[type="radio"]:checked::after {
  14. content: "v";
  15. }

对于<div>,默认是隐藏的,只有被选中的<radio>后面的<div>才显示。至于折叠动画的话,就看需求了,对我来说,没有动画会更清爽一点。

  1. input[type="radio"] + div {
  2. display: none;
  3. }
  4. input[type="radio"]:checked + div {
  5. display: block;
  6. }

以上就是基本布局,再加上一点其他样式,就成了:

192e7d623a0ddedcc4811c5fab7db066.png

但是由于<radio>的特性,无法反选,菜单展开后想要折叠只能点别的菜单项,当然这也没什么,如果非要实现反选菜单的功能,需要记录上次展开的菜单项,每次发生点击事件时,判断是否重复点击:

  1. // for every <radio>
  2. radio.onclick = () => {
  3. if (window.radio === radio) {
  4. input.checked = false;
  5. window.radio = null;
  6. } else window.radio = radio;
  7. };

这样就实现了单选折叠菜单的反选能力:

a92c5f3b16fb6ea25513791832948417.gif

对了,图中混乱的文字是原来文字被打乱的结果(隐私需要),可以通过下面的代码将一个字符串打乱:

  1. string.split('').sort(() => Math.random() - 0.5).join('')

到此这篇关于CSS实现单选折叠菜单功能的文章就介绍到这了,更多相关CSS单选折叠菜单内容请搜索w3xue以前的文章或继续浏览下面的相关文章,希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号