将鼠标事件驱动的视差文本动画改造为自动播放效果

将鼠标事件驱动的视差文本动画改造为自动播放效果

本教程详细介绍了如何将一个基于鼠标移动事件触发的视差文本动画转换为自动播放效果。通过利用javascript的requestanimationframe api,我们实现了在指定时间(例如10秒)内,文本元素自动进行水平滚动和视差位移,从而摆脱了对用户交互的依赖,创建出流畅且无需干预的动态视觉体验。

原始动画机制解析

在深入实现自动播放之前,我们首先理解原始的鼠标事件驱动视差动画是如何工作的。该动画通过JavaScript监听mousemove事件,动态更新一个CSS自定义属性–x,进而影响文本元素的text-shadow和transform属性,从而创建出视差效果。

HTML 结构:

HTML结构包含一个section作为容器,内部的div.text包含多个h2元素。每个h2元素通过内联样式定义了一个CSS自定义属性–i,这个变量在后续的CSS计算中用于控制视差效果的强度。

CSS 样式:

@import url('https://fonts.googleapis.com/css2?family=Poppins:wght@900&display=swap');* {  margin: 0;  padding: 0;  box-sizing: border-box;  font-family: "poppins";  font-weight: 900;}section {  position: relative;  width: 100vw;  height: 100vh;  overflow: hidden;  background: #111;}.text {  position: relative;  transform: skewY(350deg) translateY(-200px);  animation: animatecolor 5s linear infinite; /* 背景色调动画 */}@keyframes animatecolor {  0% { filter: hue-rotate(0deg); }  100% { filter: hue-rotate(360deg); }}.text h2 {  position: relative;  width: 100%;  font-size: 8em;  color: #fff;  pointer-events: none;  line-height: 1em;  white-space: nowrap;  /* 关键:使用 --x 和 --i 控制文本阴影和位移 */  text-shadow: calc(var(--x)) 100px 0 rgba(255, 255, 255, 0.1);  transform: translateX(calc(0% - var(--x) * var(--i)));}.text h2 span {  color: #0f0;  margin: 0 10px;}.text h2 span:nth-child(even) {  color: transparent;  -webkit-text-stroke: 2px #fff;}

CSS代码中,.text h2元素的text-shadow和transform: translateX属性是实现视差效果的关键。它们都依赖于–x变量,并通过calc()函数结合–i变量计算出不同的位移量,从而使不同行文本产生不同的滚动速度,形成视差感。

原始 JavaScript 逻辑:

const position = document.documentElement;position.addEventListener("mousemove", (e) => {  position.style.setProperty("--x", e.clientX + "px");});

这段JavaScript代码监听了整个文档的mousemove事件。每当鼠标移动时,它会获取鼠标的X坐标(e.clientX),并将其值设置为根元素(document.documentElement)上的CSS自定义属性–x。这样,–x的值会实时跟随鼠标的水平移动而变化,驱动CSS动画。

转换为自动播放动画

要将这种鼠标事件驱动的动画转换为自动播放,我们需要用一个程序化的方式来模拟–x变量的连续变化,而不是依赖鼠标输入。requestAnimationFrame API是实现平滑、高效动画的最佳选择。

requestAnimationFrame 简介

requestAnimationFrame是浏览器提供的一个API,它会告诉浏览器你希望执行一个动画,并请求浏览器在下一次重绘之前调用指定的更新函数。相比于setTimeout或setInterval,它的优势在于:

性能优化: 浏览器会在最佳时机(通常是显示器刷新率)调用回调函数,确保动画流畅且不会过度消耗CPU。节能: 当页面不在活动标签页时,动画会自动暂停,节省电量。同步: 确保动画与其他浏览器渲染操作同步,避免画面撕裂。

重构 JavaScript 代码

我们将修改JavaScript部分,使用requestAnimationFrame来自动更新–x变量,并设置一个动画持续时间。

const position = document.documentElement; // 获取根元素,用于设置CSS变量let startTime = Date.now(); // 记录动画开始时间let xValue = 0;             // 用于累加的 x 坐标值const animateScroll = () => {  // 检查动画是否已持续 10 秒(10000 毫秒)  if (Date.now() - startTime > 10000) {    return; // 动画结束,停止递归调用  }  // 更新 --x CSS变量,每次增加 1px  // xValue++ 会使文本向右滚动,如果需要向左滚动,可以使用 xValue--  position.style.setProperty("--x", (xValue++) + "px");  // 请求浏览器在下一次重绘前再次调用 animateScroll 函数  requestAnimationFrame(animateScroll);};// 启动动画animateScroll();

代码解释:

startTime = Date.now();: 记录动画开始的精确时间戳。xValue = 0;: 初始化一个变量xValue,它将作为自动滚动的X坐标值。animateScroll() 函数:if (Date.now() – startTime > 10000): 这是动画持续时间的控制逻辑。当当前时间与startTime之差超过10000毫秒(即10秒)时,函数返回,停止requestAnimationFrame的递归调用,动画自然结束。position.style.setProperty(“–x”, (xValue++) + “px”);: 这是核心动画逻辑。每次animateScroll被调用时,xValue会递增,并将当前值设置为CSS变量–x。xValue++实现的是向右滚动的效果;如果需要向左滚动,可以改为xValue–。requestAnimationFrame(animateScroll);: 关键步骤。它告诉浏览器在下一次屏幕刷新时再次调用animateScroll函数,从而形成一个连续的动画循环。animateScroll();: 在脚本加载后立即调用一次animateScroll,启动整个动画过程。

完整的代码示例

为了方便测试和理解,以下是完整的HTML、CSS和修改后的JavaScript代码:

HTML (不变)

CSS (不变)

@import url('https://fonts.googleapis.com/css2?family=Poppins:wght@900&display=swap');* {  margin: 0;  padding: 0;  box-sizing: border-box;  font-family: "poppins";  font-weight: 900;}a {  text-decoration: none;}section {  position: relative;  width: 100vw;  height: 100vh;  overflow: hidden;  background: #111;}.text {  position: relative;  transform: skewY(350deg) translateY(-200px);  animation: animatecolor 5s linear infinite;}@keyframes animatecolor {  0% {    filter: hue-rotate(0deg);  }  100% {    filter: hue-rotate(360deg);  }}.text h2 {  position: relative;  width: 100%;  font-size: 8em;  color: #fff;  pointer-events: none;  line-height: 1em;  white-space: nowrap;  text-shadow: calc(var(--x)) 100px 0 rgba(255, 255, 255, 0.1);  transform: translateX(calc(0% - var(--x) * var(--i)));}.text h2 span {  color: #0f0;  margin: 0 10px;}.text h2 span:nth-child(even) {  color: transparent;  -webkit-text-stroke: 2px #fff;}

JavaScript (修改后)

const position = document.documentElement;let startTime = Date.now(); // 记录动画开始时间let xValue = 0;             // 用于累加的 x 坐标值const animateScroll = () => {  // 检查动画是否已持续 10 秒(10000 毫秒)  if (Date.now() - startTime > 10000) {    return; // 动画结束,停止递归调用  }  // 更新 --x CSS变量,每次增加 1px  position.style.setProperty("--x", (xValue++) + "px");  // 请求浏览器在下一次重绘前再次调用 animateScroll 函数  requestAnimationFrame(animateScroll);};// 启动动画animateScroll();

注意事项与优化

动画持续时间: 要修改动画的持续时间,只需调整if (Date.now() – startTime > 10000)中的数字。例如,改为20000即为20秒。动画速度与方向:速度: 调整xValue++的增量可以改变滚动速度。例如,xValue += 2会使滚动速度加倍。方向: 将xValue++改为xValue–可以使文本向左滚动。无限循环动画: 如果希望动画无限循环,只需移除时间限制的if语句即可:

const animateScroll = () => {  position.style.setProperty("--x", (xValue++) + "px");  requestAnimationFrame(animateScroll);};animateScroll();

性能考量: requestAnimationFrame本身就是为高性能动画设计的。对于更复杂的动画,应避免在回调函数中执行耗时的DOM操作或复杂计算。兼容性: requestAnimationFrame在现代浏览器中广泛支持。对于老旧浏览器,可能需要添加polyfill,但这在当前前端开发中已不常见。CSS变量的灵活性: 本案例充分展示了CSS自定义属性(CSS变量)与JavaScript结合的强大之处。通过JavaScript动态更新CSS变量,可以实现高度灵活且性能优异的动态样式效果。

总结

通过本教程,我们成功地将一个依赖用户鼠标事件的视差文本动画,改造为一个完全自动播放的动画效果。核心在于利用requestAnimationFrame API来平滑、高效地更新CSS自定义属性–x,从而驱动CSS中的text-shadow和transform属性变化。这种方法不仅实现了动画的自动化,还保证了动画的流畅性和性能,为创建无需用户干预的动态网页元素提供了有效的解决方案。

以上就是将鼠标事件驱动的视差文本动画改造为自动播放效果的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1597581.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
为动态生成元素设置独立悬停提示:JavaScript对象与Map的应用
上一篇 2025年12月23日 12:10:21
高效管理PHP滑块页面重定向后的状态:保持当前滑块可见
下一篇 2025年12月23日 12:10:34

相关推荐

  • Java中FindBugs的特点 分析字节码检查

    Java中FindBugs的特点 分析字节码检查Java中FindBugs的特点 分析字节码检查Java中FindBugs的特点 分析字节码检查Java中FindBugs的特点 分析字节码检查

    findbugs是一款静态代码分析工具,通过分析java字节码来发现潜在bug。1. 它能识别空指针异常、资源泄露、死锁和低效代码等常见问题;2. 优势包括非侵入性、可配置性强、支持多种bug模式;3. 局限性包括误报、上下文感知能力有限及配置复杂;4. 可通过maven或gradle轻松集成到项目…

    2026年8月25日 用户投稿
    400
  • SEO测试太麻烦?juampi92/test-seo助你轻松搞定!

    在网站开发中,保证良好的SEO至关重要,但手动测试每一个页面上的SEO标签,简直让人头大。之前,我一直苦恼于如何高效地验证SEO的正确性。直到我发现了juampi92/test-seo这个Composer包,它简直是SEO测试的救星!Composer在线学习地址:学习地址 juampi92/test…

    用户投稿 2026年8月25日
    400
  • 有线能上网,无线上不了怎么办?

    有线能上网,无线上不了怎么办?有线能上网,无线上不了怎么办?有线能上网,无线上不了怎么办?有线能上网,无线上不了怎么办?

    配置完路由器之后,通过有线方式连接路由器的所有终端都能顺利访问互联网,然而使用无线方式连接的终端却无法上网,尽管无线终端的状态显示已成功连接到wi-fi网络。以下是具体的操作步骤: 可能的原因在于无线终端虽然显示已连接,但实际上与路由器并未建立有效连接。解决方法是先删除无线终端上的Wi-Fi配置文件…

    2026年8月25日 用户投稿
    000
  • Webman:提供快速而又高度可定制的前端开发解决方案

    Webman:提供快速而又高度可定制的前端开发解决方案 作为前端开发者,我们经常需要面对各种不同的项目和要求。有时候,我们需要快速开发一个简单的网站,有时候则需要构建一个复杂的应用程序。为了应对这些挑战,我们需要一个既能快速开发,又能高度可定制的解决方案。 Webman就是这样一个解决方案。它是一个…

    2026年8月25日
    000
  • Java中计算对象数组中特定属性的平均值和最大值

    本教程详细介绍了如何在Java中处理包含字符串和整数变量的对象数组,并计算其中特定整数属性(如分数)的平均值和最高值。我们将通过一个`Student`对象数组的示例,演示如何正确设计类、遍历数组、访问对象属性以及实现统计计算逻辑,同时强调正确的Getter方法签名。 在Java开发中,我们经常需要处…

    2026年8月25日
    000
  • 苹果手机掉了怎么追踪位置

    一、提前启用“查找我的 iPhone”功能 在手机丢失之前,务必确认“查找我的 iPhone”功能已经开启。操作方法是:进入手机“设置”应用,点击顶部的 Apple ID 账户,选择“查找”,然后开启“查找我的 iPhone”选项。只有提前开启此功能,才能在设备遗失后进行定位追踪。 二、通过电脑登录…

    2026年8月25日
    000
  • 如何解决网站和应用中的二维码生成难题,使用2amigos/qrcode-library助你轻松实现

    可以通过一下地址学习composer:学习地址 在如今数字化的世界里,二维码早已成为我们日常生活中不可或缺的一部分。从扫码支付到分享链接,从电子票据到产品溯源,二维码的应用场景几乎无处不在。作为一名开发者,我经常需要在项目中集成二维码生成功能,比如为用户生成专属的邀请码、为商品生成详情页链接的二维码…

    用户投稿 2026年8月25日
    000
  • java中的runnable关键字用途 Runnable接口的3个实现技巧

    java中的runnable关键字用途 Runnable接口的3个实现技巧java中的runnable关键字用途 Runnable接口的3个实现技巧java中的runnable关键字用途 Runnable接口的3个实现技巧java中的runnable关键字用途 Runnable接口的3个实现技巧

    runnable接口与thread类协同工作的核心机制是:将实现runnable接口的任务对象传递给thread类构造函数,再通过start()方法启动线程。1. runnable接口定义任务逻辑,通过run()方法实现;2. thread类负责执行任务,需将runnable对象传入其构造函数;3.…

    2026年8月25日 用户投稿
    100
  • 免费PPT生成速度快吗_提升免费PPT生成速度的实用技巧

    使用AI工具、导入文档、预设主题和套用模板可快速制作专业PPT。首先选择迅捷AIPPT等AI平台输入主题生成大纲并应用模板;其次通过Gamma等平台导入Word或文本自动生成幻灯片;再提前设置主题风格以便一键渲染;最后利用Slides%ignore_a_2%等模板库按场景筛选并批量调整格式,全面提升…

    2026年8月25日
    300
  • Laravel与CDN集成的最佳实践

    为什么要将laravel与cdn集成?将laravel与cdn集成可以显著提升网站的加载速度和用户体验。具体做法包括:1. 在.env文件中配置cdn_url。2. 在blade模板中使用环境变量引用静态资源。3. 只将对页面加载速度影响大的资源推送到cdn。4. 使用版本控制或哈希文件名管理cdn…

    2026年8月25日
    100
  • Java中如何实现二分查找 掌握二分查找的算法实现

    Java中如何实现二分查找 掌握二分查找的算法实现Java中如何实现二分查找 掌握二分查找的算法实现Java中如何实现二分查找 掌握二分查找的算法实现Java中如何实现二分查找 掌握二分查找的算法实现

    二分查找是一种高效的查找算法,其核心在于每次比较都排除一半的查找范围,从而快速定位目标值,但要求数据必须有序。实现方式有两种:1. 循环实现通过 while(left <= right) 不断调整 left 和 right 的值,计算 mid = left + (right – l…

    2026年8月25日 用户投稿
    000
  • 随便记录下系列 – node->express

    系列记录 – node.js到express的一站式指南 一、在Windows上安装Node.js环境:从官方网站下载Node.js,需替换下载链接 https://nodejs.org/dist/v6.2.0/node-v6.2.0-x64.msi 中的版本号6.2.0为所需版本即可。…

    2026年8月25日
    400
  • 华硕TUF GAMING A17对决宏碁暗影骑士·龙:AMD Advantage游戏本的性能与续航,3A平台加持下表现如何?

    华硕TUF GAMING A17在做工、散热和稳定性上优于宏碁暗影骑士·龙,搭载AMD锐龙处理器与RTX 30/40系显卡,性能强劲且通过军规测试,续航达6-8小时,接口丰富但无SD卡槽;暗影骑士·龙配置相似,性价比高但机身刚性稍弱,适合预算敏感用户。 当考虑购买一款主打性价比和稳定性能的游戏本时,…

    2026年8月25日
    000
  • 电竞显示器响应时间(GTG vs. MPRT)与过冲(Overdrive)调校

    答案:选择电竞显示器需关注GTG响应时间与Overdrive调校平衡。GTG反映像素真实转换速度,MPRT通过黑帧减少视觉拖影但非实际响应,过冲技术可加快响应却易引发鬼影,建议优先选原生GTG 4ms以下面板并手动调节Overdrive至中档以兼顾清晰与流畅。 电竞显示器的响应时间直接影响画面流畅度…

    2026年8月25日
    000
  • Java中IoC是什么概念 图解控制反转和依赖注入的实现原理

    Java中IoC是什么概念 图解控制反转和依赖注入的实现原理Java中IoC是什么概念 图解控制反转和依赖注入的实现原理Java中IoC是什么概念 图解控制反转和依赖注入的实现原理Java中IoC是什么概念 图解控制反转和依赖注入的实现原理

    ioc反转的是对象的控制权。传统开发中对象自己管理依赖,而ioc将对象创建和依赖管理交给外部容器,从而实现控制权的反转。ioc是一种设计原则,di是其具体实现方式,通过构造器、setter或接口注入依赖。java中依赖注入主要有三种方式:1.构造器注入,通过构造函数传递依赖,优点是依赖明确且不可变;…

    2026年8月25日 用户投稿
    000
  • java中的field有什么用 字段field的3个访问控制技巧

    java中的field有什么用 字段field的3个访问控制技巧java中的field有什么用 字段field的3个访问控制技巧java中的field有什么用 字段field的3个访问控制技巧java中的field有什么用 字段field的3个访问控制技巧

    java中的field主要用于反射,允许运行时检查和修改类的字段,包括私有字段。具体步骤如下:1. 获取class对象后,使用getfield()或getdeclaredfield()获取field对象,前者用于获取public字段(包括继承的),后者用于获取本类声明的所有字段;2. 使用setac…

    2026年8月25日 用户投稿
    000
  • Java中如何包装异常传递给上层方法

    使用异常链包装并传递异常时,需将原始异常作为新异常的cause参数传入,例如捕获IOException后抛出包含该异常的ServiceException。自定义异常类应提供接收Throwable的构造函数以支持异常链,确保堆栈信息完整。此策略适用于将技术异常转换为业务异常、隐藏底层细节及添加上下文信…

    2026年8月25日
    000
  • Java中锁的分类有哪些 详解Java中的各种锁机制

    Java中锁的分类有哪些 详解Java中的各种锁机制Java中锁的分类有哪些 详解Java中的各种锁机制Java中锁的分类有哪些 详解Java中的各种锁机制Java中锁的分类有哪些 详解Java中的各种锁机制

    java中的锁主要分为悲观锁与乐观锁、公平锁与非公平锁、可重入锁与不可重入锁、独占锁与共享锁等类型。1.悲观锁如synchronized和reentrantlock适用于写多场景,每次操作都加锁保证数据一致性;2.乐观锁通过版本号或cas实现,适用于读多写少的场景,提高吞吐量;3.公平锁按申请顺序获…

    2026年8月25日 用户投稿
    100
  • 抖音小程序是用什么语音做的

    抖音小程序由字节跳动自主研发,基于其自有的“字节跳动小程序”技术框架构建。该框架在设计上借鉴了微信小程序的开发模式,同时融合了平台自身的特点与需求。开发者可通过 JavaScript、HTML 和 CSS 完成前端界面与逻辑开发,后端则可灵活选用多种服务端语言和技术进行对接。 抖音小程序的技术架构解…

    2026年8月25日
    000
  • 如何解决JWT等安全令牌的复杂性和安全隐患,使用PASETO构建更安全的平台无关安全令牌

    可以通过一下地址学习composer:学习地址 在当今高度互联的数字世界里,无论是用户登录、api访问还是微服务间的通信,安全令牌都扮演着至关重要的角色。其中,json web tokens (jwt) 因其无状态、可扩展的特性,被广泛应用于各种场景。然而,随着我深入开发和维护多个项目,我开始对jw…

    用户投稿 2026年8月25日
    000

发表回复

登录后才能评论
关注微信