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

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

本教程详细介绍了如何将一个基于鼠标移动事件触发的视差文本动画转换为自动播放效果。通过利用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)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月23日 12:10:21
下一篇 2025年12月23日 12:10:34

相关推荐

  • css分割线怎么用

    使用 HTML 中的 元素即可创建 CSS 分割线。水平分割线由 默认创建;垂直分割线通过设置 CSS display: inline-block; height: 100%; vertical-align: middle; 实现。分割线的样式可通过 border-top-style、border-…

    2025年12月24日
    000
  • css怎么加竖线

    在 CSS 中,可以通过 border 属性添加竖线:定义边框类型为 solid设置边框宽度设置边框颜色为特定边框添加竖线,例如 border-left: 1px solid #000; 在 CSS 中添加竖线 在 CSS 中,可以使用 border 属性为元素添加竖线。以下是具体步骤: 定义边框类…

    2025年12月24日
    000
  • css下划线怎么设置

    在 CSS 中,通过 text-decoration: underline; 为文本添加下划线。此外,还可以定制下划线,包括偏移量、颜色和样式。要移除下划线,请使用 text-decoration: none;。 如何在 CSS 中设置下划线 在 CSS 中,可以使用 text-decoration…

    2025年12月24日
    000
  • css背景色透明怎么设置

    在CSS中,将背景色设置为透明的方法是使用background-color属性并将其值设置为transparent。此外,还可使用RGBA值设置背景透明度,其中0为完全透明,1为完全不透明。例如,rgba(0, 0, 0, 0.5)代表50%透明的黑色背景。 CSS背景色透明设置方法 在CSS中,将…

    2025年12月24日
    000
  • css表格怎么水平居中

    CSS 表格水平居中有两种方法:使用 text-align: center 对文本水平居中,使用 margin: 0 auto 对整个表格水平居中,具体使用哪种方法取决于实际需求。 CSS 表格水平居中的实现 在 CSS 中,水平居中表格有两种常见方法: 1. 使用 text-align: cent…

    2025年12月24日
    000
  • css文件怎么添加注释

    CSS文件中添加注释有两种方法:单行注释:使用双斜杠 (//) 标记行末注释内容。多行注释:使用 / 和 / 标记注释,注释内容包含在 / 和 / 之间。注释用于解释代码、文档化文件和标记代码段。注释不会影响浏览器解析,但对于理解和维护代码很有帮助。 CSS 文件中添加注释的方法 单行注释:使用双斜…

    2025年12月24日
    000
  • css颜色代码怎么设置

    css 颜色代码的设置 在 CSS 中,可以使用多种方法设置颜色代码。这些方法包括: 1. 十六进制值 十六进制值是最常见的颜色代码格式。它使用 6 个十六进制数字 (0-9、a-f) 来表示颜色。例如,黑色为 #000000,白色为 #FFFFFF。 2. RGB 值 立即学习“前端免费学习笔记(…

    好文分享 2025年12月24日
    000
  • css类样式怎么用

    CSS 类样式允许您在 HTML 文档中轻松对多个元素应用相同的外观和行为,从而提高代码的可维护性和一致性。如何定义类样式:使用 .(句号)前缀语法,在 元素或外部样式表文件中定义类样式。例如:.heading { color: red; font-size: 2em; }如何使用类样式:在 HTM…

    2025年12月24日
    000
  • css标签栏怎么设置

    使用 CSS 设置标签栏分四步:创建 HTML 标签栏结构、设置标签栏样式、设置标签内容样式、添加切换逻辑,实现标签点击切换内容。 CSS 标签栏设置 如何设置 CSS 标签栏? 使用 CSS 设置标签栏涉及以下步骤: 1. 创建 HTML 结构 立即学习“前端免费学习笔记(深入)”; 首先,在 H…

    2025年12月24日
    000
  • css颜色代码怎么取消

    如何取消 css 颜色代码 取消 CSS 颜色代码的方法有以下两种: 1. 使用透明度值 CSS 颜色值支持透明度值,范围从 0(完全透明)到 1(完全不透明)。要取消颜色,可以将其透明度值设置为 0。 color: rgba(0, 0, 0, 0); 这将创建一个透明的文本,看不到任何颜色。 立即…

    好文分享 2025年12月24日
    000
  • css怎么让div倾斜

    CSS中可以使用transform属性让DIV倾斜:选择要倾斜的DIV。使用transform属性应用倾斜变换。在transform属性中指定水平和垂直倾斜角度。示例:transform: skew(20deg, 10deg);(沿水平轴倾斜20度,沿垂直轴倾斜10度) CSS让DIV倾斜的方法 在…

    2025年12月24日
    000
  • css3动画属性有哪些内容

    CSS3 动画属性可添加动态效果和交互性,通过平滑过渡元素状态来实现。主要属性包括:animation-name:指定动画名称。animation-duration:定义动画时长。animation-timing-function:控制缓动行为。animation-delay:设定动画延迟时间。an…

    2025年12月24日
    000
  • text-indent怎么用

    text-indent 是 CSS 属性,用于设置段落的首行缩进,语法为 text-indent: |; 它可以以长度或相对于块级元素宽度的百分比进行设置,负值表示向外缩进,仅适用于段落的第一行。 text-indent 的用法 什么是 text-indent? text-indent 在 CSS …

    好文分享 2025年12月24日
    000
  • letter-spacing对中文起作用吗

    是的,letter-spacing 可以对中文起作用,原理是通过调整相邻字符之间的间距,从而使中文文本看起来更加宽松和易读。具体用法为:selector { letter-spacing: 值;},例如,p { letter-spacing: 5px;}可将中文文本的字符间距增加 5px,但需要注意…

    2025年12月24日
    000
  • css导航条怎么固定

    使用 CSS 固定导航条:添加 position: fixed; 属性,将导航条固定在窗口中。设置 top/bottom 属性指定垂直位置,left/right 属性指定水平位置。考虑宽度、脱离文档流、z-index 以及针对不同屏幕尺寸调整样式等注意事项。 CSS 导航条固定 问题:如何使用 CS…

    2025年12月24日
    000
  • 在css中怎么左右布局

    CSS 中实现左右布局的方法有 4 种:Flexbox、Grid、float 和定位。Flexbox 语法:display: flex; flex-direction: row; justify-content: flex-start; align-items: center;。Grid 语法:di…

    2025年12月24日
    000
  • css样式里面怎么注释

    使用 CSS 中的注释来添加说明或注释,有两种形式:单行注释:使用 // 开始多行注释:使用 / 开始,用 / 结束 如何使用 CSS 中的注释 CSS 中可以使用注释来添加说明或注释,以供其他开发人员或自己将来参考。注释对于保持 CSS 代码整洁且易于理解至关重要。 注释有两种形式:单行注释和多行…

    2025年12月24日
    000
  • css中虚线代码怎么写

    在 CSS 中创建虚线:使用语法:border: 1px dashed black;自定义样式:border: 1px dashed black 2px 5px;(2px 为虚线长度,5px 为间距)控制行为:使用 border-top/right/bottom/left-style 分别指定边框虚…

    2025年12月24日
    000
  • css怎么做分段的渐变

    在 CSS 中,可以使用 linear-gradient() 函数创建分段渐变,其中:start_point:渐变起点位置,可为 top、left、bottom、right。color_stop1:第一个颜色停止点,格式为 颜色 位置。color_stop2:第二个颜色停止点,格式同上。可添加任意数…

    2025年12月24日
    000
  • css自适应怎么弄

    CSS 自适应布局允许网页布局根据屏幕尺寸动态调整。实现方法包括:弹性盒布局:控制元素布局、对齐和尺寸。网格布局:基于行和列的布局系统,适用于复杂布局。媒体查询:根据不同屏幕尺寸或设备功能应用不同的 CSS 样式。响应式图像:根据屏幕尺寸调整图像大小。 CSS 自适应布局实现方法 什么是 CSS 自…

    好文分享 2025年12月24日
    000

发表回复

登录后才能评论
关注微信