分享一个有意思的文字飞入动画(模仿水滴融合)

news/2024/11/15 5:01:08/

先上效果图:
在这里插入图片描述
代码如下:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><style>* {margin: 0;padding: 0;box-sizing: border-box;}:root {--text-color: #f6f1e6;--drops-color: #231d1c;}body {background: var(--text-color);font-family: Georgia, serif;}.canvas {position: relative;height: 100vh;overflow: hidden;}.canvas--animated .puddle__letter {-webkit-animation-play-state: running;animation-play-state: running;}.puddle {position: absolute;display: flex;transform: rotate(var(--r, 0deg)) translate(calc(-50% - var(--x, 0)), calc(-50% - var(--y, 0)));top: 50%;left: 50%;color: var(--text-color);font-size: 6vmin;white-space: pre;}.puddle__letter {transform: translateY(800px);padding: 0.1em 0.2em;margin: -0.1em -0.2em;will-change: transform;-webkit-animation: drop 800ms var(--delay) ease-out forwards paused;animation: drop 800ms var(--delay) ease-out forwards paused;}.combined-puddles {position: relative;height: 100%;z-index: -1;filter: url(#drops-filter);-webkit-user-select: none;-moz-user-select: none;-ms-user-select: none;user-select: none;}.combined-puddles .puddle__letter {border-radius: 50%;color: var(--drops-color);background-color: currentColor;}.combined-puddles .puddle__letter--t-1 {box-shadow: 0.0259077911em 0.0158195613em 0 0.156531918em currentColor;}.combined-puddles .puddle__letter--t-2 {box-shadow: 0.0027610231em 0.0292517118em 0 0.0017377822em currentColor;}.combined-puddles .puddle__letter--t-3 {box-shadow: 0.0014897121em 0.0208965418em 0 0.2029532073em currentColor;}.combined-puddles .puddle__letter--t-4 {box-shadow: 0.0181212165em 0.0001267036em 0 0.2696130855em currentColor;}.combined-puddles .puddle__letter--t-5 {box-shadow: 0.0299544544em 0.0155872295em 0 0.3927980665em currentColor;}.combined-puddles .puddle__letter--t-6 {box-shadow: 0.0223628085em 0.013623193em 0 0.3951977831em currentColor;}.combined-puddles .puddle__letter--t-7 {box-shadow: 0.017073126em 0.0166402911em 0 0.1251815461em currentColor;}.combined-puddles .puddle__letter--t-8 {box-shadow: 0.0160218528em 0.0103797109em 0 0.2355980051em currentColor;}.combined-puddles .puddle__letter--t-9 {box-shadow: 0.0061457537em 0.0272304962em 0 0.0502537243em currentColor;}.combined-puddles .puddle__letter--t-10 {box-shadow: 0.0010890892em 0.0108737853em 0 0.2990892848em currentColor;}@-webkit-keyframes drop {0% {transform: translate(0, 100vh);}80% {transform: translate(0, -5px);}100% {transform: translate(0, 0);}}@keyframes drop {0% {transform: translate(0, 100vh);}80% {transform: translate(0, -5px);}100% {transform: translate(0, 0);}}</style>
</head>
<body>
<div class="canvas"><div class="puddle" style="--x: 1.55em; --y: 3.73em">Roses are red</div><div class="puddle" style="--x: 1.5em; --y: 1.8em">Violets are blue</div><div class="puddle" style="--x: -1.5em; --y: -1.8em">Unexpected ";"</div><div class="puddle" style="--x: -1.3em; --y: -3.7em">On line 32</div>
</div>
</body>
<script>class Droppy {DEFAULT_OPTIONS = {canvasSelector: ".canvas",textSelector: ".puddle",letterClassName: "puddle__letter",dropsClassName: "combined-puddles",delayBetweenDrops: 95,dropTypes: 10,wordAngleRange: [-3, 3]};constructor(opts) {this.opts = { ...this.DEFAULT_OPTIONS, ...opts };this.$textSelector = document.querySelectorAll(this.opts.textSelector);this.$canvas = document.querySelector(this.opts.canvasSelector);this.init();}init() {this.injectSVGFilter();this.wrapLetters();this.addDelayToEachLetter();this.createDrops();this.startAnimation();}getRandomInt = (min, max) => {return Math.floor(Math.random() * (max - min + 1)) + min;};startAnimation() {this.$canvas.classList.add("canvas--animated");}wrapLetters() {this.$textSelector.forEach(($word) => {const letters = Array.from($word.innerText).map((letter) => {const dropType = this.getRandomInt(1, this.opts.dropTypes);const className = `${this.opts.letterClassName} ${this.opts.letterClassName}--t-${dropType}`;return `<div class="${className}">${letter}</div>`;});const angle = this.getRandomInt(this.opts.wordAngleRange[0],this.opts.wordAngleRange[1]);$word.style.cssText += `--r:${angle}deg`;$word.innerHTML = letters.join("");});}addDelayToEachLetter() {const letters = document.querySelectorAll(`.${this.opts.letterClassName}`);Array.from(letters, ($letter, index) => {const delay = index * this.opts.delayBetweenDrops;$letter.style.cssText += `--delay:${delay}ms`;});}createDrops() {const $drops = document.createElement("div");$drops.className = this.opts.dropsClassName;Array.from(this.$textSelector, ($word) =>$drops.appendChild($word.cloneNode(true)));this.$canvas.appendChild($drops);}injectSVGFilter() {const filter ='<svg style="display:none;"><filter id="drops-filter" x="-50%" width="200%" y="-50%" height="200%" color-interpolation-filters="sRGB"><feGaussianBlur in="SourceGraphic" stdDeviation="8" result="blur" /><feColorMatrix in="blur" mode="matrix" values="1 0 0 0 0  0 1 0 0 0  0 0 1 0 0  0 0 0 21 -7" result="cm" /></filter></svg>';this.$canvas.insertAdjacentHTML("beforeend", filter);}}new Droppy();</script>
</html>

http://www.ppmy.cn/news/52824.html

相关文章

5岁程序员上岸的5个选择,适合所有的大龄IT从业者,如何突破职场发展

80%的成语 当他35岁大多数都要考虑转行了 否则35岁你必然被淘汰 当天有个小伙伴 问我一个成语员都关心的问题 他呢在一家互联网大厂工作 他和他的一些同事 都有一种所谓的35岁的焦虑症 担心自己在职场上的竞争力 不断的变弱 又担心自己在上有老下有小的年纪 被公司优化掉 在行业…

OpenShift 4 - 在 CI/CD Pipeline 中创建 KubeVirt 容器虚拟机 - 方法1+2 (视频)

《OpenShift / RHEL / DevSecOps 汇总目录》 说明&#xff1a;本文已经在支持 OpenShift 4.12 的 OpenShift 环境中验证 文章目录 准备环境安装可实现 KubeVirt 操作的 Tekton 资源创建密钥对 在 CI/CD 流水线管道中创建 VM方法1&#xff1a;通过 Manifest 任务创建 VM方法2&am…

java基础——Map

Map 第一章 Map集合 1.1 概述 Java提供了专门的集合类用来存放键值对关系的对象&#xff0c;即java.util.Map接口。 我们通过查看Map接口描述&#xff0c;发现Map接口下的集合与Collection接口下的集合&#xff0c;它们存储数据的形式不同&#xff0c;如下图。 Collection中…

合创视觉UI设计师app设计工具

众所周知&#xff0c;适合的工具可以为你带来事半功倍的效果。根据UI设计专业的特点将20个工具进行介绍&#xff0c;他们分别是&#xff1a;原型设计、线框绘制、调动情绪、动效设计。   为你提供创建完美UI设计所需的必要元素。想学UI设计的同学们看起来吧。   原型设…

.netCHATING 10.4 for NET6-7.0-Crack

.NET 6.0图表支持--dotnetcharting .netCHATING 10.4添加了.NET 6.0图表nuget包和.NET 6.0图表示例包&#xff08;需要Visual Studio 2022&#xff09;&#xff0c;.NET 5是.NET Core 3.1和.NET Framework 4.8的继任者&#xff0c;旨在为.NET开发人员提供新的跨平台开发体验。…

Python 实现txt、excel、csv文件读写【附源码】

目录 前言 一、txt文件读写 二、excel文件读写 总结 前言 本文介绍使用Python进行文件读写操作&#xff0c;包括txt文件、excel文件(xlsx、xls、csv) 编译器使用的是PyCharm 一、txt文件读写 read() # 一次性读取全部内容readline() # 读取第一…

RUST 每日一省:生命周期作用域

生命周期 一个变量的生命周期就是它从创建到销毁的整个过程。 作用域 我们声明的每个变量都有作用域。作用域其实是变量和值存在的环境。作用域是由一对花括号表示的。例如&#xff0c;使用块表达式会创建一个作用域&#xff0c;即任何以花括号开头和结尾的表达式。此…

如何在模拟器里面脱360的壳

1.准备环境 1.夜神模拟器 2.pyhton3.8 3.frida的版本 16.0.17 4.frida-dexdump 2.设置adb连接 我们打开夜神模拟器所在的文件夹&#xff0c;里面有自带的adb&#xff0c;我们在这个文件夹里面打开cmd。在里面链接上夜神模拟器。 adb devices 我这边显示链接成功了。 3.…