js实现带圆角的多级下拉菜单效果

yizhihongxing

要实现带圆角的多级下拉菜单效果,需要使用HTML、CSS和JavaScript技术。

  1. HTML部分

首先,在HTML中创建ul和li元素,代表菜单和菜单项。每个菜单项li需要设置一个唯一的id,同时在li中添加一个包含菜单项文本的a元素。同时,为了便于样式控制和避免全局污染,还可以给每个菜单一个独特的class。

  1. CSS部分

菜单的样式设定需要涉及到多个方面,包括边框、背景、圆角和定位等。其中,可以使用CSS3的border-radius属性来实现圆角效果,例如: border-radius: 5px; 或者是 border-radius: 10px 10px 0 0;,前者是四个角都为5px的圆角,后者则是左上角和右上角为10px的圆角。

对于多级下拉菜单的定位,可以使用绝对定位或者css flex。绝对定位需要设置li父元素为position: relative,并对子菜单(即li元素中的ul元素)设置position: absolute,同时通过left和top属性来决定子菜单的位置。比如:

ul.dropdown > li {
  position: relative;
}

ul.dropdown li ul {
  position: absolute;
  left: 100%;
  top: 0;
}

另外,常见的下拉菜单展开效果为向下展开,因此需要为下拉菜单的ul元素设置一个向下三角符号,可以利用CSS3的border属性实现:

ul.dropdown li ul {
  border: none;
  border-top: 5px solid #ccc;
}
  1. JavaScript部分

实现多级下拉菜单的关键在于设置菜单项的hover事件。当鼠标悬浮在父级菜单项上时,显示对应的子菜单,鼠标移出时则隐藏。为了能够控制多个子菜单,需要为每个菜单项添加mousein和mouseout事件,并且对每个子菜单进行单独控制。以下是一个简单的示例代码:

var dropdown = document.querySelector('.dropdown');
var menus = dropdown.querySelectorAll('li');

menus.forEach(function(menu){
  var submenu = menu.querySelector('ul');
  if (submenu) {
    menu.addEventListener('mouseenter', function(){
      submenu.style.display = 'block';
    });
    menu.addEventListener('mouseleave', function(){
      submenu.style.display = 'none';
    });
  }
});

以上代码中,首先选中了包含下拉菜单的顶层父级元素.dropdown,然后获取其中的所有子菜单li元素。接下来使用forEach循环遍历每个菜单项,如果它有下级菜单(即包含

    元素),则为它添加mousein和mouseout事件,用来控制子菜单的显示和隐藏。其中,mouseenter和mouseleave事件是为了增加灵敏度和防止重复触发事件。

    1. 示例说明

    以下是两个实现带圆角多级下拉菜单效果的示例代码:

    示例一

    <ul class="dropdown">
      <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>
          <li><a href="#">子菜单三</a></li>
        </ul>  
      </li>
      <li><a href="#">菜单三</a></li>
    </ul>
    
    ul.dropdown {
      position: relative;
      display: inline-block;
    }
    
    ul.dropdown li {
      float: left;
      margin-right: 10px;
      position: relative;
      list-style: none;
    }
    
    ul.dropdown a {
      display: block;
      padding: 10px;
      color: black;
      text-decoration: none;
      border-radius: 5px;
    }
    
    ul.dropdown ul {
      display: none;
      position: absolute;
      top: 100%;
      left: 0px;
      border-radius: 0 0 5px 5px;
      background: #fff;
      padding: 0;
      margin-left: -10px;
      box-shadow: 0px 0px 3px rgba(0,0,0,0.4);
    }
    
    ul.dropdown ul li {
      float: none;
      padding: 5px 10px;
      margin-right: 0;
      position: relative;
    }
    
    ul.dropdown ul ul {
      top: 0;
      left: 100%;
      margin-left: 10px;
      border-radius: 0 0 5px 5px;
      box-shadow: 0px 0px 3px rgba(0,0,0,0.4);
    }
    
    ul.dropdown li:hover > ul {
      display: block;
    }
    
    var dropdown = document.querySelector('.dropdown');
    var menus = dropdown.querySelectorAll('li');
    
    menus.forEach(function(menu){
      var submenu = menu.querySelector('ul');
      if (submenu) {
        menu.addEventListener('mouseenter', function(){
          submenu.style.display = 'block';
        });
        menu.addEventListener('mouseleave', function(){
          submenu.style.display = 'none';
        });
      }
    });
    

    示例二

    <ul class="dropdown">
      <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>
          <li><a href="#">子菜单三</a></li>
        </ul>  
      </li>
      <li><a href="#">菜单三</a></li>
    </ul>
    
    ul.dropdown {
      display: flex;
      justify-content: center;
      align-items: center;
    }
    
    ul.dropdown > li {
      position: relative;
      list-style: none;
    }
    
    ul.dropdown > li > a {
      display: block;
      padding: 10px;
      text-decoration: none;
      color: black;
      border-radius: 5px;
    }
    
    ul.dropdown li ul {
      display: none;
      position: absolute;
      top: 100%;
      left: 0;
      list-style: none;
      padding: 0;
      margin: 0;
      border-radius: 0 0 5px 5px;
      background: #fff;
      box-shadow: 0px 0px 3px rgba(0, 0, 0, 0.4);
    }
    
    ul.dropdown li ul li {
      position: relative;
      padding: 5px 10px;
    }
    
    ul.dropdown ul ul {
      top: 0;
      left: 100%;
      margin-left: 0;
      border-radius: 0 0 5px 5px;
      box-shadow: 0px 0px 3px rgba(0, 0, 0, 0.4);
    }
    
    ul.dropdown li:hover > ul {
      display: block;
    }
    
    var dropdown = document.querySelector('.dropdown');
    var menus = dropdown.querySelectorAll('li');
    
    menus.forEach(function(menu){
      var submenu = menu.querySelector('ul');
      if (submenu) {
        menu.addEventListener('mouseenter', function(){
          submenu.style.display = 'block';
        });
        menu.addEventListener('mouseleave', function(){
          submenu.style.display = 'none';
        });
      }
    });
    

    以上两个示例分别使用了不同的菜单布局和聚合方式,但都是通过CSS3的border-radius属性设置的圆角效果,并在JavaScript中通过mouseenter和mouseleave事件来实现下拉菜单的显示和隐藏。可以根据自己网站需求和页面风格进行选择。

    本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:js实现带圆角的多级下拉菜单效果 - Python技术站

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

相关文章

  • 浅谈CSS潜藏着的BFC

    浅谈CSS潜藏着的BFC – 完整攻略 什么是BFC BFC的全称为Block Formatting Context,即块级格式化上下文。它是CSS中的一种渲染模式,是一个独立的渲染区域,BFC中的元素在布局时只会考虑位于同一BFC中的元素。 BFC的原理 BFC的形成有以下几种情况: 根元素或包含它的元素。 设置 float、position: absol…

    css 2023年6月10日
    00
  • css清除浮动clearfix:after的用法详解(附完整代码)

    下面是详细讲解“css清除浮动clearfix:after的用法详解(附完整代码)”的完整攻略: 一、什么是浮动? 在 HTML 中,浮动是一种常见的布局方式,可以让元素脱离正常文档流,通过左或右浮动实现位置的调整。 但是,当我们使用浮动时,可能会出现一些问题,例如浮动元素引起父容器高度塌陷,导致布局混乱,这时候就要用到清除浮动。 二、清除浮动的几种方法 常…

    css 2023年6月10日
    00
  • 使用ZeroClipboard解决跨浏览器复制到剪贴板的问题

    使用ZeroClipboard解决跨浏览器复制到剪贴板的问题,需要遵循以下几个步骤。 步骤一:下载ZeroClipboard 在官方网站https://github.com/zeroclipboard/zeroclipboard下载ZeroClipboard文件,并将其解压缩。 步骤二:引入ZeroClipboard库 在html文件的<head&gt…

    css 2023年6月10日
    00
  • CSS三角箭头应用实践

    下面是“CSS三角箭头应用实践”的详细攻略: 1. 什么是CSS三角箭头 CSS三角箭头是在CSS中实现三角形形状的常用技术。三角形形状可以用于很多不同场景,比如箭头、下拉菜单等等。 2. 如何实现CSS三角箭头 在CSS中,实现CSS三角箭头主要有两种方法,一种是使用border属性,另一种是使用伪元素(::before和::after)。 2.1 使用b…

    css 2023年6月11日
    00
  • 原生JavaScript实现日历功能代码实例(无引用Jq)

    下面是“原生JavaScript实现日历功能代码实例(无引用Jq)”的完整攻略: 1. 前言 日历是常用的组件之一,本文将通过原生 JavaScript 实现一个简单的日历,并且不依赖于 jQuery 等第三方库。主要实现以下功能: 显示当前时间,包括年、月、日。 可以切换月份,并显示当前月份的日期信息。 2. HTML 结构 HTML 结构十分简单,只需一…

    css 2023年6月9日
    00
  • animation和transition的区别

    当我们在进行页面设计时,常常需要添加动画效果来提高页面视觉体验,其中比较常用的就是animation和transition两种CSS属性。虽然它们都可以实现动画效果,但它们之间也有很大的不同,下面将详细讲解它们的区别。 1. transition的含义 transition是CSS3中的属性,它可以在一段时间内平滑地过渡或变化元素的某些属性值。它的作用是从一…

    css 2023年6月10日
    00
  • CSS网页布局入门教程7:二列固定宽度居中

    下面我就为你详细讲解一下“CSS网页布局入门教程7:二列固定宽度居中”的完整攻略。 标题 介绍 本教程将会讲解如何使用 CSS 实现二列固定宽度居中布局。 示例说明 我们来通过两个示例来说明此布局。 示例1 首先,HTML 代码如下: <div class="container"> <div class="le…

    css 2023年6月10日
    00
  • 如何使用python docx模块操作word文档

    使用Python的docx模块可以方便地操作Word文档,下面将详细讲解操作步骤: 安装docx模块 首先需要安装docx模块,可以使用pip命令进行安装,命令如下: pip install python-docx 打开Word文档 使用docx模块可以通过以下步骤打开Word文档: import docx # 打开Word文档 doc = docx.Doc…

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