纯CSS实现可折叠树状菜单

实现一个可折叠的树状菜单,通常可以用JavaScript来进行实现。但是,我们也可以使用纯CSS来实现一个可折叠的树状菜单。

实现思路

我们可以利用HTML中的checkbox和label标签的关联联动效果,以及CSS中的选择器和属性来实现可折叠的树状菜单。具体步骤如下:

  1. 利用HTML的各种标签来构建树状结构,比如使用ul和li标签,其中ul标签表示整个菜单,li标签表示菜单的每一个节点,可包含一个span标签表示节点的名称。
  2. 利用checkbox和label标签的关联联动效果,来实现菜单的展开和收缩。具体做法是,在li标签内先插入一个checkbox标签,然后再插入带有for属性的label标签,for属性的值为checkbox标签的id属性值。也就是说,点击label标签时,就会触发checkbox标签的勾选或取消勾选。
  3. 利用CSS的选择器和属性控制菜单的样式和状态。具体做法是,利用选择器选择checkbox标签和label标签的状态来控制菜单的样式。例如,当checkbox标签被勾选时,利用+符号选择下一个兄弟元素的状态,来控制菜单的显隐。当checkbox标签没有勾选时,使用:checked选择器将其隐藏。

示例

下面提供两个示例用来说明如何实现纯CSS的可折叠树状菜单。

示例1

HTML代码:

<ul class="menu">
  <li>
    <input type="checkbox" id="menu1" />
    <label for="menu1">菜单1</label>
    <ul>
      <li>
        <input type="checkbox" id="menu1-1" />
        <label for="menu1-1">菜单1-1</label>
        <ul>
          <li>
            <span>菜单1-1-1</span>
          </li>
          <li>
            <span>菜单1-1-2</span>
          </li>
        </ul>
      </li>
      <li>
        <span>菜单1-2</span>
      </li>
    </ul>
  </li>
</ul>

CSS代码:

/* 控制所有 ul 标签的样式 */
.menu {
  list-style-type: none;
  padding: 0;
  margin: 0;
}

/* 控制第一级 li 标签的样式 */
.menu > li {
  position: relative;
}

/* 控制第一级单选框的样式 */
.menu > li > input[type="checkbox"] {
  display: none;
}

/* 控制第一级标签的样式 */
.menu > li > label {
  display: inline-block;
  padding-left: 16px;
  position: relative;
  z-index: 2;
  cursor: pointer;
}

/* 控制第一级菜单的折叠样式 */
.menu > li > ul {
  max-height: 0;
  overflow: hidden;
  list-style-type: none;
  padding: 0;
  margin: 0;
  position: absolute;
  top: 100%;
  left: 0;
  width: 100%;
  z-index: 1;
  transition: all 0.3s ease;
}

/* 控制第一级菜单的展开样式 */
.menu > li > input[type="checkbox"]:checked ~ ul {
  max-height: 150px; /* 修改 max-height,实现菜单的展开 */
}

/* 控制第二级 ul 标签的样式 */
.menu > li > ul > li > ul {
  max-height: 0;
  overflow: hidden;
  list-style-type: none;
  padding: 0;
  margin: 0 0 0 16px;
  position: relative;
  left: 16px;
  transition: all 0.3s ease;
}

/* 控制第二级单选框的样式 */
.menu > li > ul > li > input[type="checkbox"] {
  display: none;
}

/* 控制第二级 label 标签的样式 */
.menu > li > ul > li > label {
  display: inline-block;
  padding-left: 16px;
  position: relative;
  cursor: pointer;
}

/* 控制第二级叶节点的样式 */
.menu > li > ul > li > span {
  display: inline-block;
  padding-left: 16px;
  cursor: pointer;
}

/* 控制第二级菜单的展开样式 */
.menu > li > ul > li > input[type="checkbox"]:checked ~ ul {
  max-height: 150px; /* 修改 max-height,实现菜单的展开 */
}

示例2

HTML代码:

<ul class="menu">
  <li>
    <input type="checkbox" id="menu2" />
    <label for="menu2">菜单2</label>
    <ul>
      <li>
        <span>菜单2-1</span>
        <ul>
          <li>
            <span>菜单2-1-1</span>
          </li>
          <li>
            <span>菜单2-1-2</span>
          </li>
        </ul>
      </li>
      <li>
        <span>菜单2-2</span>
      </li>
    </ul>
  </li>
</ul>

CSS代码:

/* 控制所有 ul 标签的样式 */
.menu {
  list-style-type: none;
  padding: 0;
  margin: 0;
}

/* 控制第一级 li 标签的样式 */
.menu > li {
  position: relative;
}

/* 控制第一级单选框的样式 */
.menu > li > input[type="checkbox"] {
  display: none;
}

/* 控制第一级 label 标签的样式 */
.menu > li > label {
  display: inline-block;
  padding-left: 16px;
  position: relative;
  z-index: 2;
  cursor: pointer;
}

/* 控制第一级菜单的折叠样式,因为没有子菜单,所以 max-height 设置为0 */
.menu > li > ul {
  max-height: 0;
  overflow: hidden;
  list-style-type: none;
  padding: 0;
  margin: 0;
  position: absolute;
  top: 100%;
  left: 0;
  width: 100%;
  z-index: 1;
  transition: all 0.3s ease;
}

/* 控制第一级菜单的展开样式 */
.menu > li > input[type="checkbox"]:checked ~ ul {
  max-height: 150px; /* 修改 max-height,实现菜单的展开 */
}

/* 控制第二级 ul 标签的样式 */
.menu > li > ul > li > ul {
  max-height: 0;
  overflow: hidden;
  list-style-type: none;
  padding: 0;
  margin: 0 0 0 16px;
  position: relative;
  left: 16px;
  transition: all 0.3s ease;
}

/* 控制第二级叶节点的样式,因为没有子菜单,所以不设置展开样式 */
.menu > li > ul > li > span {
  display: inline-block;
  padding-left: 16px;
  cursor: pointer;
}

注意事项

在使用纯CSS实现可折叠的树状菜单时需要注意以下几点:

  1. checkbox和label标签必须要有正确的关联,才能实现菜单的展开和收缩效果。其中,checkbox标签的id属性值必须和label标签的for属性值相同。
  2. 由于纯CSS实现树状菜单的方式是通过伪类:checked控制伪元素,实现菜单的展开和收缩,因此展开和收缩的过程都是瞬间完成的。如果需要实现缓慢展开和收缩的效果,可以在CSS中使用transition属性,设置动画时间和效果。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:纯CSS实现可折叠树状菜单 - Python技术站

(0)
上一篇 2023年6月9日
下一篇 2023年6月9日

相关文章

  • js css 实现遮罩层覆盖其他页面元素附图

    关于JS和CSS实现遮罩层覆盖其他页面元素,以下是详细的攻略: 基础知识 在了解实现方法之前,我们需要了解遮罩层的概念,遮罩层通常被用于在页面上方创建一个可见但不可操作的蒙层,来防止用户对页面进行交互,一些常见的用法有模态框、提示框等。 实现遮罩层通常需要以下几个步骤: 添加一个蒙层元素; 设置蒙层元素的样式; 插入蒙层元素到页面中; 如果需要,使用JS对蒙…

    css 2023年6月9日
    00
  • 利用纯CSS3实现tab选项卡切换示例代码

    接下来我将为您详细讲解如何利用纯CSS3实现tab选项卡切换,以下是完整攻略: 1. HTML结构 首先我们需要搭建好选项卡的HTML结构,一般来说包括选项卡头和选项卡内容两部分。其中,选项卡头通常由一个ul元素和多个li元素组成,而选项卡内容则由多个div元素组成,每个div元素代表一个选项卡的内容。 我们可以像下面这样搭建HTML结构: <div …

    css 2023年6月10日
    00
  • 如何去掉内联样式 通过style属性定义的(element.style)

    如何去掉使用style属性定义的内联样式是前端开发中一个常见需求。以下是完整的攻略: 1. 使用JavaScript 在JavaScript中可以通过使用element.style来获取到元素的内联样式。我们可以使用element.style.property = ”来清空某一属性的内联样式。 示例1:清空段落元素P的背景颜色样式: let p = doc…

    css 2023年6月9日
    00
  • jquery sortable的拖动方法示例详解

    jQuery Sortable 拖动方法示例详解 jQuery Sortable 是一款基于 jQuery 的可拖拽列表插件,它可以轻松实现列表元素的拖动排序。下面我将详细讲解该插件的使用方法,帮助您轻松实现排序效果。 步骤1:引入jQuery Sortable 插件 在网页中引入 jQuery 和 jQuery Sortable 插件的 js 文件,示例如…

    css 2023年6月10日
    00
  • nice怎么直播?nice直播方法图解

    Nice怎么直播?Nice直播方法图解 如果你想进行直播或观看别人的直播,可以尝试使用Nice直播,它是一款功能强大、简单易用的直播平台。本文将详细讲解Nice怎么直播以及Nice直播方法图解。 步骤一:下载并安装Nice直播客户端 首先,你需要访问官方网站,下载并安装Nice直播客户端。Nice直播目前支持Windows和Mac版,选择适合自己电脑系统的版…

    css 2023年6月11日
    00
  • Vue快速实现通用表单验证功能

    下面是“Vue快速实现通用表单验证功能”的完整攻略: 1. 需求背景 在前端开发中,表单验证是一个必不可少的功能,但每个表单的验证规则都不尽相同,造成了大量重复的工作,降低了开发效率。因此,我们需要一种通用的表单验证方案,可以快速实现各种表单验证规则。 2. 解决方案 Vue提供了丰富的API和生命周期,可以使开发者在编写代码时更加高效。我们可以使用Vue的…

    css 2023年6月9日
    00
  • JavaScript实现div的鼠标拖拽效果

    对于 “JavaScript实现div的鼠标拖拽效果” 这个问题,我将分为以下几个部分来进行详细讲解: 实现思路 相关API及代码示例 注意事项和遇到的问题及解决方法 1. 实现思路 实现鼠标拖拽的原理是:当鼠标在可拖拽元素上按下时,我们需要记录下相应的鼠标位置以及元素的位置信息,并在后续鼠标移动时进行计算,以实现元素跟随鼠标移动的效果,然后在鼠标抬起时,停…

    css 2023年6月10日
    00
  • 详解Android端与JavaWeb传输加密(DES+RSA)

    详解Android端与JavaWeb传输加密(DES+RSA)攻略 前置知识 在学习本文之前,你需要掌握以下知识: Java语言基础 Android开发基础 JavaWeb开发基础 数据加密相关的概念和基础知识 加密方案简介 在本方案中,我们将采用DES和RSA算法分别对数据进行对称加密与非对称加密,保证通信过程的安全性。具体实现过程如下: 首先在Andro…

    css 2023年6月10日
    00
合作推广
合作推广
分享本页
返回顶部