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

要实现带圆角的多级下拉菜单效果,需要使用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日

相关文章

  • js实现当鼠标移到表格上时显示这一格全部内容的代码

    下面是实现鼠标悬浮表格格子时显示全部内容的完整攻略。 1. 给每个格子绑定事件 首先,需要给每个表格格子绑定事件,可以使用addEventListener()方法来实现。示例代码如下: const tds = document.querySelectorAll(‘td’); for (let i = 0; i < tds.length; i++) { …

    css 2023年6月10日
    00
  • 基于vue中对鼠标划过事件的处理方式详解

    基于Vue中对鼠标划过事件的处理方式详解 1. 什么是鼠标划过事件? 鼠标划过事件是指光标经过一个元素时触发的事件。在前端开发中,常常使用这个事件来实现网站上的一些交互效果,如下拉菜单的展开、图像的放大等等。 2. 在Vue中如何实现鼠标划过事件? Vue对于鼠标划过事件的处理方式有两种,分别是通过v-on绑定事件和通过@绑定事件。下面我们将分别介绍这两种方…

    css 2023年6月10日
    00
  • CSS学习之一 CSS样式的引入

    关于CSS样式的引入有以下几种方法: 内部样式表 内部样式表是指将CSS样式直接写在HTML文档中,使用style标签将CSS样式放在head标签中。 示例代码: <!DOCTYPE html> <html> <head> <title>示例文档</title> <style> body…

    css 2023年6月9日
    00
  • 25种提高网页加载速度的方法和技巧

    25种提高网页加载速度的方法和技巧 在当今互联网时代,拥有一个快速响应的网站是至关重要的。现在网络用户注重速度,如果您的网站加载速度过慢,可能会失去潜在用户。以下是25种提高网页加载速度的方法和技巧: 1. 压缩图片 图片是拖慢网页加载速度的主要因素之一。通过压缩图片文件可以减少文件大小,提高网页加载速度。 示例:使用ImageOptim,或Compress…

    css 2023年6月10日
    00
  • css浮动 float属性详解

    CSS浮动float属性详解 什么是CSS浮动float? CSS浮动(float)是一种布局方式,可以在网页中实现元素的多列布局以及图片与文字环绕等效果。使用浮动属性可以将元素沿着父元素左侧或者右侧移动,直到遇到父元素的边框或其他浮动元素的边框为止。 如何使用CSS浮动float? 在CSS中,我们可以使用float属性来实现浮动布局。其语法如下: sel…

    css 2023年6月10日
    00
  • CSS使用技巧20则

    让我们来详细讲解“CSS使用技巧20则”的完整攻略吧。 CSS使用技巧20则 1. 了解CSS选择器的优先级规则 在多个CSS样式规则中,当发生冲突时,浏览器要判断哪个样式规则应该优先应用。这时就需要了解CSS选择器的优先级规则了。 CSS选择器的优先级从高到低分别是: !important声明(高于任何其他声明) 内联样式声明 ID选择器 类选择器、属性选…

    css 2023年6月9日
    00
  • CSS3波浪效果示例(前端必学)

    下面我为大家详细讲解“CSS3波浪效果示例(前端必学)”的完整攻略。 1. 环境准备 首先,我们要准备好编辑器工具,例如Sublime、VSCode等,并且要在电脑上安装好Chrome浏览器。 2. HTML结构 首先,我们先来看一下HTML结构。我们需要一个包含一个<section>标签的HTML文件,代码如下: <!DOCTYPE ht…

    css 2023年6月9日
    00
  • 点击地图div上的按钮实现对地图数据的入库操作

    针对这个问题,我会提供一份完整攻略,解释如何通过点击地图div上的按钮来实现对地图数据的入库操作。 步骤1:创建地图 首先,需要创建一个地图。可以使用开源的JS库,如Leaflet,OpenLayers等。在这里,我们以Leaflet为例。使用以下代码创建一个地图: <div id="map"></div> &lt…

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