JS+CSS简单树形菜单实现方法

下面是 "JS+CSS简单树形菜单实现方法" 的完整攻略:

1. 目标

本教程旨在讲解如何使用 JavaScript 和 CSS 技术实现简单的树形菜单,并包含两个示例说明以供参考。

2. 实现过程

2.1 HTML 结构

首先,需要一个 HTML 结构,用于展示树形菜单。这里使用 \<ul>\<li> 元素来实现,代码如下:

<ul id="tree">
  <li>第一级</li>
  <li>第一级
    <ul>
      <li>第二级</li>
      <li>第二级</li>
      <li>第二级</li>
    </ul>
  </li>
  <li>第一级</li>
</ul>

其中,ul 元素的 id 属性为 "tree",用于方便后续 JavaScript 代码的获取。

2.2 CSS 样式

接下来,需要使用 CSS 技术来美化菜单样式。这里使用了一些基本的 CSS 样式设计,代码如下:

ul {
  list-style: none;
  padding-left: 0;
  margin-top: 10px;
}

li {
  margin-bottom: 5px;
  padding: 5px 10px;
  border-radius: 3px;
  transition: background-color 0.3s;
}

li:hover {
  background-color: #f0f0f0;
}

ul ul {
  margin-left: 10px;
  display: none;
}

li.has-children:before {
  content: "+ ";
  float: left;
  margin-right: 5px;
}

li.has-children.open:before {
  content: "- ";
}

li.has-children:hover:before {
  color: #333;
}

其中,样式包括:

  • 对 UL 和 LI 元素的基本样式设置,如去除列表标志、设置间距等
  • 对菜单项进行排版美化,如设置圆角边框、背景颜色等
  • 设置菜单项的 hover 样式,用于提示用户当前选择的菜单项
  • 对菜单项的子级列表进行层级间距调整,以及隐藏子级列表的样式设置
  • 对含有子级的菜单项添加前缀可以展开及折叠子级菜单的“+/-”号,并且设置鼠标移入时的字体颜色变化

2.3 JavaScript 代码

最后,我们需要使用 JavaScript 代码来实现树形菜单的功能。具体实现分为以下几步。

2.3.1 获取元素

需要使用 document.getElementById() 方法获取树形菜单的 UL 元素。代码如下:

const tree = document.getElementById('tree');

2.3.2 事件监听

首先,为每个含有子级的菜单项添加 click 事件监听器。并在监听器中 toggle 该菜单项的 open 类属性。

document.querySelectorAll('li.has-children').forEach((li) => {
  li.addEventListener('click', () => {
    li.classList.toggle('open');
  });
});

这样,当用户点击一个带有子级的菜单项时,其展开状态(即“+/-”号的状态)将发生变化。

2.3.3 子菜单展示

接着,为菜单项添加鼠标进入事件的监听器。当用户鼠标进入某个菜单项时,将显示该菜单项的子级列表。反之,则隐藏该列表。

document.querySelectorAll('li.has-children').forEach((li) => {
  li.addEventListener('mouseover', () => {
    const ul = li.querySelector('ul');
    if (ul) {
      ul.style.display = 'block';
    }
  });

  li.addEventListener('mouseout', () => {
    const ul = li.querySelector('ul');
    if (ul) {
      ul.style.display = 'none';
    }
  });
});

2.3.4 完整代码

最终,树形菜单的完整代码如下所示:

<!DOCTYPE html>
<html lang="zh-cn">
<head>
  <meta charset="UTF-8">
  <title>JS+CSS简单树形菜单实现方法</title>
  <style>
    ul {
      list-style: none;
      padding-left: 0;
      margin-top: 10px;
    }

    li {
      margin-bottom: 5px;
      padding: 5px 10px;
      border-radius: 3px;
      transition: background-color 0.3s;
    }

    li:hover {
      background-color: #f0f0f0;
    }

    ul ul {
      margin-left: 10px;
      display: none;
    }

    li.has-children:before {
      content: "+ ";
      float: left;
      margin-right: 5px;
    }

    li.has-children.open:before {
      content: "- ";
    }

    li.has-children:hover:before {
      color: #333;
    }
  </style>
</head>
<body>
  <ul id="tree">
    <li>第一级</li>
    <li>第一级
      <ul>
        <li>第二级</li>
        <li>第二级
          <ul>
            <li>第三级</li>
            <li>第三级</li>
          </ul>
        </li>
        <li>第二级</li>
      </ul>
    </li>
    <li>第一级</li>
  </ul>

  <script>
    const tree = document.getElementById('tree');
    document.querySelectorAll('li.has-children').forEach((li) => {
      li.addEventListener('click', () => {
        li.classList.toggle('open');
      });

      li.addEventListener('mouseover', () => {
        const ul = li.querySelector('ul');
        if (ul) {
          ul.style.display = 'block';
        }
      });

      li.addEventListener('mouseout', () => {
        const ul = li.querySelector('ul');
        if (ul) {
          ul.style.display = 'none';
        }
      });
    });
  </script>
</body>
</html>

3. 示范说明

下面是两个树形菜单的设计示例:

3.1 示例 1

本示例中,我们使用了一些特别的样式,并使用的是垂直方向的树布局。具体实现请见以下代码:

<!DOCTYPE html>
<html lang="zh-cn">
<head>
  <meta charset="UTF-8">
  <title>示例 1</title>
  <style>
    ul {
      list-style: none;
      margin-top: 10px;
    }

    li {
      padding: 8px 16px;
      position: relative;
    }

    li:before, li:after {
      content: "";
      position: absolute;
      top: 50%;
      border-style: solid;
      border-width: 0 1px;
    }

    li:before {
      left: -16px;
      border-top-width: 1px;
      border-bottom-width: 1px;
      border-left-width: 0;
    }

    li:after {
      left: -8px;
      border-top-width: 7px;
      border-bottom-width: 0;
      border-left-width: 1px;
    }

    li:first-child:before {
      top: 22px;
    }

    li:last-child:after {
      border-top-width: 0;
      border-bottom-width: 1px;
      top: -1px;
    }

    li.open ul {
      display: block;
    }

    li:hover {
      background-color: #E3F2FD;
    }

    ul ul {
      display: none;
      padding-left: 20px;
    }

    li:last-child ul li:before {
      display: none;
    }
  </style>
</head>
<body>
  <ul id="tree">
    <li>第一级</li>
    <li>第一级
      <ul>
        <li>第二级</li>
        <li>第二级
          <ul>
            <li>第三级</li>
            <li>第三级</li>
          </ul>
        </li>
        <li>第二级</li>
      </ul>
    </li>
    <li>第一级</li>
  </ul>

  <script>
    const tree = document.getElementById('tree');
    document.querySelectorAll('li.has-children').forEach((li) => {
      li.addEventListener('click', () => {
        li.classList.toggle('open');
      });
    });
  </script>
</body>
</html>

3.2 示例 2

本示例中,我们使用的是横向方向的树布局,并使用了自定义样式来完成。这个示例的设计可以拿来实现左侧导航菜单,具体实现请见以下代码:

<!DOCTYPE html>
<html lang="zh-cn">
<head>
  <meta charset="UTF-8">
  <title>示例 2</title>
  <style>
    ul {
      list-style: none;
      margin-top: 10px;
      font-family: "Microsoft YaHei", sans-serif;
    }

    li {
      display: inline-block;
      position: relative;
    }

    li>a {
      color: #333;
      display: block;
      padding: 8px 16px;
      border-radius: 3px;
    }

    li>a:focus, li>a:hover {
      background-color: #f0f0f0;
    }

    li.open>a, li>a.active {
      background-color: #4CAF50;
      color: #fff;
    }

    li.open>a:hover, li>a.active:hover {
      background-color: #4CAF50;
    }

    ul ul {
      visibility: hidden;
      position: absolute;
      top: 100%;
      left: 0;
      background-color: #fff;
      border-radius: 3px;
      box-shadow: rgba(0, 0, 0, 0.3) 0 1px 6px;
      z-index: 1;
    }

    li:hover>ul {
      visibility: visible;
    }

    ul ul li {
      clear: both;
      width: 100%;
    }

    ul ul li>a {
      padding: 6px 8px;
      margin-left: -96px;
      background-color: #fff;
    }

    ul ul ul li>a {
      padding-left: 20px;
    }

    li:hover>a {
      background-color: #f0f0f0;
    }

    li.has-children:after {
      content: "+";
      position: absolute;
      top: 50%;
      right: 5px;
      transform: translateY(-50%);
      font-size: 14px;
    }

    li.open.has-children:after {
      content: "-";
    }
  </style>
</head>
<body>
  <ul id="tree">
    <li><a href="#">第一级</a></li>
    <li class="has-children"><a href="#">第一级</a>
      <ul>
        <li><a href="#">第二级</a></li>
        <li><a href="#">第二级</a>
          <ul>
            <li><a href="#">第三级</a></li>
            <li><a href="#">第三级</a></li>
          </ul>
        </li>
        <li><a href="#">第二级</a></li>
      </ul>
    </li>
    <li><a href="#">第一级</a></li>
    <li class="has-children"><a href="#">第一级</a>
      <ul>
        <li><a href="#">第二级</a></li>
        <li><a href="#">第二级</a>
          <ul>
            <li><a href="#">第三级</a></li>
            <li><a href="#">第三级</a>
              <ul>
                <li><a href="#">第四级</a></li>
                <li><a href="#">第四级</a></li>
              </ul>
            </li>
          </ul>
        </li>
      </ul>
    </li>
  </ul>

  <script>
    const tree = document.getElementById('tree');
    document.querySelectorAll('li.has-children').forEach((li) => {
      li.addEventListener('click', () => {
        li.classList.toggle('open');
      });
    });
  </script>
</body>
</html>

4. 总结

以上就是实现 "JS+CSS简单树形菜单" 的完整攻略及两个示例的说明。如果你在实际应用中遇到问题,可以进一步查阅相关文档或资料,也可以在社区上进行提问。希望你能通过本教程快速掌握实现树形菜单的技巧,愉快的编写你的项目代码!

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JS+CSS简单树形菜单实现方法 - Python技术站

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

相关文章

  • div中内容上下居中小结

    下面是“div中内容上下居中小结”的完整攻略。 1. 使用flex布局 使用flex布局是一种简单且通用的方法,可以将容器中的内容上下居中。具体方法如下: .container { display: flex; justify-content: center; align-items: center; } 上述代码会使.container容器中的内容在纵向上…

    css 2023年6月10日
    00
  • 基于Leaflet的VideoOverlay视频图层叠加实战教程

    下面我将详细讲解 “基于Leaflet的VideoOverlay视频图层叠加实战教程”, 首先我将通过以下标题来讲述: 一、前言 在本文中,我们将讲解如何使用基于Leaflet的VideoOverlay插件来创建可以叠加在地图上的视频图层。这些图层能够展示用于监控、导航、地理信息分析等方面的视觉数据。在本文中,我们将深入了解该插件的实现原理,并为您提供一些示…

    css 2023年6月9日
    00
  • CSS子元素选择父元素的实现

    CSS 子元素选择父元素的实现,其实就是通过 CSS 选择器来选择某个元素下面子元素中的某个标签,同时还要求这个子元素必须是其直接的子元素,而不是后代元素。 使用 CSS 子元素选择器可以非常方便地实现父元素和子元素之间的关系。下面,我会为大家提供两种实现方法示例。 方法一: “>” 子元素选择器 利用 “>” 子元素选择器,我们可以很方便地实现…

    css 2023年6月9日
    00
  • 网页设计经验之杜绝设计中的视觉噪音(图文)

    网页设计中,视觉噪音是指过度复杂、过度花哨或过于杂乱的设计元素所带来的视觉干扰,使得用户难以关注主要内容并影响用户体验。因此,杜绝视觉噪音是一项关键的网页设计经验。以下是完整攻略。 1. 确定设计主题 在网页设计之前,要先确定设计主题,确保主题与网站的目的、用户类型和品牌理念相符。一个清晰简洁的主题可以帮助你将视觉元素保持在一个有限的范围内,以避免视觉噪音。…

    css 2023年6月10日
    00
  • css实现各种0.5px的线(小结)

    下面是CSS实现各种0.5px的线的完整攻略,包含两个示例说明。 简介 CSS中的像素单位并不等同于设备像素。大多数的设备像素比CSS像素大,所以CSS中的1px看起来比设备实际像素宽。当我们需要实现细线时,通常会遇到无法精确控制线条宽度的问题,比如0.5px的细线。 使用border实现0.5px的线 在CSS中,我们可以使用border属性创建各种线条,…

    css 2023年6月10日
    00
  • 详解CSS外边距折叠引发的问题

    下面是详解CSS外边距折叠引发的问题的完整攻略。 什么是外边距折叠? 首先,我们需要了解什么是外边距折叠。外边距折叠,指的是当两个或多个相邻的盒子的外边距(margin)相遇时,会合并成一个外边距,即折叠掉多余的外边距,这种现象也被称为外边距合并。 什么情况下会出现外边距折叠? 外边距折叠只会在一定的情况下出现,主要有以下两种情况: 1. 相邻的兄弟元素之间…

    css 2023年6月9日
    00
  • 超漂亮的Bootstrap 富文本编辑器summernote

    下面是关于“超漂亮的Bootstrap 富文本编辑器summernote”详细的攻略。 1. 什么是summernote? Summernote 是一款基于 Bootstrap 的富文本编辑器,它支持基本的文本编辑和图片上传等功能。它外观简洁美观,易于使用,而且支持自定义功能和皮肤。 2. 使用summernote 2.1 安装summernote 首先,你…

    css 2023年6月9日
    00
  • 值得收藏的CSS命名规范(规则)常用的CSS命名规则

    下面是关于“值得收藏的CSS命名规范(规则)常用的CSS命名规则”的详细讲解,包含以下内容: 什么是CSS命名规范? CSS命名规范是指在编写CSS代码时,根据一定的规则和标准对CSS样式名称进行命名的方式。通过遵循CSS命名规范,我们可以更好地组织和管理我们的代码,从而提高代码的可读性和可维护性。 常用的CSS命名规则 1. BEM命名法 BEM是一种广泛…

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