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 相关文章推荐
常用js脚本
Dec 03 Javascript
读JavaScript DOM编程艺术笔记
Nov 15 Javascript
JavaScript在IE和FF下的兼容性问题
May 19 Javascript
谷歌地图打不开的解决办法
Aug 07 Javascript
JavaScript判断文件上传类型的方法
Sep 02 Javascript
jQuery的事件委托实例分析
Jul 15 Javascript
Linux CentOS系统下安装node.js与express的方法
Apr 01 Javascript
vue事件修饰符和按键修饰符用法总结
Jul 25 Javascript
React性能优化系列之减少props改变的实现方法
Jan 17 Javascript
JS实现给数组对象排序的方法分析
Jun 24 Javascript
在layui.use 中自定义 function 的正确方法
Sep 16 Javascript
jQuery实现的移动端图片缩放功能组件示例
May 01 jQuery
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学习之数组值的操作
2011/04/17 PHP
PHP中获取时间的下一周下个月的方法
2014/03/18 PHP
php微信公众号js-sdk开发应用
2016/11/28 PHP
PHP用continue跳过本次循环中剩余代码的注意点
2017/06/27 PHP
php查询内存信息操作示例
2019/05/09 PHP
些很实用且必用的小脚本代码
2006/06/26 Javascript
(currentStyle)javascript为何有时用style得不到已设定的CSS的属性
2007/08/15 Javascript
javascript中实现兼容JAVA的hashCode算法代码分享
2020/08/11 Javascript
mvc 、bootstrap 结合分布式图简单实现分页
2016/10/10 Javascript
用jmSlip编写移动端顶部日历选择控件
2016/10/24 Javascript
JavaScript自定义分页样式
2017/01/17 Javascript
JS简单实现获取元素的封装操作示例
2017/04/07 Javascript
D3.js实现简洁实用的动态仪表盘的示例
2018/04/04 Javascript
vue组件实现可搜索下拉框扩展
2020/10/23 Javascript
详解Vue结合后台的列表增删改案例
2018/08/21 Javascript
解决vue+element 键盘回车事件导致页面刷新的问题
2018/08/25 Javascript
layui数据表格实现重载数据表格功能(搜索功能)
2019/07/27 Javascript
JS设置自定义快捷键并实现图片上下左右移动
2019/10/17 Javascript
python 简易计算器程序,代码就几行
2009/08/29 Python
使用Python发送各种形式的邮件的方法汇总
2015/11/09 Python
python字符串str和字节数组相互转化方法
2017/03/18 Python
python opencv图片编码为h264文件的实例
2019/12/12 Python
TensorFlow tf.nn.conv2d实现卷积的方式
2020/01/03 Python
CSS3制作翻转效果_动力节点Java学院整理
2017/07/11 HTML / CSS
详解HTML5新增标签
2017/11/27 HTML / CSS
体验完美剃须:The Art of Shaving
2018/08/06 全球购物
EntityManager都有哪些方法
2013/11/01 面试题
教师个人自我评价范文
2014/04/13 职场文书
巾帼建功标兵事迹材料
2014/05/11 职场文书
关于建议书的格式范文
2014/05/20 职场文书
组织鉴定材料
2014/06/02 职场文书
管理提升方案
2014/06/04 职场文书
党员干部反四风对照检查材料思想汇报
2014/09/14 职场文书
逃课检讨书范文
2015/05/06 职场文书
python自动化之如何利用allure生成测试报告
2021/05/02 Python
java设计模式--三种工厂模式详解
2021/07/21 Java/Android