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关于页面焦点的定位(文本框获取焦点时改变样式 )
Sep 10 Javascript
javascript中clone对象详解
Dec 03 Javascript
jquery Validation表单验证使用详解
Sep 12 Javascript
jQuery Real Person验证码插件防止表单自动提交
Nov 06 Javascript
微信JS-SDK坐标位置如何转换为百度地图坐标
Jul 04 Javascript
Javascript 获取鼠标当前的位置实现方法
Oct 27 Javascript
微信小程序 出现47001 data format error原因解决办法
Mar 10 Javascript
React Native 环境搭建的教程
Aug 19 Javascript
js数组方法reduce经典用法代码分享
Jan 07 Javascript
layui点击数据表格添加或删除一行的例子
Sep 12 Javascript
javascript如何实现create方法
Nov 04 Javascript
JavaScript 正则应用详解【模式、欲查、反向引用等】
May 13 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
Flash空降上海 化身大魔王接受挑战
2020/03/02 星际争霸
php include类文件超时问题处理
2015/02/06 PHP
php查询相似度最高的字符串的方法
2015/03/12 PHP
PHP使用strtotime计算两个给定日期之间天数的方法
2015/03/18 PHP
PHP 类与构造函数解析
2017/02/06 PHP
用XMLDOM和ADODB.Stream实现base64编码解码实现代码
2010/11/28 Javascript
js中top/parent/frame概述及案例应用
2013/02/06 Javascript
JQuery结合CSS操作打印样式的方法
2013/12/24 Javascript
Javascript基础知识(一)核心基础语法与事件模型
2014/09/29 Javascript
jquery.validate 自定义验证方法及validate相关参数
2016/01/18 Javascript
利用jQuery的动画函数animate实现豌豆发射效果
2016/08/28 Javascript
在ABP框架中使用BootstrapTable组件的方法
2017/07/31 Javascript
AngularJs每天学习之总体介绍
2017/08/07 Javascript
vue.js 实现输入框动态添加功能
2018/06/25 Javascript
史上最为详细的javascript继承(推荐)
2019/05/18 Javascript
vue 实现v-for循环回来的数据动态绑定id
2019/11/07 Javascript
如何阻止移动端浏览器点击图片浏览
2020/08/29 Javascript
[06:36]吞吞映像top1
2014/06/20 DOTA
在Python的Django框架中用流响应生成CSV文件的教程
2015/05/02 Python
Python检测一个对象是否为字符串类的方法
2015/05/21 Python
Python处理文本文件中控制字符的方法
2017/02/07 Python
Pycharm学习教程(4) Python解释器的相关配置
2017/05/03 Python
基于python元祖与字典与集合的粗浅认识
2017/08/23 Python
机器学习之KNN算法原理及Python实现方法详解
2018/07/09 Python
django 实现电子支付功能的示例代码
2018/07/25 Python
python opencv实现图片旋转矩形分割
2018/07/26 Python
Python设计模式之命令模式原理与用法实例分析
2019/01/11 Python
使用Python的SymPy库解决数学运算问题的方法
2019/03/27 Python
CSS3动画和HTML5新特性详解
2020/08/31 HTML / CSS
美国女士泳装店:Swimsuits For All
2017/03/02 全球购物
初中英语课后反思
2014/04/25 职场文书
银行爱岗敬业演讲稿
2014/05/05 职场文书
低碳环保演讲稿
2014/08/28 职场文书
2015年大学迎新晚会总结
2015/07/16 职场文书
护士岗前培训心得体会
2016/01/08 职场文书
Windows server 2016服务器基本设置
2022/08/14 Servers