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 相关文章推荐
JQuery中对服务器控件 DropdownList, RadioButtonList, CheckboxList的操作总结
Jun 28 Javascript
js汉字转拼音实现代码
Feb 06 Javascript
利用JQuery动画制作滑动菜单项效果实现步骤及代码
Feb 07 Javascript
jQuery实现限制textarea文本框输入字符数量的方法
May 28 Javascript
require.js的用法详解
Oct 20 Javascript
微信小程序 加载 app-service.js 错误解决方法
Oct 12 Javascript
JS字符串统计操作示例【遍历,截取,输出,计算】
Mar 27 Javascript
微信小程序图片选择、上传到服务器、预览(PHP)实现实例
May 11 Javascript
Mongoose中document与object的区别示例详解
Sep 18 Javascript
Vue的事件响应式进度条组件实例详解
Feb 04 Javascript
Vue组件为什么data必须是一个函数
Jun 11 Javascript
Vue+Element ui 根据后台返回数据设置动态表头操作
Sep 21 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
Ajax+PHP 边学边练之四 表单
2009/11/27 PHP
PHP number_format() 函数定义和用法
2012/06/01 PHP
PHP将两个关联数组合并函数提高函数效率
2014/03/18 PHP
简单解决新浪SAE无法上传文件的问题
2015/05/13 PHP
PHP正则表达式过滤html标签属性(DEMO)
2016/05/04 PHP
Win7环境下Apache连接MySQL提示连接已重置的解决办法
2017/05/09 PHP
php使用curl伪造来源ip和refer的方法示例
2018/05/08 PHP
关于JS中的闭包浅谈
2013/08/23 Javascript
JavaScript中prototype为对象添加属性的误区介绍
2013/10/15 Javascript
JavaScript图片放大技术(放大镜)实现代码分享
2013/11/14 Javascript
JavaScript判断textarea值是否为空并给出相应提示
2014/09/04 Javascript
javascript生成img标签的3种实现方法(对象、方法、html)
2015/12/25 Javascript
JavaScript实现的MD5算法完整实例
2016/02/02 Javascript
jQuery简单实现仿京东分类导航层效果
2016/06/07 Javascript
Vue.js 递归组件实现树形菜单(实例分享)
2016/12/21 Javascript
js打开word文档预览操作示例【不是下载】
2019/05/23 Javascript
javascript操作元素的常见方法小结
2019/11/13 Javascript
JavaScript监听一个DOM元素大小变化
2020/04/26 Javascript
[53:15]Mineski vs iG 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
Python使用win32com实现的模拟浏览器功能示例
2017/07/13 Python
对python中的logger模块全面讲解
2018/04/28 Python
Python logging设置和logger解析
2019/08/28 Python
python中的RSA加密与解密实例解析
2019/11/18 Python
python异常处理、自定义异常、断言原理与用法分析
2020/03/23 Python
解决导入django_filters不成功问题No module named 'django_filter'
2020/07/15 Python
Python txt文件常用读写操作代码实例
2020/08/03 Python
Original Penguin美国官网:布拉德皮特、强尼德普喜爱的服装品牌
2016/10/25 全球购物
美国正版电视节目和电影在线观看:Hulu
2018/05/24 全球购物
外企C语言笔试题
2013/11/10 面试题
青年文明号事迹材料
2014/01/18 职场文书
委托公证书
2014/04/08 职场文书
小学生期末评语
2014/04/21 职场文书
劳动仲裁代理词范文
2015/05/25 职场文书
预备党员考察表党小组意见
2015/06/01 职场文书
退伍军人感言
2015/08/01 职场文书
Windows7下FTP搭建图文教程
2022/08/05 Servers