練習小項目11:鼠標跟隨小圓點

🎯 項目目標:

當鼠標在頁面移動時,小圓點會跟隨鼠標移動的位置,帶有平滑動畫。

🧠 實現思路:

  1. HTML:

    • 頁面內放一個 div 作為圓點。

  2. CSS:

    • 圓點使用絕對定位,初始在屏幕角落。

    • 添加 transition,讓位置平滑過渡(非瞬移)。

    • 設置寬高、顏色(或圖片樣式)。

  3. JavaScript:

    • 監聽 mousemove 事件。

    • 在事件中獲取鼠標 clientX/clientY

    • 設置圓點的位置為鼠標位置附近。

?HTML 部分結構:

 <div class="dot"></div>

實踐代碼如下::

初版JS(一個圓點的效果) :

const dot = document.getElementsByClassName('dot')document.addEventListener('mousemove', (event) => {console.log(event.clientX);const x = event.clientXconst y = event.clientYdot[0].style.top = ${y - 12.5}pxdot[0].style.left = ${x -12.5}px
})

CSS:

.dot {position: absolute;top: 0;left: 0;transition: all .2s ease;width: 25px;height: 25px;border-radius: 50%;background: yellowgreen;
};

?進階:添加拖尾效果(多個小點形成“尾巴”)

JS(多個圓點形成一個小尾巴的效果):

const dots = document.querySelectorAll('.dot')
let positions = Array.from({ length: dots.length }, () => ({ x: 0, y: 0 }));document.addEventListener('mousemove', (event) => {const { clientX: x, clientY: y } = event// 把當前位置放在隊列前面positions.unshift({ x, y })positions.length = dots.length// 每個圓點移動到對應的位置dots.forEach((dot, i) => {dot.style.left = positions[i].x + 'px'dot.style.top = positions[i].y + 'px'dot.style.opacity = 1 - i * 0.1dot.style.transform = `scale(${1 - i * 0.05})`})
})

CSS:

.dot {position: absolute;top: 0;left: 0;width: 25px;height: 25px;border-radius: 50%;background: yellowgreen;pointer-events: none;transition: top 0.2s, left 0.2s;
}

頁面效果展示:

?額外知識記錄:?

??關于多個圓點形成小尾巴的實現思路

1. 每次鼠標移動時:記錄當前位置

  • positions.unshift({ x, y }) 把當前坐標放進數組開頭,代表“最新”的位置。

2. 遍歷每個圓點,讓它去“追趕”對應的歷史鼠標位置

  • 第一個圓點移動到最新的位置,

  • 第二個圓點移動到稍早前的位置,

  • 依此類推,制造出延遲感的拖尾效果。

??關于為什么要給圓點加pointer-events: none;

作用:讓這個元素不響應鼠標事件。?

你設置了 .dot 是鼠標指針跟隨的小圓點,如果不給它加 pointer-events: none,你鼠標碰到它時就會“碰撞”上它(即便你看不出來),這樣就會阻礙 mousemove 的監聽。

🔹1.為什么不加上 pointer-events: none會阻礙 mousemove 的監聽?

鼠標一旦停在 .dot 元素上:

  • 瀏覽器會把 mousemove 事件發送給 .dot 元素本身
  • 如果你并沒有給 .dot 元素綁定 mousemove,事件就“斷了”,
  • document 上的回調不再觸發,拖尾停止更新,看起來就像“卡住”。

總結

雖然你現在的代碼運行良好,肉眼可能看不出有什么卡頓,但養成加上 pointer-events: none 的習慣是更穩妥的。

??關于const positions = Array.from({ length: dots.length }, () => ({ x: 0, y: 0 }))

🔹1. dots.length 是多少?

dots 是多個拖尾小圓點的 DOM 元素集合,例如:

const dots = document.querySelectorAll('.dot');

所以 dots.length 表示你想要多少個“尾巴”。


🔹2. Array.from({ length: dots.length }, ...) 是什么?

這是 Array.from 的一個常見用法,語法是:

Array.from({ length: N }, (value, index) => ...)

意思是:創建一個長度為 N 的數組,并用后面的函數生成每一項。


🔹3. 為什么要寫成 { length: dots.length }

因為 Array.from 的第一個參數可以是一個“類數組對象”(只要有 .length 屬性就行),比如:

Array.from({ length: 3 }) → [undefined, undefined, undefined]

🔹4. 回調函數 () => ({ x: 0, y: 0 }) 是干嘛的?

這個函數的作用是:為數組中的每一項都返回一個初始坐標對象 { x: 0, y: 0 }

也就是說:

Array.from({ length: 3 }, () => ({ x: 0, y: 0 }));
// 結果是:
[{ x: 0, y: 0 },{ x: 0, y: 0 },{ x: 0, y: 0 }
]

🔹5. 為什么這么寫有必要?

這個 positions 數組的作用是:

記錄每一個尾巴圓點當前的位置。后續我們會用它來移動 .dot 的位置,實現拖尾軌跡。如果你有 10 個小圓點,就需要一個 10 項的數組,每一項都記錄這個圓點的位置。


?總結

這行代碼的含義就是:

“為每個 .dot 小圓點初始化一個位置對象 { x: 0, y: 0 },構成一個統一的 positions 數組,用于后續跟隨鼠標拖尾。”

???關于dot.style.opacity = 1 - i * 0.1;dot.style.transform = `scale(${1 - i * 0.05})`

這是給拖尾點添加視覺漸變縮放的效果:

  • opacity = 1 - i * 0.1

    • 第 0 個點透明度是 1(完全不透明)

    • 第 1 個點是 0.9

    • 第 2 個點是 0.8...

    • 后面的點越來越透明

  • scale = 1 - i * 0.05

    • 第 0 個點大小是 1(原始大小)

    • 第 1 個點是 0.95

    • 第 2 個點是 0.90...

    • 后面的點越來越小

?總結

就是:“實現前面圓點大且亮,后面越來越小、越來越淡的尾巴效果。”

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/86929.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/86929.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/86929.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

華為:eSight網管平臺使用snmp納管交換機

一、SNMP簡介 SNMP&#xff08;Simple Network Management Protocol&#xff0c;簡單網絡管理協議&#xff09;是一種用于管理和監控網絡設備的標準協議&#xff0c;廣泛應用于路由器、交換機、服務器、打印機等網絡設備的管理場景。以下是對它的簡單介紹&#xff1a; 1、SNM…

【單片機期末】接口及應用

一、C51語言基礎 【考點】存儲類型 data是低128字節 code是ROM idata是高128字節 pdata是外部RAM可以用R0 R1尋址的&#xff0c;也叫頁 xdata是外部RAM&#xff0c;可以用DPTR尋址或總線擴展 其中data、code、idata、pdata、xdata均為字節類型的&#xff0c;bdata是對位尋址的 …

C#迭代器

文檔 C# Iterators 關鍵內容 普通接口 public interface IEnumerable {IEnumerator GetEnumerator(); }public interface IEnumerator {object Current { get; }bool MoveNext();void Reset(); }泛型接口 public interface IEnumerable<out T> : IEnumerable {IEnum…

Java多線程:為什么wait()必須用循環而非if?

在Java多線程編程中&#xff0c;調用wait()方法時應使用**循環結構&#xff08;while循環&#xff09;**而非if塊&#xff0c;這是由線程同步的特性和潛在風險決定的。以下是具體原因和實現規范&#xff1a; 一、正確調用方式 synchronized (lockObject) {while (!condition) …

Fiori 初學記錄----怎么調用后端系統odata 服務實現簡單的CURD

1.對上面的內表做一個簡單的增刪改查的操作 SEGW 創建odata 項目&#xff0c;實現增刪改查方法。如下圖 2.odata 準備完畢后&#xff0c;打開vscode 下一步等待項目生成 把下面這個目錄的視圖&#xff1a;替換一下&#xff1a; View1.view.xml 代碼&#xff1a; <…

OpenCV CUDA模塊圖像變形------對圖像進行GPU加速的仿射變換函數warpAffine()

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 該函數用于對圖像進行 GPU 加速的仿射變換&#xff08;Affine Transformation&#xff09;&#xff0c;是 cv::warpAffine 的 CUDA 版本。支持平…

語音增強方法

一、音量增強 音量增強&#xff0c;顧名思義就是音量的調大和調小&#xff0c;通過對音量進行增強可以使得模型更好的泛化。防止數據只有小音量時&#xff0c;當有大音量傳入時模型不能很好的進行識別。 下面是我對音量增強生成頻譜圖進行可視化的結果 上面的一個圖片是音量…

內網滲透測試技巧與利用操作手冊(SMB / MSSQL / LDAP)

SMB 枚舉與利用清單 &#x1f50d; SMB 枚舉與連接 # 嘗試空會話連接&#xff08;Null Session&#xff09; smbclient -N -U "" -L \\<IP> smbclient -N -U "test" -L \\<IP> smbclient -N -U "Guest" -L \\<IP># 下載共享…

ADB(Android Debug Bridge)Android官方調試工具及常用命令

ADB的定義 ADB&#xff08;Android Debug Bridge&#xff09;是Android官方提供的調試工具&#xff0c;屬于Android SDK的一部分。它通過命令行與Android設備通信&#xff0c;支持安裝應用、調試、文件傳輸、日志抓取等功能&#xff0c;適用于開發、測試及高級用戶場景。 ADB工…

再現重大BUG,微軟緊急撤回Win 11六月更新

BUG年年有&#xff0c;今年特別多&#xff01; Windows 11發布這近4年來&#xff0c;咱們算是一路見證了其「要么在修復BUG&#xff0c;要么在修復BUG路上」這么一件壯舉。 最新的6月Windows 11 24H2更新&#xff08;版本號KB5060842&#xff09;&#xff0c;微軟帶來了多項改…

ROS2 工作空間中, CMakeLists.txt, setup.py和 package.xml的作用分別是?

提問 ROS2 工作空間中, CMakeLists.txt&#xff0c; setup.py和 package.xml的作用分別是&#xff1f; 回答 在一個 ROS 2 包&#xff08;package&#xff09;里&#xff0c;這三個文件各司其職&#xff1a; package.xml 作用&#xff1a;聲明包的元信息和依賴關系&#xff…

Untiy打包安卓踩坑

Untiy 版本&#xff1a;unity6.1 運行環境&#xff1a;Win11 報錯一&#xff1a; Assembly ‘Assets/ExternalDependencyManager/Editor/1.2.183/Google.IOSResolver.dll’ will not be loaded due to errors: 解決方法&#xff1a;通過在 Unity Hub 中下載 iOS 包來解決 報錯…

2025最新版!Windows Python3 超詳細安裝圖文教程(支持 Python3 全版本)

大家好&#xff0c;我是你們的編程搬磚工~ 今天給大家安排一篇超級詳細、超接地氣、純小白友好的《Python 安裝教程 for Windows》&#xff0c;從下載到安裝&#xff0c;從環境變量到驗證&#xff0c;手把手帶你裝好 Python&#xff0c;不管你是 Python3.7、3.9、3.10 還是 3.1…

【IEEE/EI/Scopus檢索】2025年第五屆機器學習與大數據管理國際會議 (MLBDM 2025)

2025年第五屆機器學習與大數據管理國際會議 (MLBDM 2025) 2025 5th International Conference on Machine Learning and Big Data Management(MLBDM 2025)會議地點&#xff1a;南京&#xff0c;中國 時間&#xff1a;2025年12月26日- 28日 ● 會議簡介 2025年第五屆機器學習…

前端實現ios26最新液態玻璃效果!

先看效果圖 實現步驟 先定義玻璃元素和液態濾鏡 <!--玻璃容器--> <div class"glass-container"><!--使用液態濾鏡--><div class"glass-filter"></div><!--邊沿效果--><div class"glass-specular">…

麒麟系統集成開發環境Kylin-IDE初體驗,菜鳥小白入門教程

一、安裝Kylin-IDE 1、打開應用商店&#xff0c;轉到“軟件”->“開發”頁面&#xff0c;找到“Kylin-IDE”&#xff0c;點下載。&#xff08;也可以在搜索欄搜索Kylin-IDE&#xff09; 2、等待Kylin-IDE下載并自動安裝完成。 3、雙擊桌面的Kylin-IDE圖標。 4、自動彈出“開…

Python爬蟲實戰:研究Bleach庫相關技術

一、引言 1.1 研究背景與意義 隨著互聯網的快速發展,網絡上的數據量呈爆炸式增長。網絡爬蟲作為一種自動獲取網頁內容的技術,能夠高效地從互聯網上收集所需信息,為數據分析、信息檢索、輿情監測等應用提供基礎。然而,爬取到的網頁內容往往包含大量的 HTML 標簽、JavaScri…

分布假設學習筆記

文章目錄 分布假設學習筆記自然語言處理中的分布假設應用場景適用范圍 Word2vec、BERT和GPTWord2vecBERTGPT 假設成立嗎 分布假設學習筆記 自然語言處理中的分布假設 分布假設&#xff08;Distributional Hypothesis&#xff09;是指&#xff1a;詞語在相似上下文中出現&…

提升開發思維的設計模式(上)

1. 設計模式簡介 [設計模式]&#xff08;Design pattern&#xff09; 是解決軟件開發某些特定問題而提出的一些解決方案也可以理解成解決問題的一些思路。通過設計模式可以幫助我們增強代碼的[可重用性]、可擴充性、 可維護性、靈活性好。我們使用設計模式最終的目的是實現代碼…

LINUX613計劃測put

FTP put ┌────────────────────────────────────────────────────────────────────┐│ ? MobaXterm 20.0 ? ││ (SSH client, X-serv…