js+css实现文字散开重组动画特效代码分享

yizhihongxing

下面给出“js+css实现文字散开重组动画特效”的完整攻略。

原理说明

该特效的实现需要使用到CSS 的 transform 属性来进行文字的位移、旋转等操作。同时,通过JS 中的事件绑定实现触发动画效果。

  1. 首先将文字拆分为单个的字体元素
  2. 随后,通过JS 代码将单个的字体元素进行位置、旋转等方面的定义
  3. 当触发动画效果时,JS 代码随机分配位置和角度等属性,并且添加CSS 动画特效,使得字体元素散开;同样,当触发“合并”动画效果时,JS 代码也会对字体元素进行“合并”的操作。

实现步骤

下面我们将按照步骤来说明如何实现这个动画特效。

准备工作

文字散开重组的动画特效需要引用两个文件,分别是 fontawesome.cssindex.css

其中,fontawesome.css 文件用于引入各种图标字体,并需要在HTML文档中进行定义。

index.css 文件用于定义动画特效样式。

<link rel="stylesheet" href="//cdn.bootcss.com/font-awesome/5.13.0/css/all.min.css">
<link rel="stylesheet" href="index.css">

定义HTML

将需要动画展示的文字放在 <h1> 标签中,并且为每个字设置 span 标签。

<h1 class="font-effect-3d">
  <span>W</span>
  <span>E</span>
  <span>B</span>
  <span>D</span>
  <span>E</span>
  <span>S</span>
  <span>I</span>
  <span>G</span>
  <span>N</span>
</h1>

编写javascript

const container = document.querySelector('.font-effect-3d');
const spans = document.querySelectorAll('.font-effect-3d span');
const letters = [];

for (let index = 0; index < spans.length; index++) {
  letters.push(spans[index].innerHTML);
  spans[index].innerHTML = `<span class="letter-container">${spans[index].innerHTML}</span>`;
}

for (let index = 0; index < letters.length; index++) {
  spans[index].querySelector('.letter-container').style.transform = `translate(0, ${index * -20}px)`;
}

const createAnimation = state => {
  for (let index = 0; index < letters.length; index++) {
    const span = spans[index];
    const letter = letters[index];
    if (state === 'out') {
      span.style.animationName = 'letter-out';
      span.style.animationDelay = `${index * 0.05}s`;
      span.style.animationTimingFunction = 'cubic-bezier(0.250, 0.460, 0.450, 0.940)';
      span.style.animationDuration = '1s';
    } else if (state === 'in') {
      span.style.animationName = 'letter-in';
      span.style.animationDelay = `${(letters.length - index) * 0.05}s`;
      span.style.animationTimingFunction = 'cubic-bezier(0.250, 0.460, 0.450, 0.940)';
      span.style.animationDuration = '1s';
    }
    if (state !== 'reset') {
      span.addEventListener('animationend', () => {
        span.style.animation = '';
      });
    }
    if (state === 'reset') {
      span.style.transform = '';
    }
  }
};

container.addEventListener('mousedown', () => {
  createAnimation('out');
});

container.addEventListener('mouseup', () => {
  setTimeout(() => {
    createAnimation('in');
  }, 1000);
});

createAnimation('reset');

编写CSS

@keyframes letter-out {
  to {
    transform: scale(2) rotate(90deg) translateX(500px);
    opacity: 0;
  }
}

@keyframes letter-in {
  from {
    transform: scale(2) rotate(90deg) translateX(500px);
    opacity: 0;
  }
}

.letter-container {
  display: inline-block;
  transform-origin: center;
  transition: transform 0.5s ease-out;
}

.font-effect-3d {
  font-size: 8rem;
  font-family: 'Playfair Display SC', serif;
  text-transform: uppercase;
  color: #c2a971;
  width: 100%;
  text-align: center;
  position: relative;
  perspective: 2000px;
  user-select: none;
  -webkit-user-select: none;
}

.font-effect-3d span {
  display: inline-block;
  position: relative;
  transition: transform 0.5s ease-out;
  top: 0px;
  left: 0px;
  z-index: 2;
  opacity: 0.7;
}

.font-effect-3d span:after {
  content: attr(data-letter);
  position: absolute;
  top: 0px;
  left: 0px;
  color: #333;
  z-index: -1;
  opacity: 0;
}

.font-effect-3d:hover span:after,
.font-effect-3d:focus span:after {
  transform: translate3d(10px, 10px, -50px);
  opacity: 1;
  transition-delay: 0.5s, 0s;
  transition-duration: 0.5s, 0.5s;
  transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000), ease-out;
}

.font-effect-3d:active span:after {
  transform: translate3d(10px, 10px, -50px) rotateX(180deg);
  opacity: 0;
  transition-delay: 0s;
  transition-duration: 0.5s;
  transition-timing-function: ease-out;
}

示例说明

示例一

校园英语日为例,如下图所示,当用户鼠标点击触发时,字体进行散开动画并重组成新的单词。

示例代码:https://codepen.io/lindc/pen/MXjZMo

示例二

文本转换工具为例,如下图所示,当用户输入单词时,字体原地旋转随机重组为新字体组合。

示例代码:https://codepen.io/jcoulterdesign/pen/KygoKj

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:js+css实现文字散开重组动画特效代码分享 - Python技术站

(0)
上一篇 2023年6月10日
下一篇 2023年6月10日

相关文章

  • JavaScript 字符串操作的几种常见方法

    当我们在进行前端网页开发时,经常需要对字符串进行操作。JavaScript提供了一些常用的方法,用来对字符串进行增删改查等操作,使得我们可以更加高效地组织和处理文本内容。 下面,我们就来介绍一下JavaScript字符串操作的几种常见的方法: 1.字符串长度 字符串的长度可以通过字符串对象的length属性获取。比如: let str = ‘Hello Wo…

    JavaScript 2023年5月18日
    00
  • JavaScript手机振动API

    JavaScript手机振动API可以在移动设备上实现震动控制,让手机产生震动效果。本攻略将详细介绍如何使用JavaScript实现手机振动。 导入API 要使用JavaScript的手机振动API,需要使用Vibration API,该API基于Promise对象,包含两个方法:vibrate()和cancelVibration()。 要使用Vibrati…

    JavaScript 2023年6月11日
    00
  • 揭开iOS逆向解密的神秘面纱

    揭开iOS逆向解密的神秘面纱攻略 背景 iOS逆向解密是指通过对iOS应用进行逆向工程分析,获取应用的源代码、关键算法、加密算法等信息的过程。这种技术在黑客攻击、应用安全测试等领域有很大的应用。本篇攻略将介绍iOS逆向解密的基本流程和一些实用技巧。 步骤 iOS逆向解密的基本步骤包括以下几个方面: 准备逆向工具 IDA Pro(逆向分析工具) Hopper(…

    JavaScript 2023年5月28日
    00
  • 挑战“三大框架”的解决方案

    最近这些年,随着三大框架React、Vue、Angular版本逐渐稳定,前端技术栈的迭代似乎缓慢下来。 如果我们把目光拉伸到未来十年的视角,前端行业会出现哪些框架有可能会挑战React、Vue、Angular呢? 崭露头角的 Svelte 应该是其中的选项之一。 简介 Svelte 是一个构建 web 应用程序的工具。它被预测为未来十年可能取代React和V…

    JavaScript 2023年5月9日
    00
  • ajaxrequest.js ajaxrequest 0.7最新版 使用AJAXRequest进行AJAX应用程序开发入门小技巧

    使用AJAXRequest进行AJAX应用程序开发 AJAXRequest是一个轻量级的JavaScript库,旨在为基于AJAX的应用程序提供优雅而简单的开发方式。AJAXRequest 0.7是最新版本,适用于简单的AJAX请求和响应处理。 安装 你可以从GitHub下载AJAXRequest 0.7的源代码,也可以从CDN上使用以下代码: <sc…

    JavaScript 2023年6月11日
    00
  • javascript Array对象使用小结

    下面是关于 JavaScript Array 对象的使用小结: 什么是 JavaScript Array 对象? JavaScript 中的 Array 对象用于表示一组有序数据的集合。数组是一种特殊的对象类型,它可以存储不同类型的数据,包括数字、字符串、甚至是其他数组等等。数组中的每个元素都有一个编号,这个编号叫做索引。 创建数组 创建一个数组对象的方式有…

    JavaScript 2023年5月27日
    00
  • js实现把时间戳转换为yyyy-MM-dd hh:mm 格式(es6语法)

    当我们需要将时间戳转换为特定格式的日期时间字符串时,我们可以使用 JavaScript 中内置的 Date 对象来进行处理,然后使用字符串模板 (template string)即可实现。以下是将时间戳转换为 yyyy-MM-dd hh:mm 格式的完整攻略。 1. 创建 Date 实例 首先,我们需要通过 Date() 构造函数创建一个 Date 实例,构…

    JavaScript 2023年5月27日
    00
  • JavaScript运算符小结

    JavaScript运算符小结 本文主要介绍JavaScript中各种运算符的用法和特点,包括算术运算符、比较运算符、逻辑运算符等。 算术运算符 JavaScript中的常见算术运算符包括+、-、*、/、%等,分别表示加、减、乘、除、取余操作。其中,+符号还有连接字符串的功能。 示例: var a = 10; var b = 3; console.log(a…

    JavaScript 2023年5月28日
    00
合作推广
合作推广
分享本页
返回顶部