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 相关文章推荐
javascript下过滤数组重复值的代码
Sep 10 Javascript
JQuery 绑定select标签的onchange事件,弹出选择的值,并实现跳转、传参
Jan 06 Javascript
关于hashchangebroker和statehashable的补充文档
Aug 08 Javascript
web的各种前端打印方法之jquery打印插件PrintArea实现网页打印
Jan 09 Javascript
jquery移动listbox的值原理及代码
May 03 Javascript
JavaScript替换当前页面的方法
Apr 03 Javascript
React实现双向绑定示例代码
Sep 19 Javascript
JavaScript中关于for循环删除数组元素内容时出现的问题
Nov 21 Javascript
Node.js websocket使用socket.io库实现实时聊天室
Feb 20 Javascript
Angularjs的$http异步删除数据详解及实例
Jul 27 Javascript
vue如何解决循环引用组件报错的问题
Sep 22 Javascript
深入理解react 组件类型及使用场景
Mar 07 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
php自动加载的两种实现方法
2010/06/21 PHP
7个超级实用的PHP代码片段
2011/07/11 PHP
初识laravel5
2015/03/02 PHP
PHP预定义变量9大超全局数组用法详解
2016/04/23 PHP
取选中的radio的值
2010/01/11 Javascript
JS保留两位小数 四舍五入函数的小例子
2013/11/20 Javascript
一个不错的字符串转码解码函数(自写)
2014/07/31 Javascript
JavaScript实现梯形乘法表的方法
2015/04/25 Javascript
JavaScript实现图片自动加载的瀑布流效果
2016/04/11 Javascript
jQuery的ajax和遍历数组json实例代码
2016/08/01 Javascript
Node.js Mongodb 密码特殊字符 @的解决方法
2017/04/11 Javascript
bootstrap table服务端实现分页效果
2017/08/10 Javascript
Node配合WebSocket做多文件下载以及进度回传
2019/11/07 Javascript
JavaScript ECMA-262-3 深入解析(一):执行上下文实例分析
2020/04/25 Javascript
js操作两个json数组合并、去重,以及删除某一项元素
2020/09/22 Javascript
python 给DataFrame增加index行名和columns列名的实现方法
2018/06/08 Python
python实现Zabbix-API监控
2018/09/17 Python
将Django项目部署到CentOs服务器中
2018/10/18 Python
使用python将时间转换为指定的格式方法
2018/11/12 Python
Python3爬虫使用Fidder实现APP爬取示例
2018/11/27 Python
python无限生成不重复(字母,数字,字符)组合的方法
2018/12/04 Python
python实现将字符串中的数字提取出来然后求和
2020/04/02 Python
在keras里面实现计算f1-score的代码
2020/06/15 Python
Python编写memcached启动脚本代码实例
2020/08/14 Python
日本最大化妆品和美容产品的综合口碑网站:cosme shopping
2019/08/28 全球购物
写自荐信的七个技巧
2013/10/15 职场文书
奥运会口号
2014/06/13 职场文书
2014民事授权委托书范本
2014/09/29 职场文书
教师党员批评与自我批评发言稿
2014/10/15 职场文书
大学生实训报告总结
2014/11/05 职场文书
2014年银行信贷员工作总结
2014/12/08 职场文书
邀请书格式范文
2015/02/02 职场文书
民事申诉状范本
2015/05/20 职场文书
主持人大赛开场白
2015/05/29 职场文书
资产移交协议书
2016/03/24 职场文书
MySQL中rank() over、dense_rank() over、row_number() over用法介绍
2022/03/23 MySQL