JavaScript实现HTML导航栏下拉菜单[悬浮显示]

JavaScript实现HTML导航栏下拉菜单[悬浮显示]

前端界面进行设计时,我们会遇到鼠标悬浮在某选项上,然后就会凭空显示出菜单出来,这种设计的确受到了很多人的青睐。其实纯css也是可以实现的,但是会有一些限制,必须如要显示的菜单需要作为鼠标悬浮元素的子元素,选择器优先级等等。废话不多说,直接看效果!

.
在这里插入图片描述
样式有点丑,因为待会赶着时间去锻炼哈哈哈,xdm看得懂就行了!

代码实现(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中加上就大功告成了!

第三篇文章,希望大家点赞收藏支持一下!我是Gorho,有空再见!

### 回答1: 可以使用HTMLCSS实现导航栏下拉菜单。以下是一个简单的例子: HTML代码: ``` <nav> <ul> <li><a href="#">主页</a></li> <li><a href="#">关于我们</a> <ul> <li><a href="#">公司简介</a></li> <li><a href="#">团队介绍</a></li> </ul> </li> <li><a href="#">服务</a> <ul> <li><a href="#">网站设计</a></li> <li><a href="#">移动应用开发</a></li> <li><a href="#">社交媒体营销</a></li> </ul> </li> <li><a href="#">联系我们</a></li> </ul> </nav> ``` CSS代码: ``` nav ul { list-style: none; margin: 0; padding: 0; } nav li { display: inline-block; position: relative; padding: 0 10px; } nav ul ul { display: none; position: absolute; top: 100%; } nav ul li:hover > ul { display: inherit; } nav ul ul li { position: relative; top: -60px; border-bottom: 1px solid #ccc; float: none; display: list-item; width: 200px; text-align: left; } nav ul ul ul li { position: relative; top: -40px; left: 200px; } nav a { display: block; color: #000; font-size: 16px; text-decoration: none; } nav ul ul li a { color: #999; font-size: 14px; } nav ul ul li a:hover { color: #fff; background-color: #000; } ``` 在这个例子中,我们使用了HTML的无序列表和链接来创建导航栏。使用CSS,我们对列表项进行样式设置,并将下拉菜单的位置设置为绝对定位。使用:hover伪类选择器,在鼠标悬停在列表项上时显示下拉菜单。在下拉菜单中,我们使用了相对定位来调整菜单的位置,并使用了:hover伪类选择器来设置鼠标悬停时的样式。 ### 回答2: 要使用HTML实现导航栏下拉菜单,可以使用HTML的标签结构和CSS样式来创建。 首先,在HTML中创建一个导航栏的ul元素(无序列表),每个导航项使用li元素(列表项)包裹。在需要有下拉菜单的导航项上,添加一个额外的ul元素,用于显示下拉菜单的选项。 接下来,使用CSS样式来控制导航栏下拉菜单显示和布局。可以使用CSS选择器来选择导航栏的ul元素和下拉菜单的ul元素。通过设置display属性为"none"来隐藏下拉菜单,在需要显示时设置为"display: block"。 使用CSS的定位属性(如position和top)来控制下拉菜单的位置,通常是将其相对于父级导航栏进行定位,使用top属性调整位置到合适的地方。还可以使用CSS的其他属性,如background-color和font-size来设置下拉菜单的样式。 最后,可以使用JavaScript来添加交互效果,例如当鼠标移动到导航栏的导航项上时,显示下拉菜单;当鼠标离开导航栏时,隐藏下拉菜单。 总结起来,使用HTML结构、CSS样式和可能的JavaScript实现导航栏下拉菜单显示和交互效果。 ### 回答3: 要使用HTML实现导航栏下拉菜单,可以使用HTMLCSSJavaScript的组合来完成。下面是实现的基本步骤: 1. 使用HTML创建导航栏的基本结构,通常使用无序列表 (ul) 和列表项 (li) 元素来构建菜单项。 2. 使用CSS定义导航栏的样式,可以设置背景颜色、文本样式等。 3. 在需要添加下拉菜单的菜单项中,添加一个子级无序列表 (ul) 元素,并为其设置样式。 4. 使用CSS设置下拉菜单的样式,例如将其隐藏 (display: none),设置宽度、背景颜色等。 5. 使用JavaScript选择菜单项,并增加事件处理程序,以当鼠标悬停或点击菜单项时显示下拉菜单。可以使用事件监听器 (Event Listener) 或直接内联 JavaScript 代码来实现。当事件触发时,使用 CSS 修改下拉菜单显示属性 (display: block) 以显示菜单。 6. 当鼠标移开菜单项或点击其他地方时,使用 JavaScript 的事件处理程序隐藏下拉菜单。可以通过 CSS 修改菜单的显示属性 (display: none) 实现。 通过以上步骤,就可以实现一个基本的导航栏下拉菜单。使用 HTML 来创建结构,CSS 来定义样式,JavaScript 来增加交互效果,可以使导航栏下拉菜单更加动态和用户友好。
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值