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日

相关文章

  • HTML5 背景的显示区域实现

    下面是关于HTML5背景的显示区域实现的完整攻略。 什么是HTML5背景的显示区域? HTML5背景的显示区域是指网页的背景图或颜色所占据的区域。 在HTML5背景的显示区域中,一般可以设置背景图片、背景颜色、背景重复方式、背景滚动等属性。 实现方法 设置背景颜色 可以使用CSS的background-color属性来设置HTML5背景的显示区域的背景颜色。…

    css 2023年6月9日
    00
  • JS判断不同分辨率调用不同的CSS样式文件实现思路及测试代码

    下面是详细讲解“JS判断不同分辨率调用不同的CSS样式文件实现思路及测试代码”的完整攻略。 思路 可以通过利用JavaScript判断屏幕分辨率的方式,来判断当前设备所使用的设备像素比(DevicePixelRatio)以及分辨率,从而动态加载不同分辨率下的CSS样式文件。具体实现流程如下: 首先,在HTML文档头部中要引入多个CSS样式表,每个样式表都对应…

    css 2023年6月9日
    00
  • 说说react中引入css的方式有哪些并区别在哪

    React 是一个 UI 库,它使用了组件化开发的模式,让我们更加容易的管理我们的代码,因此,React 中如何引入 CSS 样式也是一个很重要的问题。 在 React 中,常用的引入 CSS 的方式有以下三种: 1. 在组件中直接引入样式 这是最简单的引入 CSS 的方式。我们可以直接在组件中的 JSX 中通过 className 属性来引入样式类,样式内…

    css 2023年6月10日
    00
  • CSS3 3D制作实战案例分析

    下面是“CSS3 3D制作实战案例分析”的完整攻略。 CSS3 3D基础 在进行3D制作前,需要了解CSS3 3D基础。CSS3 3D中主要的属性有transform-style、perspective、transform,其中: transform-style用于定义子元素是位于3D空间还是平面空间中,默认值为flat,表示位于平面空间中。 perspec…

    css 2023年6月10日
    00
  • css3新特性的应用示例分析

    下面是关于“css3新特性的应用示例分析”的完整攻略。 一、前言 CSS3自从发布之后,其拥有的多种新特性便激发了开发者们的探索热情。其中许多特性,如圆角、阴影、渐变等,都可以使用简单的CSS代码就能实现。而另一些特性,如动画、过渡、伸缩盒模型等,则需要一些更为复杂的代码和技巧。本文将对各类CSS3新特性做出介绍,并结合具体示例进行演示。 二、CSS3特性示…

    css 2023年6月10日
    00
  • CSS百分比padding制作图片自适应布局

    下面是CSS百分比padding制作图片自适应布局的完整攻略。 什么是CSS百分比padding制作图片自适应布局 CSS百分比padding制作图片自适应布局是一种常见的应用于响应式Web设计中的技术,它可以使图片根据所在容器的大小自适应地缩放,适配不同屏幕尺寸的设备。通过使用该技术,可以让布局更加灵活,更加适合移动端设备。 制作图片自适应布局的步骤 以下…

    css 2023年6月9日
    00
  • 样式表达式实现交替显示table行颜色

    要实现交替显示table行颜色,可以使用样式表达式(CSS expression)。 样式表达式是一种JavaScript表达式,它可以在CSS规则中使用。它的语法类似于JavaScript,可以引用CSS属性值,计算表达式,调用函数等。 具体来说,我们可以在table的CSS规则中使用样式表达式,设置每行的背景颜色。假设我们要将表格的行背景颜色设置为相间的…

    css 2023年6月9日
    00
  • 浅谈VUE单页应用首屏加载速度优化方案

    下面是“浅谈VUE单页应用首屏加载速度优化方案”的完整攻略,共分以下五步: 1. 使用按需加载路由 使用按需加载路由可以大大减少首屏加载时间,把页面按照一定逻辑划分成若干个独立的模块,通过异步按需加载可以提高首屏渲染速度。具体操作如下: 在项目中使用 Vue Router 实现路由功能。 在路由配置中使用动态组件,结合 Webpack 或者是 require…

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