纯CSS实现可折叠树状菜单

yizhihongxing

实现一个可折叠的树状菜单,通常可以用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日

相关文章

  • 学习CSS的10大理由

    学习CSS的10大理由 CSS(Cascading Style Sheets)是构建网页样式的基础技术之一,掌握CSS将使你成为一个优秀的前端开发者。下面是学习CSS的10大理由: 1. 网站UI定制化 无论是为自己的公司或客户的网站,还是个人博客、作品展示等,有一个独特而充满吸引力的网站对于用户的体验和反响都至关重要。CSS能够帮助你打造出独具一格和符合需…

    css 2023年6月9日
    00
  • 让横向排列的几个浮动(float:left)的子div居中显示

    要让横向排列的浮动子 div 居中显示,可以采用以下两种方法: 1. 使用 Flex 布局 使用 Flex 布局是最简单、最好理解的方法,同时也是最常用的方法之一。通过设置 flex 容器的属性,可以让子元素自动排列,并自动居中。 以下是具体实现步骤: 设置容器的 display 属性为 flex。 .parent { display: flex; } 设置…

    css 2023年6月10日
    00
  • css3中仿放大镜效果的几种方式原理解析

    针对“css3中仿放大镜效果的几种方式原理解析”这个话题,我可以分享一些完整的攻略,帮助你更好地了解。 实现原理 CSS3中实现放大镜效果一般有两种常用方式: 使用transform属性进行缩放:利用transform属性中的scale()函数,将需要放大的区域缩小至原始尺寸的比例,再为放大镜创建一个相同的区域进行放大。放大效果的实现依靠了scale()函数…

    css 2023年6月10日
    00
  • 网页常用特效代码整理

    让我为大家详细讲解“网页常用特效代码整理”的完整攻略。 网页常用特效代码整理 在网页设计与开发中,为了突出页面的特色,常常使用一些特效达到吸引用户的目的。以下整理了几种常用的特效代码,供大家参考。 动画效果 CSS3 Transition 过渡效果 CSS3 过渡是通过指定起始状态和结束状态来实现的,中间的状态由浏览器计算。可以用在 hover、 click…

    css 2023年6月10日
    00
  • js+css实现的仿office2003界面

    下面是针对“js+css实现的仿office2003界面”的完整攻略: 1. 需要的技术 HTML CSS JavaScript 2. 功能实现 仿Office 2003界面主要包括两个部分:导航栏和主体部分。其中,导航栏实现左侧选项卡和右侧工具栏交互;主体部分采用面板方式实现,并且也包含相应的工具栏。 2.1 导航栏实现 左侧选项卡部分可以采用HTML的u…

    css 2023年6月10日
    00
  • 基于vue和bootstrap实现简单留言板功能

    下面我将为您详细讲解如何基于vue和bootstrap实现简单留言板功能的完整攻略。 环境准备 在开始之前,我们需要确保环境已经准备好,并且已经安装以下工具: Node.js Vue CLI Bootstrap 如果您还没有安装这些工具,可以访问以下链接下载并安装: Node.js:https://nodejs.org/ Vue CLI:https://cl…

    css 2023年6月11日
    00
  • HTML5之SVG 2D入门8—文档结构及相关元素总结

    HTML5之SVG 2D入门8—文档结构及相关元素总结是介绍SVG 2D图像的基本概念、语法和用法的教程。下面是该攻略的详细讲解: HTML5之SVG 2D入门8——文档结构及相关元素总结 1. 文档结构 SVG 2D图像的文档结构与HTML文档的结构有相似之处。文档结构主要分为以下四个部分: <!DOCTYPE> 声明 – 它不是一个HTML标…

    css 2023年6月9日
    00
  • Bootstrap基本组件学习笔记之缩略图(13)

    下面是对“Bootstrap基本组件学习笔记之缩略图(13)”的详细讲解: Bootstrap基本组件学习笔记之缩略图(13) 概述 Bootstrap的缩略图(thumbnail)组件可以展示图片、链接等内容,并提供针对图片和文字的样式设置,是一个十分实用的组件。 基本用法 缩略图基本使用方式如下: <div class="thumbnai…

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