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高级程序设计(第3版)学习笔记7 js函数(上)
Oct 11 Javascript
jQuery实用函数用法总结
Aug 29 Javascript
JQuery中使用on方法绑定hover事件实例
Dec 09 Javascript
node.js中的events.emitter.removeListener方法使用说明
Dec 10 Javascript
浅谈Javascript中匀速运动的停止条件
Dec 19 Javascript
JavaScript使用setInterval()函数实现简单轮询操作的方法
Feb 02 Javascript
深入理解JavaScript系列(19):求值策略(Evaluation strategy)详解
Mar 05 Javascript
详解js跨域原理以及2种解决方案
Dec 09 Javascript
从零开始学习Node.js系列教程五:服务器监听方法示例
Apr 13 Javascript
一文让你彻底搞清楚javascript中的require、import与export
Sep 24 Javascript
基于Vue 服务端Cookies删除的问题
Sep 21 Javascript
node.js如何根据URL返回指定的图片详解
Oct 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
Mysql中limit的用法方法详解与注意事项
2008/04/19 PHP
理解PHP中的stdClass类
2014/04/18 PHP
PHP+MySQL实现无极限分类栏目的方法
2015/12/23 PHP
PHP Yaf框架的简单安装使用教程(推荐)
2016/06/08 PHP
Javascript开发包大全整理
2006/12/22 Javascript
js获取日期:昨天今天和明天、后天
2014/06/11 Javascript
JS字符串false转boolean的方法(推荐)
2017/03/08 Javascript
解决循环中setTimeout执行顺序的问题
2018/06/20 Javascript
cocos2dx+lua实现橡皮擦功能
2018/12/20 Javascript
vue中img src 动态加载本地json的图片路径写法
2019/04/25 Javascript
[48:47]VGJ.S vs NB 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
利用python获取某年中每个月的第一天和最后一天
2016/12/15 Python
Windows下Python2与Python3两个版本共存的方法详解
2017/02/12 Python
K-means聚类算法介绍与利用python实现的代码示例
2017/11/13 Python
django上传图片并生成缩略图方法示例
2017/12/11 Python
Python基于最小二乘法实现曲线拟合示例
2018/06/14 Python
python 平衡二叉树实现代码示例
2018/07/07 Python
实例详解Matlab 与 Python 的区别
2019/04/26 Python
pyqt5 实现工具栏文字图片同时显示
2019/06/13 Python
python实现超市管理系统(后台管理)
2019/10/25 Python
python实现实时视频流播放代码实例
2020/01/11 Python
python torch.utils.data.DataLoader使用方法
2020/04/02 Python
解决django无法访问本地static文件(js,css,img)网页里js,cs都加载不了
2020/04/07 Python
python查看矩阵的行列号以及维数方式
2020/05/22 Python
利用PyTorch实现VGG16教程
2020/06/24 Python
Keras搭建自编码器操作
2020/07/03 Python
CSS3实现王者荣耀匹配人员加载页面的方法
2019/04/16 HTML / CSS
百思买加拿大:Best Buy Canada
2018/03/20 全球购物
Goodee官方商店:迷你投影仪
2021/03/15 全球购物
经贸日语专业个人求职信范文
2013/12/28 职场文书
40岁生日感言
2014/02/15 职场文书
《匆匆》教学反思
2014/02/22 职场文书
幼儿园毕业园长感言
2014/02/24 职场文书
关于感恩的演讲稿800字
2014/08/26 职场文书
幼儿园感恩节活动方案2014
2014/10/11 职场文书
工作时间擅自离岗检讨书
2014/10/24 职场文书