0

0

CSS如何实现根据鼠标位置变化的背景过渡_通过JS动态更新css变量触发

P粉602998670

P粉602998670

发布时间:2026-03-11 11:47:32

|

818人浏览过

|

来源于php中文网

原创

核心是监听mousemove事件,用getboundingclientrect()获取容器宽高计算鼠标百分比位置,再通过style.setproperty()动态设置css变量,并在css中用合成变量或calc()配合radial-gradient实现平滑背景过渡。

css如何实现根据鼠标位置变化的背景过渡_通过js动态更新css变量触发

怎么用 JS 动态改 --mouse-x--mouse-y 变量

核心就一句话:监听 mousemove,把 event.clientX / event.clientY 转成相对容器的百分比值,再设到 style.setProperty()。别直接写死像素值,否则 CSS 里用 calc() 或渐变时会错位。

常见错误是直接用 window.innerWidth 做分母——如果背景只作用在某个 <div class="hero"> 上,就得用它的 <code>getBoundingClientRect() 宽高。

  • element.addEventListener('mousemove', e => { ... }),别用 document 全局监听(除非真要全屏响应)
  • 计算百分比时记得 Math.max(0, Math.min(100, ...)) 防止鼠标移出区域导致负值或超 100%
  • { passive: true } 提升滚动流畅度,但注意:如果后续要阻止默认行为(一般不需要),就不能设 passive

CSS 里怎么用这两个变量做背景过渡

变量本身不触发过渡,得靠 background 属性的可动画性。CSS 渐变(radial-gradientlinear-gradient)支持数值插值,所以把 --mouse-x 当作位置参数塞进去就行。

容易踩的坑是写成 background: radial-gradient(circle at var(--mouse-x) var(--mouse-y), ...) —— 这样无效,因为 at 后面不接受两个独立变量拼接。得用一个合成变量,或者用 calc() 拼字符串(但 calc 不支持变量拼接)。

立即学习前端免费学习笔记(深入)”;

  • 推荐方案:JS 里直接设置一个合成变量,比如 style.setProperty('--mouse-pos', `${x}% ${y}%`),CSS 里写 radial-gradient(circle at var(--mouse-pos), ...)
  • 如果要用双变量,CSS 得写成 radial-gradient(circle at calc(var(--mouse-x) * 1vw) calc(var(--mouse-y) * 1vh), ...),但单位要对齐,vw/vh% 更稳
  • transition: background 0.3s ease 必须写在同一个选择器里,且不能被 !important 或更高优先级规则覆盖

为什么鼠标一动就卡,过渡不顺

不是 JS 慢,是浏览器在每帧都重算渐变+重绘整个背景层。尤其当容器大、设备分辨率高时,GPU 负担明显。

Grammarly
Grammarly

Grammarly是一款在线语法纠正和校对工具,伟大的AI辅助写作工具

下载

性能关键点不在“设变量”,而在“怎么用变量”。用 radial-gradientlinear-gradient 更吃资源;用 rgba() 半透明色比纯色更耗;背景图叠加也会雪上加霜。

  • will-change: background 加到元素上,提前告诉浏览器这个属性会变(但别滥用,只加在真正需要的元素)
  • 过渡时间别低于 0.2s,太快反而让浏览器丢帧
  • 移动端慎用——触摸事件 touchmove 触发频率低,且坐标需从 touches[0] 取,clientX/Y 在某些安卓 WebView 里不准

兼容性要注意哪些硬伤

CSS 自定义属性(--xxx)IE 完全不支持,Edge 15+ 才行;radial-gradient 在旧 Safari 需要 -webkit- 前缀;transitionbackground 的支持,Safari 12.1 之前有 bug,可能跳变。

最现实的底线是:如果你的项目还要支持 IE 或老 iOS,这条路基本走不通,得降级为 canvas 绘制或固定几个热点位切换 class。

  • 检查是否启用了 prefers-reduced-motion,用户开了“减少动画”时,直接关掉 transition 或设为 0.01s
  • Firefox 对 background 中含 var() 的 transition 支持稍晚,100+ 版本才稳定
  • 不要依赖 background-position + transition 模拟——它只能平移,做不出以鼠标为中心的扩散效果

事情说清了就结束

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
edge是什么浏览器
edge是什么浏览器

Edge是一款由Microsoft开发的网页浏览器,是Windows 10操作系统中默认的浏览器,其目标是提供更快、更安全、更现代化的浏览器体验。本专题为大家提供edge浏览器相关的文章、下载、课程内容,供大家免费下载体验。

1723

2023.08.21

IE浏览器自动跳转EDGE如何恢复
IE浏览器自动跳转EDGE如何恢复

ie浏览器自动跳转edge的解决办法:1、更改默认浏览器设置;2、阻止edge浏览器的自动跳转;3、更改超链接的默认打开方式;4、禁用“快速网页查看器”;5、卸载edge浏览器;6、检查第三方插件或应用程序等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

397

2024.03.05

如何解决Edge打开但没有标题的问题
如何解决Edge打开但没有标题的问题

若 Microsoft Edge 浏览器打开后无标题(窗口空白或标题栏缺失),可尝试以下方法解决: 重启 Edge:关闭所有窗口,重新启动浏览器。 重置窗口布局:右击任务栏 Edge 图标 → 选择「最大化」或「还原」。 禁用扩展:进入 edge://extensions 临时关闭插件测试。 重置浏览器设置:前往 edge://settings/reset 恢复默认配置。 更新或重装 Edge:检查最新版本,或通过控制面板修复

1034

2025.04.24

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

760

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

221

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1565

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

649

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

1208

2024.03.22

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

22

2026.03.10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Sass 教程
Sass 教程

共14课时 | 0.9万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.5万人学习

CSS教程
CSS教程

共754课时 | 41.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号