JavaScript实现HTML导航栏下拉菜单


Posted in Javascript onNovember 25, 2020

JavaScript实现HTML导航栏下拉菜单[悬浮显示]

前端界面进行设计时,我们会遇到鼠标悬浮在某选项上,然后就会凭空显示出菜单出来,这种设计的确受到了很多人的青睐。其实纯css也是可以实现的,但是会有一些限制,必须如要显示的菜单需要作为鼠标悬浮元素的子元素,选择器优先级等等。废话不多说,直接看效果!

JavaScript实现HTML导航栏下拉菜单

样式有点丑。

代码实现(JavaScript)

1、获取要悬浮的对象和菜单对象

//获取需要悬浮的对象
  let show = document.getElementById("show");
  //获取被隐藏的菜单
  let menu = document.getElementById("menu");

2、对悬浮对象添加鼠标悬浮事件

//给show添加鼠标悬浮事件
  show.onmouseover = function(){
     //改变菜单的内联样式display为block,菜单显示
     menu.style.display = "block";
  }

3、对悬浮对象添加鼠标离开事件

如果先触发了悬浮对象show的鼠标悬浮事件,不移动到菜单menu上就鼠标就离开了,会出现菜单无法隐藏的bug!所以在悬浮对象的鼠标离开事件中,我们需要进行判断,如果鼠标移开后的位置不在菜单menu的范围内,则令菜单menu隐藏,否则就继续显示

show.onmouseout = function(){
   //获取菜单栏的坐标值
   let menux = menu.offsetLeft;
   let menuy = menu.offsetTop;
   let menuX = menu.offsetLeft+menu.offsetWidth;
   let menuY = menu.offsetTop+menu.offsetHeight;

   //获取鼠标的坐标值
   let event = window.event;
   let mouseX = event.clientX;
   let mouseY = event.clientY;

   if(mouseX<menux || mouseX>menuX || mouseY<menuY || mouseY>menuY){
     menu.style.display = "none";
   }
 }

4、分别给菜单menu添加鼠标悬浮和离开事件

这里见码之意,假如鼠标在menu上就显示,离开了就隐藏

//分别给menu对象绑定鼠标悬浮和鼠标离开事件
menu.onmouseover = function(){
   menu.style.display = "block";
}
menu.onmouseleave = function(){
   menu.style.display = "none";
}

源代码:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <script>
    window.onload = function(){
      //获取需要悬浮的对象
      let show = document.getElementById("show");
      //获取被隐藏的菜单
      let menu = document.getElementById("menu");

      //给show添加鼠标悬浮事件
      show.onmouseover = function(){
        //改变菜单的内联样式display为block
        menu.style.display = "block";
      }

      //
      show.onmouseout = function(){
        //获取菜单栏的坐标值
        let menux = menu.offsetLeft;
        let menuy = menu.offsetTop;
        let menuX = menu.offsetLeft+menu.offsetWidth;
        let menuY = menu.offsetTop+menu.offsetHeight;

        //获取鼠标的坐标值
        let event = window.event;
        let mouseX = event.clientX;
        let mouseY = event.clientY;

        if(mouseX<menux || mouseX>menuX || mouseY<menuY || mouseY>menuY){
          menu.style.display = "none";
        }
      }

      //分别给menu对象绑定鼠标悬浮和鼠标离开事件
      menu.onmouseover = function(){
        menu.style.display = "block";
      }
      menu.onmouseleave = function(){
        menu.style.display = "none";
      }
    }
  </script>
  <style>
    *{
      margin: 0;
      padding: 0;
    }
    li{
      list-style: none;
    }
    #show {
      margin-top: 10px;
      margin-left: 10px;
      width: 50px;
      height: 30px;
      border: 1px solid #ccc;
      background-color: pink;
    }
    #menu{
      display: none;
      margin-left: 10px;
      width: 50px;
      border: 1px solid #ccc;
      background: rgba(0, 0, 0, 0.6);
    }
    #menu a{
      color: #fff;
      text-decoration: none;
    }
  </style>
</head>
<body>
  <div id="box">
    <div id="show"><a href="#">Gorho</a></div>
    <ul id="menu">
      <li><a href="#">选项一</a></li>
      <li><a href="#">选项二</a></li>
      <li><a href="#">选项三</a></li>
    </ul>
  </div>
</body>
</html>

写在最后:其实在作品中需要将菜单menu设置成绝对定位,即position:absolute。否则菜单出现后会挤压其他盒子的位置,但笔者赶时间,就没有设置,其实设置也很简单,在css中加上就大功告成了!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
ExtJS PropertyGrid中使用Combobox选择值问题
Jun 13 Javascript
jQuery中toggleClass()方法用法实例
Jan 05 Javascript
AngularJS基础 ng-list 指令详解及示例代码
Aug 02 Javascript
简洁实用的BootStrap jQuery手风琴插件
Aug 31 Javascript
jquery自定义表单验证插件
Oct 12 Javascript
JavaScript队列的应用实例详解【经典数据结构】
Apr 12 Javascript
微信小程序request出现400的问题解决办法
May 23 Javascript
js+html制作简单日历的方法
Jun 27 Javascript
React入门教程之Hello World以及环境搭建详解
Jul 11 Javascript
SelectPage v2.4 发布新增纯下拉列表和关闭分页功能
Sep 07 Javascript
为什么推荐使用JSX开发Vue3
Dec 28 Vue.js
JavaScript this关键字的深入详解
Jan 14 Javascript
vue打开其他项目页面并传入数据详解
Nov 25 #Vue.js
Vue开发中常见的套路和技巧总结
Nov 24 #Vue.js
js实现筛选功能
Nov 24 #Javascript
超详细小程序定位地图模块全系列开发教学
Nov 24 #Javascript
JavaScript实现移动端拖动元素
Nov 24 #Javascript
小程序组件传值和引入sass的方法(使用vant Weapp组件库)
Nov 24 #Javascript
js实现抽奖功能
Nov 24 #Javascript
You might like
967 个函式
2006/10/09 PHP
Php 构造函数construct的前下划线是双的_
2009/12/08 PHP
php伪静态之APACHE篇
2014/06/02 PHP
微信公众平台开发之天气预报功能
2015/08/31 PHP
thinkphp5.1框架实现格式化mysql时间戳为日期的方式小结
2019/10/10 PHP
javascript 浏览器检测代码精简版
2010/03/04 Javascript
AlertBox 弹出层信息提示框效果实现步骤
2010/10/11 Javascript
一个简单的JS时间控件示例代码(JS时分秒时间控件)
2013/11/22 Javascript
Jquery Uploadify上传带进度条的简单实例
2014/02/12 Javascript
Javascript中的作用域和上下文深入理解
2015/07/03 Javascript
js实现当复选框选择匿名登录时隐藏登录框效果
2015/08/14 Javascript
详解JavaScript的内置对象
2016/12/07 Javascript
Bootstrap基本插件学习笔记之模态对话框(16)
2016/12/08 Javascript
原生js实现淘宝购物车功能
2020/06/23 Javascript
es6 filter() 数组过滤方法总结
2019/04/03 Javascript
简述pm2常用命令集合及配置文件说明
2019/05/30 Javascript
vue-calendar-component 封装多日期选择组件的实例代码
2020/12/04 Vue.js
使用C语言来扩展Python程序和Zope服务器的教程
2015/04/14 Python
python爬虫之xpath的基本使用详解
2018/04/18 Python
pandas.DataFrame.to_json按行转json的方法
2018/06/05 Python
Python框架Flask的基本数据库操作方法分析
2018/07/13 Python
python numpy 反转 reverse示例
2019/12/04 Python
python GUI库图形界面开发之PyQt5信号与槽的高级使用技巧(自定义信号与槽)详解与实例
2020/03/06 Python
浅谈opencv自动光学检测、目标分割和检测(连通区域和findContours)
2020/06/04 Python
Django def clean()函数对表单中的数据进行验证操作
2020/07/09 Python
Spartoo英国:欧洲最大的网上鞋店
2016/09/13 全球购物
Intimissimi德国网上商店:意大利知名内衣品牌
2018/04/03 全球购物
Skyscanner台湾:全球知名的旅行比价引擎
2018/07/01 全球购物
《窗前的气球》教学反思
2014/04/07 职场文书
交通事故私了协议书
2014/04/16 职场文书
关于晚自习早退的检讨书
2014/09/13 职场文书
2015年学校食堂工作总结
2015/04/22 职场文书
读《教育心理学》心得体会
2016/01/22 职场文书
2016年国庆节67周年活动总结
2016/04/01 职场文书
24句精辟的现实社会语录,句句扎心,道尽人性
2019/08/29 职场文书
Java Optional<Foo>转换成List<Bar>的实例方法
2021/06/20 Java/Android