一、前言

在前端开发中,鼠标事件 是实现用户交互的重要手段之一。通过监听用户的点击、移动、悬停等操作,我们可以构建出丰富而灵活的网页交互体验。

本文将带你深入了解:

  • JavaScript 中常见的鼠标事件;
  • 各类鼠标事件的触发时机;
  • 如何获取鼠标位置信息;
  • 实际开发中的典型使用场景;
  • 推荐的最佳实践;

通过这篇文章,你将掌握如何利用鼠标事件来提升网页的交互性与用户体验。

二、常见的鼠标事件类型

事件类型触发条件是否冒泡
click鼠标左键单击(按下 + 松开)✅ 是
mousedown鼠标按键按下时触发✅ 是
mouseup鼠标按键松开时触发✅ 是
mousemove鼠标在元素上移动时持续触发✅ 是
mouseover鼠标移入元素或其子元素时触发✅ 是
mouseout鼠标移出元素或其子元素时触发✅ 是
mouseenter鼠标进入元素边界时触发(不冒泡)❌ 否
mouseleave鼠标离开元素边界时触发(不冒泡)❌ 否

📌 小贴士:

  • mouseenter 和 mouseleave 不会因子元素触发而频繁触发,适合用于 hover 效果;
  • mouseover 和 mouseout 会在子元素切换时多次触发,适用于更复杂的交互逻辑。

三、常用鼠标事件详解

1. click

当用户点击元素(通常为鼠标左键)时触发。

document.getElementById('btn').addEventListener('click', function () {alert('按钮被点击了')
})

📌 应用场景:

  • 按钮点击提交;
  • 切换状态;
  • 弹窗显示/隐藏;

2. mousedown 与 mouseup

这两个事件分别在鼠标按键按下和释放时触发,常用于拖拽、绘图等功能。

const box = document.getElementById('box')box.addEventListener('mousedown', () => {console.log('鼠标按下')
})box.addEventListener('mouseup', () => {console.log('鼠标释放')
})

📌 应用场景:

  • 自定义拖拽组件;
  • 拖动排序;
  • 按住按钮执行某个动作(如音量调节);

3. mousemove

当鼠标在元素内移动时持续触发,频率较高,注意性能优化。

document.getElementById('canvas').addEventListener('mousemove', function(event) {console.log(`鼠标坐标: ${event.clientX}, ${event.clientY}`)
})

📌 应用场景:

  • 绘图工具;
  • 鼠标跟随特效;
  • 实时反馈鼠标位置;

4. mouseover 与 mouseout

当鼠标进入或离开元素及其子元素时触发,适用于菜单展开收起、提示框展示等场景。

const menu = document.getElementById('menu')menu.addEventListener('mouseover', () => {console.log('鼠标进入菜单区域')
})menu.addEventListener('mouseout', () => {console.log('鼠标离开菜单区域')
})

📌 注意:

  • 子元素切换会导致反复触发;
  • 若希望只在父元素进出时触发,推荐使用 mouseenter / mouseleave

5. mouseenter 与 mouseleave

仅在鼠标进入或离开目标元素本身时触发,不会因为子元素的变化而重复触发。

const tooltip = document.getElementById('tooltip')tooltip.addEventListener('mouseenter', () => {console.log('鼠标进入提示框')
})tooltip.addEventListener('mouseleave', () => {console.log('鼠标离开提示框')
})

📌 推荐使用场景:

  • 工具提示(tooltip)展示与隐藏;
  • Hover 动画控制;
  • 图片放大镜效果;

四、获取鼠标位置信息

鼠标事件对象提供了多个属性用于获取鼠标的当前位置和偏移量:

属性描述
clientXclientY相对于浏览器视口的位置(不包括滚动条)
pageXpageY相对于整个页面的位置(包括滚动条)
offsetXoffsetY相对于事件目标元素的位置
screenXscreenY相对于屏幕的位置
document.addEventListener('mousemove', function (e) {console.log('client:', e.clientX, e.clientY)console.log('page:', e.pageX, e.pageY)console.log('screen:', e.screenX, e.screenY)
})

📌 使用建议:

  • 页面定位 → 使用 pageX/Y
  • 视口定位 → 使用 clientX/Y
  • 元素内部定位 → 使用 offsetX/Y

五、阻止默认行为与事件传播

有时我们希望阻止某些默认行为或停止事件继续传播:

✅ 阻止默认行为

document.querySelector('a').addEventListener('click', function (e) {e.preventDefault()console.log('链接被点击,但没有跳转')
})

✅ 阻止事件冒泡

document.getElementById('child').addEventListener('click', function (e) {e.stopPropagation()console.log('子元素被点击,父级不会收到事件')
})

六、实际开发中的常见应用场景

场景描述
表格行点击高亮点击某一行时应用背景色
拖拽功能结合 mousedownmousemovemouseup 实现拖放
菜单下拉展开使用 mouseenter / mouseleave 控制显示隐藏
图片预览缩略图鼠标悬停时显示大图
鼠标轨迹绘制在 canvas 上记录并绘制鼠标路径
鼠标右键菜单使用 contextmenu 事件自定义菜单
鼠标长按操作利用 mousedown + setTimeout 实现长按逻辑

七、最佳实践与注意事项

项目建议
多个事件绑定使用统一处理函数,避免重复代码
性能优化对高频事件(如 mousemove)进行节流或防抖处理
事件解绑组件卸载时及时移除监听器,防止内存泄漏
避免阻塞主线程避免在鼠标事件中执行耗时任务
移动端兼容注意触摸屏下的模拟鼠标事件行为差异
浏览器兼容性使用标准 API 并考虑 polyfill 支持旧版浏览器

八、总结对比表

事件类型是否冒泡适用场景
click点击交互
mousedown开始拖拽、长按检测
mouseup结束拖拽、确认操作
mousemove实时反馈、绘图
mouseover悬停响应(含子元素)
mouseout离开响应(含子元素)
mouseenter悬停响应(不含子元素)
mouseleave离开响应(不含子元素)

九、结语

感谢您的阅读!如果你有任何疑问或想要分享的经验,请在评论区留言交流!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/87113.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/87113.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/87113.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

windows录频软件

一.很反感有些做软件的,把别人开源的改个界面收费,所以我找了一个开源免费的。 二.准备工具 一台电脑, Captura:完全开源免费的录频软件。 ffmpeg:音频格式转换软件,这可是非常大名鼎鼎的工具。 三.安装Captura 网址…

python中的模块化编程:日期模块、math算术模块、random模块

内置模块(math、random、时间)自定义模块(自己写的部分代码)第三方模块(引入的第三方代码库的模块) math模块 import math#圆周率 print(math.pi) #自然常数 print(math.e) #圆周率的二倍 print(math.tau…

【学习笔记】Langchain基础(二)

前文:【学习笔记】Langchain基础 文章目录 8 [LangGraph] 实现 Building Effective Agents,各种 workflows 及 AgentAugmented LLMPrompt ChainingParallelizationRoutingOrchestrator-Worker (协调器-工作器)Evaluator-optimizer (Actor-Critic)Agent 8…

Java大模型开发入门 (9/15):连接外部世界(中) - 向量嵌入与向量数据库

前言 在上一篇文章中,我们成功地将一篇长文档加载并分割成了一系列小的文本片段(TextSegment)。我们现在有了一堆“知识碎片”,但面临一个新问题:计算机如何理解这些碎片的内容,并找出与用户问题最相关的片…

Windows下MySQL安装全流程图文教程及客户端使用指南(付整合安装包)

本教程是基于5.7版本安装,5.7和8.0的安装过程大差不差 安装包「windows上mysql中安装包资源」 链接:https://pan.quark.cn/s/de275899936d 一、安装前的准备 1.1 获取 MySQL 安装程序 官网 前往 MySQL 官方下载页面,下载适用于 Windows 系…

笔记 软件工程复习

第一章 软件工程学概述 1.1 软件危机(Software Crisis) 概念 定义:软件危机指在计算机软件开发与维护过程中遇到的一系列严重问题,源于1960年代软件复杂度激增与传统开发方法失效的矛盾。 本质:软件规模扩大 → 开…

GaussDB创建数据库存储

示例一: 下面是一个简单的GaussDB存储过程示例: –创建一个存储过程。 CREATE OR REPLACE PROCEDURE prc_add (param1 IN INTEGER,param2 IN OUT INTEGER ) AS BEGINparam2: param1 param2;dbe_output.print_line(result is: ||to_char(param…

基于51单片机的校园打铃及灯控制系统

目录 具体实现功能 设计介绍 资料内容 全部内容 资料获取 具体实现功能 具体功能: (1)实时显示当前时间(年月日时分秒星期),LED模式指示灯亮。 (2)按下“打铃”和“打铃-”按键…

PHP+mysql雪里开轻量级报修系统 V1.0Beta

# PHP雪里开轻量级报修系统 V1.0Beta ## 简介 这是一个基于PHP7和MySQL5.6的简易报修系统,适用于学校、企业等机构的设备报修管理。 系统支持学生提交报修、后勤处理报修以及系统管理员管理用户和报修记录。 初代版本V1.0,尚未实际业务验证,…

XCTF-misc-base64÷4

拿到一串字符串 666C61677B45333342374644384133423834314341393639394544444241323442363041417D转换为字符串得到flag

Mini DeepSeek-v3训练脚本学习

Mini DeepSeek-v3 训练脚本详细技术说明(脚本在文章最后) 📋 概述 这是一个实现了Mini DeepSeek-v3大语言模型的训练脚本,集成了多项先进的深度学习技术。该脚本支持自动GPU选择和分布式训练,适合在多GPU环境下训练Transformer模型。 &…

FPGA 的硬件结构

FPGA 的基本结构分为5 部分:可编程逻辑块(CLB)、输入/输出块(IOB)、逻辑块之间的布线资源、内嵌RAM 和内嵌的功能单元。 (1)可编程逻辑块(CLB) 一个基本的可编程逻辑块由…

算法专题八: 链表

1.两数相加 题目链接:2. 两数相加 - 力扣(LeetCode) /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* ListNode…

5G+边缘计算推动下的商品详情API低延迟高效率新方案

在电商行业,商品详情API的性能直接关系到用户体验与平台竞争力。传统云计算模式在处理高并发请求时,常面临网络延迟高、带宽成本大等问题。而5G与边缘计算的结合,为商品详情API的低延迟高效率提供了新方案。本文将深入探讨这一新方案&#xf…

【Python教程】CentOS系统下Miniconda3安装与Python项目后台运行全攻略

一、引言 为了在CentOS系统上高效地开发和运行Python项目,我们常常需要借助Miniconda3来管理Python环境。本文将详细介绍如何在CentOS系统上安装Miniconda3,并将Python项目部署到后台运行。 二、Miniconda3和CentOS系统介绍 Miniconda3介绍 Minicond…

【读点论文】A Survey on Open-Set Image Recognition

A Survey on Open-Set Image Recognition Abstract 开集图像识别(Open-set image recognition,OSR)旨在对测试集中已知类别的样本进行分类,并识别未知类别的样本,在许多实际应用中支持鲁棒的分类器,如自动驾驶、医疗诊断、安全监…

使用DuckDB查询DeepSeek历史对话

DeepSeek网页版在左下角个人信息/系统设置的账号管理页签中有个“导出所有历史对话”功能,点击“导出”,片刻就能生成一个deepseek_data-2025-06-14.zip的文件,里面有2个json文件,直接用文本编辑器查看不太方便。 而用DuckDB查询却…

多线程下 到底是事务内部开启锁 还是先加锁再开启事务?

前言 不知大家是否有观察到一个最常见的错误: 先开启事务,然后针对资源加锁,操作资源,然后释放锁,最后提交事务 你是否发现了在这样的场景下会出现并发安全的问题? (提示:一个线程A…

Javascript解耦,以及Javascript学习网站推荐

一、学习网站推荐 解构 - JavaScript | MDN 界面如下,既有知识点,也有在线编译器执行代码。初学者可以看看 二、Javascript什么是解构 解构语法是一种 Javascript 语法。可以将数组中的值或对象的属性取出,赋值给其他变量。它可以在接收数…

Java大模型开发入门 (11/15):让AI自主行动 - 初探LangChain4j中的智能体(Agents)

前言 在过去的十篇文章里,我们已经打造出了一个相当强大的AI应用。它有记忆,能进行多轮对话;它有知识,能通过RAG回答关于我们私有文档的问题。它就像一个博学的“学者”,你可以向它请教任何在其知识范围内的问题。 但…