為了結合后端而學習前端的學習日志——【黑洞光標特效】

在這里插入圖片描述

在這里插入圖片描述


今天給大家帶來一個超酷的前端特效——黑洞光標!讓你的鼠標變成一個會吞噬光粒子的迷你黑洞,點擊時還會噴射出綠色能量粒子!🌠


🚀 效果預覽

想象一下:你的鼠標變成一個旋轉的黑洞,周圍環繞著綠色的吸積盤,當你在頁面上移動時,它就像宇宙中的神秘天體一樣吸引著周圍的光粒子… 點擊屏幕時,還會像超新星爆發一樣噴射出能量粒子!?

在這里插入圖片描述


🌟 特效亮點

  1. 旋轉的吸積盤 💫
    黑洞周圍有發光的綠色吸積盤,不停旋轉模擬真實黑洞效果

  2. 懸停放大效果 🔍
    當鼠標懸停在元素上時,黑洞會微微膨脹,仿佛在"吞噬"那個元素

  3. 點擊粒子爆發 ?
    點擊屏幕時會噴射出10個綠色光粒子,像能量爆發一樣

  4. 流暢的動畫 🎬
    所有效果都使用CSS動畫和requestAnimationFrame實現,60fps絲滑流暢


🛠? 技術實現

1. 黑洞本體設計

.black-hole-cursor {background: radial-gradient(circle at center,#000 0%,#000 60%,#227030 80%,#32a144 100%);box-shadow: 0 0 15px rgba(50, 161, 68, 0.5),inset 0 0 10px rgba(50, 161, 68, 0.1);
}

使用徑向漸變創造黑洞的層次感,從純黑到主題綠色漸變🌿

2. 吸積盤動畫

@keyframes rotate {0% { transform: rotate(0deg); }100% { transform: rotate(360deg); }
}

簡單的旋轉動畫,讓黑洞看起來更真實🌀

3. 粒子噴射系統

document.addEventListener('click', function(e) {// 創建5個光粒子for (let i = 0; i < 5; i++) {const photon = document.createElement('div');// 設置粒子初始位置和樣式...document.body.appendChild(photon);// 粒子動畫邏輯const animate = () => {// 更新粒子位置和透明度...requestAnimationFrame(animate);};animate();}
});

點擊時動態創建粒子元素,并使用requestAnimationFrame實現流暢動畫?


🎨 設計思路

  1. 顏色選擇 🟢
    使用#32a144作為主色調,從深綠到淺綠的漸變模擬能量衰減

  2. 物理模擬 🌍

    • 黑洞懸停時放大模擬引力增強
    • 粒子噴射后逐漸消失模擬能量耗散
  3. 性能優化 ?

    • 使用transform和opacity實現高性能動畫
    • 粒子消失后及時移除DOM節點

🚀 完整源碼

<!DOCTYPE html>
<html lang="zh-CN"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>黑洞光標效果</title><style>body {margin: 0;padding: 0;box-sizing: border-box;height: 100vh;background-color: #000;cursor: none;overflow-x: hidden;}/* 黑洞光標 */.black-hole-cursor {position: fixed;width: 20px;height: 20px;border-radius: 50%;background: radial-gradient(circle at center,#000 0%,#000 60%,#227030 80%,#32a144 100%);pointer-events: none;transform: translate(-50%, -50%);z-index: 9999;transition:width 0.3s ease,height 0.3s ease;box-shadow:0 0 15px rgba(50, 161, 68, 0.5),inset 0 0 10px rgba(50, 161, 68, 0.1);}/* 黑洞吸積盤 */.accretion-disk {position: absolute;width: 100%;height: 100%;border-radius: 50%;border: 2px solid transparent;border-top-color: #32a144;border-right-color: #46c75b;border-bottom-color: #288036;border-left-color: #56e36c;animation: rotate 3s linear infinite;opacity: 0.8;}@keyframes rotate {0% {transform: rotate(0deg);}100% {transform: rotate(360deg);}}/* 不同狀態的黑洞樣式 */.black-hole-hover {width: 30px;height: 30px;box-shadow:0 0 25px rgba(50, 161, 68, 0.8),inset 0 0 15px rgba(50, 161, 68, 0.2);}.black-hole-active {width: 25px;height: 25px;box-shadow:0 0 20px rgba(50, 161, 68, 0.8),inset 0 0 10px rgba(50, 161, 68, 0.3);}/* 光粒子 */.light-particle {position: fixed;width: 4px;height: 4px;border-radius: 50%;background-color: #32a144;pointer-events: none;z-index: 9998;opacity: 1;transform: translate(-50%, -50%);transition: all 0.5s ease-out;}</style>
</head><body><!-- 黑洞光標 --><div class="black-hole-cursor" id="cursor"><div class="accretion-disk"></div></div><script>document.addEventListener('DOMContentLoaded', function () {const cursor = document.getElementById('cursor');let mouseX = window.innerWidth / 2;let mouseY = window.innerHeight / 2;// 鼠標移動時更新黑洞位置document.addEventListener('mousemove', function (e) {mouseX = e.clientX;mouseY = e.clientY;cursor.style.left = `${mouseX}px`;cursor.style.top = `${mouseY}px`;});const hoverables = document.querySelectorAll('*');// 為可交互元素添加事件hoverables.forEach(item => {item.addEventListener('mouseenter', function () {cursor.classList.add('black-hole-hover');});item.addEventListener('mouseleave', function () {cursor.classList.remove('black-hole-hover');});item.addEventListener('mousedown', function () {cursor.classList.add('black-hole-active');});item.addEventListener('mouseup', function () {cursor.classList.remove('black-hole-active');});});// 鼠標點擊事件,創建少量光子document.addEventListener('click', function (e) {const clickX = e.clientX;const clickY = e.clientY;const photonCount = 10; // 點擊出現的光子數量for (let i = 0; i < photonCount; i++) {const photon = document.createElement('div');photon.classList.add('light-particle');photon.style.left = `${clickX}px`;photon.style.top = `${clickY}px`;document.body.appendChild(photon);const angle = Math.random() * Math.PI * 2;const speed = 2 + Math.random() * 3;let x = clickX;let y = clickY;let opacity = 1;const animate = () => {x += Math.cos(angle) * speed;y += Math.sin(angle) * speed;opacity -= 0.02;photon.style.left = `${x}px`;photon.style.top = `${y}px`;photon.style.opacity = opacity;if (opacity > 0) {requestAnimationFrame(animate);} else {photon.remove();}};animate();}});});</script>
</body></html>

💡 創意擴展

想讓這個特效更酷?試試這些idea:

  1. 增加音效 🔊
    點擊時添加"嗖嗖"的粒子音效

  2. 粒子追蹤 🎯
    讓光粒子不是直線飛出,而是螺旋飛向黑洞

  3. 重力影響 🌌
    讓頁面上的元素微微向光標方向傾斜,模擬引力效果

  4. 星空背景 🌠
    添加閃爍的星星作為背景,增強宇宙感


🌈 結語

這個黑洞光標特效非常適合用于:

  • 科幻主題網站 🚀
  • 個人博客 🎮
  • 創意作品集 🎨

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

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

相關文章

[硬件電路-11]:模擬電路常見元器件 - 什么是阻抗、什么是輸入阻抗、什么是輸出阻抗?阻抗、輸入阻抗與輸出阻抗的全面解析

1. 阻抗&#xff08;Impedance&#xff09; 定義&#xff1a;阻抗是電路或元件對交流信號&#xff08;AC&#xff09;流動的阻礙能力&#xff0c;用符號Z表示&#xff0c;單位為歐姆&#xff08;Ω&#xff09;。它綜合了電阻&#xff08;R&#xff09;、電感&#xff08;L&am…

機器學習和深度學習的對比

深度 數據經過深層網絡后&#xff0c;語義信息表征能力強&#xff0c;對幾何細節信息表征能力弱。 數據依賴性 深度學習算法需要大量的數據來訓練&#xff0c;而傳統的機器學習使用制定的規則。所以&#xff0c;當數據量少時&#xff0c;深度學習的性能差于機器學習&#xf…

Kubernetes 安裝 minikube

安裝 minikube 在 Ubuntu 上安裝 minikube minikube 是一個工具&#xff0c;它可以在本地快速運行一個單節點的 Kubernetes 集群。它主要用于&#xff1a;本地學習 Kubernetes、測試和開發 Kubernetes 應用程序、快速嘗試 Kubernetes 的功能。 系統配置最低要求如下 CPU&#…

【學習筆記】深度學習:典型應用

作者選擇了由 Ian Goodfellow、Yoshua Bengio 和 Aaron Courville 三位大佬撰寫的《Deep Learning》(人工智能領域的經典教程&#xff0c;深度學習領域研究生必讀教材),開始深度學習領域學習&#xff0c;深入全面的理解深度學習的理論知識。 之前的文章參考下面的鏈接&#xf…

ComputeShader繪制全屏純色紋理

參考 Getting Started With Compute Shaders In Unity 環境 Win10 Unity20194.40 全屏純色紋理示例 使用ComputerShader逐個像素設置顏色 ComputeShader腳本 設置紋理顏色 #pragma kernel CSMainRWTexture2D<float4> Result;//紋理 half4 solidColor;//顏色[numth…

數學實驗(Matlab語言環境和線性代數實驗)

一、Matlab語言環境和線性代數實驗 1.Matlab語言環境 Matlab簡介 Matlab&#xff1a;Matrix Laboratry 矩陣實驗室 Matlab 提供了強大的科學計算、靈活的程序設計流程、高質量的圖形可視化與界面設計等功能&#xff0c;被廣泛應用于科學計算、控制系統、信息處理等領域的分…

Android面試總結之GC算法篇

一、GC 機制核心原理與算法 面試題 1&#xff1a;Android 中為什么采用分代回收&#xff1f;分代策略如何優化 GC 效率&#xff1f; 標準答案&#xff1a; 分代回收基于對象生命周期的差異&#xff0c;將堆分為年輕代&#xff08;Young Gen&#xff09;和老年代&#xff08;Ol…

仿騰訊會議——注冊登錄UI

1、加載素材 2、新添加資源類 3、加載圖片 4、添加左側圖片 在左側添加一個標簽 選擇圖片 選擇圖片 勾選保證圖片不變形 5、修改組件名稱 6、設置密碼輸入框 5、切換 6、編輯提示框 7、定義提交和清空的槽函數 8、設置頁面標題和最先顯示頁面 9、清空登錄信息函數實現 10、清空…

Kotlin 常見問題

以下從基礎、中級、高級三個難度等級為你提供 Kotlin 面試題及參考答案&#xff1a; 基礎難度 1. Kotlin 中 val 和 var 的區別是什么&#xff1f; 答案要點&#xff1a;val 用于聲明不可變變量&#xff0c;類似于 Java 中的 final 變量&#xff0c;一旦賦值后就不能再重新賦…

高頻數據沖擊數據庫的技術解析與應對方案

目錄 前言一、問題現象與影響分析1.1 典型場景表現1.2 核心問題分類 二、失效根源深度剖析2.1 架構設計缺陷2.2 緩存策略缺陷 三、解決方案與最佳實踐3.1 緩存架構設計3.1.1 分層緩存架構3.1.2 熱點數據識別 3.2 緩存策略優化3.2.1 動態過期時間算法3.2.2 緩存更新策略對比 3.3…

[Spring] Sentinel詳解

&#x1f338;個人主頁:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;?熱門專欄: &#x1f9ca; Java基本語法(97平均質量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection與…

清除浮動的重要性及解決辦法

由于父級盒子很多情況下&#xff0c;不方便給高度&#xff0c;但是子盒子浮動又不占有位置&#xff0c;最后父級盒子高度為0時&#xff0c;就會影響下面的標準流盒子。 一、為什么要清除浮動 父元素高度塌陷&#xff1a; 如果父元素內部的所有子元素都浮動了&#xff0c;并且沒…

域名與官網的迷思:數字身份認證的全球困境與實踐解方-優雅草卓伊凡

域名與官網的迷思&#xff1a;數字身份認證的全球困境與實踐解方-優雅草卓伊凡 一、官網概念的法律與技術界定 1.1 官網的實質定義 當卓伊凡被問及”公司域名就是官網嗎”這一問題時&#xff0c;他首先指出&#xff1a;”這相當于問’印著某公司logo的建筑就是該公司總部嗎’…

kotlin flatMap 變換函數的特點和使用場景

Kotlin 中的 flatMap 是一個非常常用的函數&#xff0c;尤其在處理集合&#xff08;如 List、Set 等&#xff09;時。它結合了 map 和 flatten 的功能&#xff0c;常用于將多個集合扁平化為一個單一的集合。 一、flatMap 函數的特點 轉換 扁平化&#xff1a; 對集合中的每個元…

java學習之數據結構:二、鏈表

本節介紹鏈表 目錄 1.什么是鏈表 1.1鏈表定義 1.2鏈表分類 2.鏈表實現 2.1創建鏈表 1&#xff09;手動創建 2&#xff09;創建鏈表類進行管理鏈表的相關操作 2.2添加元素 1&#xff09;頭插法 2&#xff09;尾插法 3&#xff09;任意位置插入 2.3刪除 2.4查找 1&…

【計算機網絡-應用層】解析HTTP會話保持:Cookie與Session的原理與實踐

&#x1f4da; 博主的專欄 &#x1f427; Linux | &#x1f5a5;? C | &#x1f4ca; 數據結構 | &#x1f4a1;C 算法 | &#x1f152; C 語言 | &#x1f310; 計算機網絡 上篇文章&#xff1a;實現HTTP服務器 下篇文章&#xff1a;傳輸層協議-UDP 文章摘要&…

[ Qt ] | 第一個Qt程序

1. 創建Qt項目 我們打開Qt Create工具&#xff0c;左上角“文件”&#xff0c;新建文件。 --- --- --- --- 這個是我們的APP“走出國門”的時候&#xff0c;要關注的&#xff0c;這里就不說了。 后面這兩個直接默認&#xff0c;下一步就行~~。 2. 項目默認內容 下面就是Qt C…

影刀RPA中新增自己的自定義指令

入門到實戰明細 1. 影刀RPA自定義指令概述 1.1 定義與作用 影刀RPA的自定義指令是一種強大的功能&#xff0c;旨在提高流程復用率&#xff0c;讓用戶能夠個性化定制指令&#xff0c;實現流程在不同應用之間的相互調用。通過自定義指令&#xff0c;用戶可以將常用的、具有獨立…

LangChain:重構大語言模型應用開發的范式革命

2022年10月22日,Harrison Chase在GitHub上提交了名為LangChain的開源項目的第一個代碼版本。這個看似普通的代碼提交,卻悄然開啟了一場重塑大語言模型(LLM)應用開發范式的技術革命。彼時,距離ChatGPT引爆全球人工智能浪潮尚有一月之遙,但LangChain的誕生已經預示了LLM技術…

區塊鏈+醫療:破解數據共享困局,筑牢隱私安全防線

在醫療健康領域&#xff0c;數據共享與隱私保護一直是一對難以調和的矛盾。一方面&#xff0c;分散在不同機構的醫療數據&#xff08;如電子病歷、檢查報告、用藥記錄&#xff09;阻礙了診療效率和科研進展&#xff1b;另一方面&#xff0c;患者隱私泄露事件頻發&#xff0c;加…