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 相关文章推荐
Tab页界面,用jQuery及Ajax技术实现
Sep 21 Javascript
Javascript isArray 数组类型检测函数
Oct 08 Javascript
JSQL 批量图片切换的实现代码
May 05 Javascript
Javascript调用C#代码
Jan 17 Javascript
JS获取当前日期和时间的简单实例
Nov 19 Javascript
jQuery中wrapInner()方法用法实例
Jan 16 Javascript
AngularJS实现树形结构(ztree)菜单示例代码
Sep 18 Javascript
Jquery on绑定的事件 触发多次实例代码
Dec 08 Javascript
小程序getLocation需要在app.json中声明permission字段
Apr 04 Javascript
详解50行代码,Node爬虫练手项目
Apr 22 Javascript
微信小程序点击item使之滚动到屏幕中间位置
Mar 25 Javascript
vue使用swiper实现左右滑动切换图片
Oct 16 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
Zerg建筑一览
2020/03/14 星际争霸
探讨fckeditor在Php中的配置详解
2013/06/08 PHP
PHP统计nginx访问日志中的搜索引擎抓取404链接页面路径
2014/06/30 PHP
php字符串替换函数substr_replace()用法实例
2015/03/17 PHP
php检测图片主要颜色的方法
2015/07/01 PHP
PHP在innodb引擎下快速代建全文搜索功能简明教程【基于xunsearch】
2016/10/14 PHP
PHP实现多级分类生成树的方法示例
2017/02/07 PHP
JavaScript 常见对象类创建代码与优缺点分析
2009/12/07 Javascript
IE无法设置短域名下Cookie
2010/09/23 Javascript
jQuery.each()用法分享
2012/07/31 Javascript
前台js对象在后台转化java对象的问题探讨
2013/12/20 Javascript
jQuery中attr()与prop()函数用法实例详解(附用法区别)
2015/12/29 Javascript
jQuery代码性能优化的10种方法
2016/06/21 Javascript
前端实现文件的断点续传(前端文件提交+后端PHP文件接收)
2016/11/04 Javascript
js字符串操作总结(必看篇)
2016/11/22 Javascript
Bootstrap基本模板的使用和理解1
2016/12/14 Javascript
js实现手机发送验证码功能
2017/03/13 Javascript
深入浅析Vue全局组件与局部组件的区别
2018/06/15 Javascript
Webstorm2016使用技巧(SVN插件使用)
2018/10/29 Javascript
全面了解JavaScript的作用域链
2019/04/03 Javascript
Vue强制组件重新渲染的方法讨论
2020/02/03 Javascript
JS创建自定义对象的六种方法总结
2020/12/15 Javascript
[01:08:57]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS LGD第二场
2014/05/24 DOTA
Python实现计算文件夹下.h和.cpp文件的总行数
2015/04/23 Python
python函数的5种参数详解
2017/02/24 Python
python PyTorch预训练示例
2018/02/11 Python
Python数据可视化 pyecharts实现各种统计图表过程详解
2019/08/15 Python
Python 矩阵转置的几种方法小结
2019/12/02 Python
HTML5 video 事件应用示例
2014/09/11 HTML / CSS
Herschel Supply Co.美国:背包、手提袋及配件
2020/11/24 全球购物
秋天的图画教学反思
2014/05/01 职场文书
教师工作决心书
2015/02/04 职场文书
物业管理交接协议书
2016/03/24 职场文书
导游词之徐州-云龙山
2019/09/29 职场文书
Python中的嵌套循环详情
2022/03/23 Python
python单向链表实例详解
2022/05/25 Python