螺旋文字滚动特效源码解析

news2025/1/10 16:22:53

如图所示,今天看到一个很炫酷的双文字螺旋滚动特效,两行文字呈螺旋状变化,在网站中这样的效果对用户很有吸引力。本文将基于原网站解析如何实现这个炫酷的效果,基于这个动图可以分析出需要实现的要点:

  • 文字呈螺旋状滚动
  • 滚动过程中文字大小变化
  • 动画过程无缝链接
  • 两行文字滚动

实现过程

文字展示

为了方便更改文案将文案定义变量,通过JS代码动态创建DOM,定义文案、螺旋的角度以及动画的持续时间:

const words = "螺旋文字滚动特效";
const ANGLE = 360;
const ANIMATION_DURATION = 4000;

将文案创建元素添加到页面中:

const characters = words.split("").forEach((char, i) => {
  const createElement = (offset) => {
    const div = document.createElement("div");
    div.innerText = char;
    div.classList.add("character");
    div.setAttribute("data-offset", offset);
    return div;
  };

  document.querySelector("#spiral").append(createElement(0));
  document
    .querySelector("#spiral2")
    .append(createElement(-1 * (ANIMATION_DURATION / 2)));
});

因为有2行文字滚动,所以这里添加了2个spiral

<div id="spiral" class="spiral"></div>
<div id="spiral2" class="spiral"></div>

spiral 设置flex布局,此时的页面效果如下:

.spiral{
  display: flex;
  align-items: center;
  gap: 10px;
  position: absolute;
  color: #e0ecef;
  font-family: "sans-serif";
}

让文字动起来

这里的动画基于CSS Houdini @property实现,首先定义一个自定义属性--angle,接受角度值,初始值为0度。

@property --angle {
    syntax: '<angle>';
    initial-value: 0deg;
    inherits: false;
}

设置关键帧动画,修改定义的--angle属性从0度旋转到360度。

@keyframes spiral {
    0% { --angle: 0deg; }
    100% { --angle: 360deg; }
}

给每个文字的增加animation动画关联定义的关键帧动画spiral

.character{
  transform: translateY(calc(sin(var(--angle)) * 100px)) scale(calc(cos(var(--angle)) * 0.5 + 0.5));
  animation: spiral 4s linear infinite;
}

重点代码transform变换,使用transform属性结合calc函数和三角函数来实现Y轴的正弦波形偏移和缩放效果。

同时在动画中应用了前面定义的spiral动画。结合这两个函数,transform 属性效果如下:

  • Y 轴位移: 元素根据 --angle 的值在 Y 轴上上下移动,形成波动效果。
  • 缩放效果: 元素的大小根据 --angle 的值进行动态缩放,形成从小到大或从大到小的变化。

此时的动画效果:

螺旋滚动

此时我们的文字已经滚动起来了,只需要最后一步关键的代码就可以实现螺旋滚动效果,仔细看原始效果就能发现其实每个文字滚动的动画轨迹都是一样的,唯一的区别就是执行的动画延迟时间不同,形成了一个波动起伏的效果。

增加延迟动画CSS,由于我们的文字是通过JS创建的,所以需要在 createElement 中增加以下代码即可,根据动画持续时间和当前文字索引计算延迟时间:

div.style.animationDelay = `-${i * (ANIMATION_DURATION / 16) - offset}ms`

由于 --angle 设置了关键帧动画,是一个动态变化的变量,这段代码会使得元素在页面上呈现出螺旋或波动的动画效果,增强视觉吸引力。

此时我们的动画效果基本就完成了,如下所示:

兼容火狐

由于Firefox不支持@property动画,原作者写了火狐兼容代码,使用JavaScript来实现动画效果。

定义一个animation动画函数,使用 requestAnimationFrame 方法实现平滑的动画效果。

const animation = () => {
  ANGLE -= 1; 
  //...
  requestAnimationFrame(animation);
};

在动画函数中遍历所有文字元素来设置动画。

document.querySelectorAll(".spiral *").forEach((el, i) => {
  // ...
});

计算Y轴偏移和缩放,使用三角函数计算每个元素的Y轴偏移量和缩放比例:

const translateY = Math.sin(ANGLE * (Math.PI / 120)) * 100;
const scale = Math.cos(ANGLE * (Math.PI / 120)) * 0.5 + 0.5;

设置动画延迟,根据元素索引和数据属性data-offset计算动画的延迟时间。

const offset = parseInt(el.dataset.offset);
const delay = i * (ANIMATION_DURATION / 16) - offset;

最后动态设置CSS变换属性transform来应用Y轴偏移和缩放。在定时器中使用delay延迟时间执行动画。

setTimeout(() => {
  el.style.transform = `translateY(${translateY}px) scale(${scale})`;
}, delay);

火狐浏览器执行动画函数。

let isFirefox = typeof InstallTrigger !== 'undefined';

if(isFirefox){
  animation();
}

在线预览

关注公众号回复【 20240730 】可获取完整源代码~

最后

通过结合 JavaScript 和 CSS,我们成功实现了一个动态的螺旋文字滚动特效。该特效不仅展示了字符的动态变化,还通过延迟时间结合动画效果增强了视觉吸引力。本质实现这个效果是不需要 JavaScript,为了兼容火狐和动态创建文案DOM才使用了相关 JavaScript。有兴趣的可以尝试使用纯CSS实现这个炫酷的螺旋文字滚动特效。


看完本文如果觉得有用,记得点个赞支持,收藏起来说不定哪天就用上啦~

专注前端开发,分享前端相关技术干货,公众号:南城大前端(ID: nanchengfe)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1969289.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

管理流创建schema流程源码解析

一、简析 schema是pulsar重要的功能之一&#xff0c;现在就一起从源码的视角看下管理流创建schema时客户端和服务端的表现 客户端 客户端主要经历以下四个步骤 创建Schema实例 根据数据类型创建相对应的实例&#xff0c;例如Avro创建AvroSchema、JSON创建JSONSchema等 获取…

1.1、centos stream 9安装Kubernetes v1.30集群 环境说明

最近正在学习kubernetes&#xff0c;买了一套《Kubernetes权威指南 从Docker到Kubernetes实践全接触(第六版)》这本书讲得很好&#xff0c;上下两册&#xff0c;书中k8s的版本是V1.29&#xff0c;目前官网最新版本是v1.30。强烈建议大家买一套看看。 Kubernetes官网地址&#x…

jenkins使用docker api配置自签证书 +发布项目

配置证书 1、创建目录/etc/docker/certs&#xff0c; 在该目录下执行下列命令 openssl genrsa -aes256 -out ca-key.pem 4096 openssl req -new -x509 -days 3650 -key ca-key.pem -sha256 -out ca.pemopenssl genrsa -out server-key.pem 4096 \ openssl req -subj "/…

常见的应急救援设备有哪些_鼎跃安全

在我们的生活中&#xff0c;应急事件的发生常常是突如其来的&#xff0c;它们对人民的生命财产安全构成重大威胁&#xff0c;同时也对社会稳定提出严峻挑战。在这样的紧急情况下&#xff0c;迅速开展有效的救援工作显得尤为重要。而在整个救援过程中&#xff0c;应急设备的使用…

【简历】湘南某二本学院:前端简历指导,秋招面试通过率低

注&#xff1a;为保证用户信息安全&#xff0c;姓名和学校等信息已经进行同层次变更&#xff0c;内容部分细节也进行了部分隐藏 简历说明 这是一份25届二本同学的前端简历&#xff0c;但是这个简历&#xff0c;因为学校是个二本的专业&#xff0c;虽然说主体是在小公司&#x…

计算机基础(Windows 10+Office 2016)教程 —— 第6章 电子表格软件Excel 2016(下)

电子表格软件Excel 2016 6.4 Excel 2016的公式与函数6.4.1 公式的概念6.4.2 公式的使用6.4.3 单元格的引用6.4.4 函数的使用6.4.5 快速计算与自动求和 6.5 Excel 2016的数据管理6.5.1 数据排序6.5.2 数据筛选6.5.3 分类汇总6.5.4 分组显示6.5.5 合并计算 6.6 Excel 2016的图表6…

什么品牌的开放式耳机好用?南卡、韶音、漫步者 三款口碑超群机型横评

现如今耳机几乎成为了日常标配&#xff0c;因为选择合适的耳机成为我们不可忽视的需求。开放式耳机凭借其既能沉浸于高品质音乐&#xff0c;又能保持对周围环境的敏锐感知的独特优势&#xff0c;在市场中脱颖而出&#xff0c;尤其受到运动爱好者及追求生活品质的朋友们的喜爱。…

风吸杀虫灯采用新型技术 无公害诱虫捕虫

TH-FD2S】风吸杀虫灯利用害虫的趋光性和对特定波长的光源&#xff08;如紫外光、蓝光&#xff09;的敏感性&#xff0c;通过光波引诱害虫成虫扑灯。同时&#xff0c;内置的风扇产生强烈的气流&#xff0c;形成负压区&#xff0c;将害虫迅速吸入到收集器中。害虫在收集器内被风干…

排序算法:快速排序,golang实现

目录 前言 快速排序 代码示例 1. 算法包 2. 快速排序代码 3. 模拟程序 4. 运行程序 5. 从大到小排序 快速排序的思想 快速排序的实现逻辑 1. 选择基准值 (Pivot) 2. 分区操作 (Partition) 3. 递归排序 循环次数测试 假如 10 条数据进行排序 假如 20 条数据进行…

从入门到自动化:一篇文章掌握Python的80%

Python作为一种高级编程语言&#xff0c;以其简洁明了的语法和强大的功能性&#xff0c;在全球编程社区内享有极高的声誉。本文将带领你从Python的基础语法入手&#xff0c;介绍其常用库的应用&#xff0c;以及如何将Python用于数据分析、网络爬虫和简单的自动化任务&#xff0…

模板(c++)part2

目录 1.非类型模板参数 2.特化 2.1函数模板特化 2.2类模板特化 2.2.1全特化 2.2.2偏特化 3.模板分离编译 1.非类型模板参数 注意&#xff0c;假如 #define N 10 template<class T> class A { private:T a[N]; }; 这样的一个类模板&#xff0c;a数组的大小是定死的 …

canvas绘制表格

canvas绘制表格 最近在为公司产品做技术预研&#xff0c;经理让用canvas做一个表格&#xff0c;于是就有了这篇博客。 我们的数据是后端通过MQTT推送过来的 我在代码中也直接使用了 具体MQTT的实现代码&#xff0c;可见博客 在vue使用MQTT 在这里为了方便实用我直接封装成组件…

【中项第三版】系统集成项目管理工程师 | 第 11 章 规划过程组⑥ | 11.15 - 11.17

前言 第11章对应的内容选择题和案例分析都会进行考查&#xff0c;这一章节属于10大管理的内容&#xff0c;学习要以教材为准。本章上午题分值预计在15分。 目录 11.15 规划资源管理 11.15.1 主要输入 11.15.2 主要工具与技术 11.15.3 主要输出 11.16 估算活动资源 11.1…

安装jdk和tomcat

安装nodejs 1.安装nodejs&#xff0c;这是一个jdk一样的软件运行环境 yum -y list installed|grep epel yum -y install nodejs node -v 2.下载对应的nodejs软件npm yum -y install npm npm -v npm set config .....淘宝镜像 3.安装vue/cli command line interface 命令行接…

轻松搞定 Nginx 在 CentOS 和 Ubuntu 上的安装与配置

注&#xff1a;这是对我以前博客进行优化后再次发布的&#xff0c;博客中的截图为以前的。原博客已删除。 如何安装nginx nginx是一款开源、高性能的Web和反向代理服务器&#xff0c;支持HTTP、HTTPS、SMTP、POP3和IMAP协议。由于其轻量级、资源占用少和强大的并发能力&#…

时空预测又爆火了!新SOTA实现零样本精准预测

时空预测又有新突破啦&#xff01;港大、华南理工等提出了时空大模型UrbanGPT&#xff0c;在性能上猛超现有SOTA&#xff0c;实现零样本即可时空预测&#xff01; 另外还有清华的首个通用城市时空预测模型UniST、能即插即用快速适配的时空提示调整机制FlashST...这些效果非常ni…

探索计算器存储器的奥秘:数字记忆的科学

在日常生活中&#xff0c;我们经常使用计算器来执行各种数学运算。但你是否曾想过&#xff0c;当按下每个按键时&#xff0c;计算器是如何记住数字和运算符的&#xff1f;本文将深入探讨计算器存储器的工作原理&#xff0c;揭示其背后的科学原理。 引言&#xff1a;数字世界的…

家庭出游新风尚!格瑞维亚改装大赛创意实用并存

在创新浪潮翻涌的当下&#xff0c;汽车已蜕变为个性化生活的璀璨舞台&#xff0c;格瑞维亚改装共创大赛便是这一变革的推动者。这场大赛&#xff0c;不仅汇聚了400余支创意团队的心血结晶&#xff0c;更将汽车改装的魅力推向了新的高度。它不仅仅是对机械与美学的重塑&#xff…

STM32——EXIT外部中断

一、中断系统 以上就是中断的概念&#xff0c;简单理解就是&#xff1a; 当程序运行过程中&#xff0c;如果有中断源向CPU打报告&#xff0c;CPU就会暂停手下的事情去处理中断源提交的事情&#xff0c;然后处理完了在返回到CPU原来的位置继续处理手上的事情。如果同时有多个中…

浏览器指纹技术:如何更改浏览器指纹?

“指纹信息”是一个人独有的身份象征&#xff0c;而“浏览器指纹”&#xff0c;就是网站和在线平台使用浏览器指纹来收集有关您的浏览器、设备和网络的详细信息&#xff0c;它可以说是你上网的身份象征&#xff0c;可让网站跟踪您的在线行为。 下面我们简单科普浏览器指纹的工…