
在构建动态网页菜单时,一个常见的需求是实现鼠标悬停(hover)效果,并且要求同一时间只有一个菜单项保持此悬停状态。这意味着当鼠标从一个菜单项移到另一个菜单项时,前一个菜单项的悬停样式应该被移除,而当前菜单项的悬停样式则被激活。这在不使用jquery或其他j*ascript库的情况下,纯粹依靠原生j*ascript实现时,需要巧妙地管理dom元素的类名。
首先,我们定义一个简单的HTML结构来表示菜单。这个菜单由一个容器div和多个menu-item子div组成。菜单项的数量可以是动态的。
<div id="menu"> <div class="menu-item">Item 1</div> <div class="menu-item">Item 2</div> <div class="menu-item">Item 3</div> <div class="menu-item">Item 4</div> </div>
为了实现悬停效果,我们需要定义基础样式和悬停时的样式。menu-item.hover类将用于表示菜单项被悬停时的状态。添加transition属性可以使悬停效果更平滑。
#menu {
background-color: #0066cc;
padding: 15px;
width: 100%;
}
.menu-item {
height: 25px;
width: fit-content;
color: white;
cursor: pointer;
font-family: sans-serif;
/* 添加过渡效果,使样式变化更平滑 */
transition: margin-left .2s ease-in-out;
}
.menu-item.hover {
margin-left: 15px; /* 悬停时向右偏移 */
}核心逻辑在于,当任何一个菜单项被鼠标悬停时,我们首先要确保所有菜单项的悬停状态都被清除,然后再为当前被悬停的菜单项添加悬停状态。这样就保证了在任何时刻,只有一个菜单项具有hover类。
首先,我们需要获取所有具有menu-item类的DOM元素。document.getElementsByClassName方法返回的是一个HTMLCollection,它不是一个标准的J*aScript数组,因此不能直接使用forEach等数组方法。为了方便操作,我们通常会将其转换为一个数组。ES6的展开运算符(...)是实现这一转换的简洁方式。
const menuItems = [...document.getElementsByClassName('menu-item')];接下来,我们遍历这个menuItems数组,为每个菜单项添加一个mouseover事件监听器。mouseover事件会在鼠标指针移入元素时触发。
绿色简单后台模板
绿色简单后台模板,绿色风格,含登录页面及后台操作页面,界面简单,操作方便,且后台还是DIV+CSS实现,菜单的动态效果没完成,我想只要会一点点JS应该就可以做出来了。
127
查看详情
menuItems.forEach(item => item.addEventListener('mouseover', () => {
// 核心逻辑将在此处实现
}));在mouseover事件的处理函数中,我们将执行以下两步操作:
menuItems.forEach(item => item.addEventListener('mouseover', () => {
// 步骤1:清除所有菜单项的hover类
menuItems.forEach(menuItem => menuItem.classList.remove('hover'));
// 步骤2:为当前被悬停的菜单项添加hover类
item.classList.add('hover');
}));通过这种方式,每次鼠标移入新的菜单项时,都会先“重置”所有菜单项的状态,然后“激活”当前项的状态,从而确保了悬停状态的独占性。
将HTML、CSS和J*aScript代码整合在一起,即可实现上述效果。
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>J*aScript动态菜单悬停效果</title>
<style>
#menu {
background-color: #0066cc;
padding: 15px;
width: 100%;
}
.menu-item {
height: 25px;
width: fit-content;
color: white;
cursor: pointer;
font-family: sans-serif;
transition: margin-left .2s ease-in-out; /* 平滑过渡效果 */
white-space: nowrap; /* 防止文本换行 */
}
.menu-item.hover {
margin-left: 15px; /* 悬停时向右偏移 */
}
</style>
</head>
<body>
<div id="menu">
<div class="menu-item">Item 1</div>
<div class="menu-item">Item 2</div>
<div class="menu-item">Item 3</div>
<div class="menu-item">Item 4</div>
</div>
<script>
// 获取所有菜单项,并将其转换为数组
const menuItems = [...document.getElementsByClassName('menu-item')];
// 为每个菜单项添加mouseover事件监听器
menuItems.forEach(item => item.addEventListener('mouseover', () => {
// 遍历所有菜单项,移除它们的'hover'类
menuItems.forEach(menuItem => menuItem.classList.remove('hover'));
// 为当前被鼠标悬停的菜单项添加'hover'类
item.classList.add('hover');
}));
</script>
</body>
</html>通过上述纯J*aScript的实现,我们成功地为动态菜单创建了一个独占且持久的鼠标悬停效果。这种方法简洁、高效,并且不依赖任何外部库,非常适合需要轻量级解决方案的项目。核心思想是利用事件监听器,在每次交互时“重置”所有相关元素的状态,然后“激活”当前目标元素的状态,确保UI的一致性。
以上就是J*aScript实现动态菜单项的唯一悬停效果的详细内容,更多请关注其它相关文章!
# 的是
# 江门seo型网站怎么做
# 珠海seo推广推荐
# 文登建设网站费用
# 如何推广足球网站
# 常州营销推广报名费多少
# 惠东百度网站优化
# 大同seo公司解答火星
# 江西有多少免费推广网站
# 菏泽网站建设加盟公司
# 广元市建设局网站
# 运算符
# 会在
# 将在
# 转换为
# css
# 只有一个
# 移除
# 遍历
# 鼠标
# 菜单项
# css样式
# ssl
# seo
# html
# jquery
# java
# es6
# javascript
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
优化推广96088 】
【
技术知识133117 】
【
IDC资讯59369 】
【
网络运营7196 】
【
IT资讯61894 】
相关推荐:
自定义你的VS Code状态栏,监控关键信息
mysql怎么查询数据_mysql基础查询语句使用教程
作业帮网页版不用下载入口 在线问老师快速答疑
快递优选如何查优选物流_快递优选专属物流渠道查询与配送时效
php如何实现多域名共享session_php存储session到redis与跨域读取配置
Retrofit根路径POST请求:@POST("/") 的应用与解析
mysql导入sql文件能分批导入吗_mysql分批次导入大sql文件的实用技巧
抖音号升级成企业资质怎么弄?有什么好处?
WooCommerce 新客户订单自动添加管理员备注教程
windows server2019显卡驱动怎么安装_winserver2019显卡驱动安装与远程桌面优化
excel怎么制作考勤表 excel考勤模板与函数公式讲解
《洛克王国:世界》国家队搭配攻略
Sublime怎么自动添加CSS前缀_Sublime安装Autoprefixer插件
Python项目中的条件导入:解决跨模块依赖问题
谷歌邮箱怎么换绑定邮箱Gmail安全备份邮箱修改方法
悟空浏览器如何恢复关闭的标签页 悟空浏览器撤销关闭网页快捷键设置
《美篇》取消会员自动续费方法
三星A55应用闪退排查步骤_Samsung A55稳定性优化技巧
猫眼电影app如何筛选支持退改签的影院_猫眼电影退改签影院筛选方法
Golang如何使用gRPC拦截器实现日志收集_Golang gRPC拦截器日志收集实践
《波斯王子:失落的王冠》剑术大师打法攻略
《咸鱼之王》新版孙坚技能解析
《土豆雅思》修改密码方法
如何在CSS中使用absolute实现登录弹窗居中_transform translate结合
以下哪一个是适应长期护理制度发展而设立的新职业
C++ virtual析构函数作用_C++基类虚析构函数防止内存泄漏
优化2xN网格最大路径和的动态规划算法实践
sf漫画官网登录入口直达_sf漫画官方正版网址
使用VS Code作为你的个人知识管理系统
123平台官方登录入口 123邮箱网页端在线沟通工具
感染了幽门螺杆菌一定会导致胃癌吗?蚂蚁庄园今日答案最新11.30
126手机126邮箱登录_126邮箱手机登录入口官网
蜻蜓FM如何设置移动流量播放
汽水音乐车机版官网5.0 汽水音乐车机版5.0版本下载入口
rabbitmq 持久化有什么缺点?
LocoySpider如何批量采集电商商品_LocoySpider电商采集的模板应用
b站如何剪辑视频_b站必剪app使用教程
Excel如何设置动态下拉菜单_Excel表格下拉选项快速方法
《随手记》关闭首页消息推送方法
realme 10 Pro息屏方案_realme 10 Pro省电策略
win11关机几秒又自己开机 Win11关机自动重启问题修复
AngularJS动态内容中DOM元素查找的时序问题及$timeout解决方案
花生壳内网映射新方案
外卖小程序对接第三方配送
Flask 应用中图片动态更新与上传:实现客户端定时刷新与服务器端文件管理
六级准考证号怎么查_四六级准考证查询入口官网
163邮箱网页版官方登录入口 163邮箱网页版访问页面
sublime怎么快速在浏览器中预览HTML_sublime配置View in Browser教程
解决J*aScript动态图片上传中ID重复问题:在同一页面显示多张独立图片
poki官网最新入口 poki小游戏大全入口
2025-10-09
运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。