• 原文地址:Making Stagger Reveal Animations for Text
  • 原文作者:Mary Lou

Thibaud Allie 制作了这个精彩的动画,您能够在 Dani Morales 的网站在线观看。单击“对于”(而后单击“敞开”)会产生这种动画成果。最近在许多设计中都应用了这种在印刷元素上的显示、暗藏动画成果。在 Codrops,咱们将其称为“展现”动画。

我很观赏这种文字动画成果,并想应用 GSAP 和 Splitting.js 从新实现它。因而,我做了一个相似的基于版式的布局,并通过交织字母动画来挪动文本。

简化的标记如下所示:

<section class="content__item content__item--home content__item--current">    <p class="content__paragraph" data-splitting>Something</p>    <p class="content__paragraph" data-splitting>More</p>    ...</section><section class="content__item content__item--about">    <p class="content__paragraph" data-splitting>Something</p>    <p class="content__paragraph" data-splitting>Else</p>    ...</section>

请留神,content__paragraph 元素的必要款式是 overflow: hidden 显示/显示动画能够应用的款式。

所有具备“数据拆分”属性的元素,将被拆分为多个局部,而后咱们能够别离对其进行动画解决。接下来,让咱们看一下 JavaScript 代码:

首先,咱们须要导入一些库和款式:

import "splitting/dist/splitting.css";import "splitting/dist/splitting-cells.css";import Splitting from "splitting";import {    gsap} from 'gsap';import {    preloadFonts} from './utils';import Cursor from "./cursor";

我在这里应用了一些Adobe字体 (Freight Big Pro 和 Tenon),让咱们预加载它们:

preloadFonts('lwc3axy').then(() => document.body.classList.remove('loading'));

而后把所有文本拆分为多个跨度:

Splitting();

该设计具备一个自定义游标,咱们将其示意如下:

new Cursor(document.querySelector('.cursor'))

让咱们获取所有相干的 DOM 元素:

let DOM = {    content: {        home: {            section: document.querySelector('.content__item--home'),            get chars() {                return this.section.querySelectorAll('.content__paragraph .word > .char, .whitespace');            },            isVisible: true        },        about: {            section: document.querySelector('.content__item--about'),            get chars() {                return this.section.querySelectorAll('.content__paragraph .word > .char, .whitespace')            },            get picture() {                return this.section.querySelector('.content__figure');            },            isVisible: false        }    },    links: {        about: {            anchor: document.querySelector('a.frame__about'),            get stateElement() {                return this.anchor.children;            }        },        home: document.querySelector('a.frame__home')    }};

当初让咱们看看 GSAP 时间轴,其中产生了不堪设想的事件(还有一些默认设置):

const timelineSettings = {    staggerValue: 0.014,    charsDuration: 0.5};const timeline = gsap.timeline({        paused: true    })    .addLabel('start')    // 错开首页局部字符的动画    .staggerTo(DOM.content.home.chars, timelineSettings.charsDuration, {        ease: 'Power3.easeIn',        y: '-100%',        opacity: 0    }, timelineSettings.staggerValue, 'start')    // 在这里,咱们进行切换    // 咱们须要为内容局部切换以后类    .addLabel('switchtime')    .add(() => {        DOM.content.home.section.classList.toggle('content__item--current');        DOM.content.about.section.classList.toggle('content__item--current');    })    // 更改主体的背景色    .to(document.body, {        duration: 0.8,        ease: 'Power1.easeInOut',        backgroundColor: '#c3b996'    }, 'switchtime-=timelineSettings.charsDuration/4')    // 将在其中设置动画的 about 局部元素的起始值    .set(DOM.content.about.chars, {        y: '100%'    }, 'switchtime')    .set(DOM.content.about.picture, {        y: '40%',        rotation: -4,        opacity: 0    }, 'switchtime')    // 错开 about 局部字符的动画    .staggerTo(DOM.content.about.chars, timelineSettings.charsDuration, {        ease: 'Power3.easeOut',        y: '0%'    }, timelineSettings.staggerValue, 'switchtime')    // 最初,对图片进行动画解决    .to(DOM.content.about.picture, 0.8, {        ease: 'Power3.easeOut',        y: '0%',        opacity: 1,        rotation: 0    }, 'switchtime+=0.6');

当咱们单击“对于”或徽标、主页链接时,咱们想通过播放和倒转工夫线来切换以后内容。咱们还心愿切换“对于”和“敞开”链接的以后状态:

const switchContent = () => {    DOM.links.about.stateElement[0].classList[DOM.content.about.isVisible ? 'add' : 'remove']('frame__about-item--current');    DOM.links.about.stateElement[1].classList[DOM.content.about.isVisible ? 'remove' : 'add']('frame__about-item--current');    timeline[DOM.content.about.isVisible ? 'reverse' : 'play']();    DOM.content.about.isVisible = !DOM.content.about.isVisible;    DOM.content.home.isVisible = !DOM.content.about.isVisible;};DOM.links.about.anchor.addEventListener('click', () => switchContent());DOM.links.home.addEventListener('click', () => {    if ( DOM.content.home.isVisible ) return;    switchContent();});

这就是所有的内容!它并不太简单,您能够应用这种字母动画来制作很多不错的成果。

感谢您的浏览,心愿这对您有所帮忙????

如果您有任何疑难或倡议,请与我分割 @codrops 或 @crnacura。

在 Github 上找到这个我的项目。