JavaScript基礎-常用的鼠標事件

一、前言

在前端開發中,鼠標事件 是實現用戶交互的重要手段之一。通過監聽用戶的點擊、移動、懸停等操作,我們可以構建出豐富而靈活的網頁交互體驗。

本文將帶你深入了解:

  • 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 動畫控制;
  • 圖片放大鏡效果;

四、獲取鼠標位置信息

鼠標事件對象提供了多個屬性用于獲取鼠標的當前位置和偏移量:

屬性描述
clientX,?clientY相對于瀏覽器視口的位置(不包括滾動條)
pageX,?pageY相對于整個頁面的位置(包括滾動條)
offsetX,?offsetY相對于事件目標元素的位置
screenX,?screenY相對于屏幕的位置
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回答關于我們私有文檔的問題。它就像一個博學的“學者”,你可以向它請教任何在其知識范圍內的問題。 但…