为了结合后端而学习前端的学习日志——【黑洞光标特效】

在这里插入图片描述

在这里插入图片描述


今天给大家带来一个超酷的前端特效——黑洞光标!让你的鼠标变成一个会吞噬光粒子的迷你黑洞,点击时还会喷射出绿色能量粒子!🌠


🚀 效果预览

想象一下:你的鼠标变成一个旋转的黑洞,周围环绕着绿色的吸积盘,当你在页面上移动时,它就像宇宙中的神秘天体一样吸引着周围的光粒子… 点击屏幕时,还会像超新星爆发一样喷射出能量粒子!✨

在这里插入图片描述


🌟 特效亮点

  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.mzph.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;加…