テキストのスクロールアニメーション

初心者でも簡単にリッチなアニメーションを実装できるスクロール連動のテキストアニメーション。
ブランディングサイトやLPで英字のタイトルなどに使うと一気にハイクオリティなアニメーションサイトに。

HTML

<div class="ugkTxtAnime">
  <p>下からにょきっと</p>
  <p class="textAnime txtToTop">ANIMATION</p>
  <p>上からにょきっと</p>
  <p class="textAnime txtToBottom">ANIMATION</p>
  <p>左からさらさらと</p>
  <p class="textAnime txtToRight">ANIMATION</p>
  <p>左からカラーリング</p>
  <p class="textAnime txtColor">ANIMATION</p>
  <p>縦軸にくるくる</p>
  <p class="textAnime txtRotateX">ANIMATION</p>
  <p>横軸にくるくる</p>
  <p class="textAnime txtRotateY">ANIMATION</p>
</div>

CSS

.textAnime {
  line-height: 1;
  font-size: 36px;
  font-weight: bold;
  color: #323232;
  letter-spacing: 0.1em;
  overflow: hidden;
}
.textAnime span {
  display: inline-block;
  transition: all ease .5s;
}
.txtToTop span {
  transform: translateY(100%);
}
.txtToBottom span {
  transform: translateY(-100%);
}
.txtToRight span {
  transform: scaleX(0);
  transform-origin: left;
}
.txtColor span {
  color: #E0E0E0;
}
.txtRotateX span {
  opacity: 0;
  transform: rotateY(360deg);
}
.txtRotateY span {
  opacity: 0;
  transform: rotateX(360deg);
}
.fadeIn.txtToTop span {
  transform: translateY(0);
}
.fadeIn.txtToBottom span {
  transform: translateY(0);
}
.fadeIn.txtToRight span {
  transform: scaleX(1);
}
.fadeIn.txtColor span {
  color: #333333;
}
.fadeIn.txtRotateX span {
  opacity: 1;
  transform: rotateY(0);
}
.fadeIn.txtRotateY span {
  opacity: 1;
  transform: rotateX(0);
}

/*テストアップ時のレイアウト用*/
.ugkTxtAnime .textAnime {
  margin-bottom: 80px;
}

JS

document.addEventListener('DOMContentLoaded',() =>{
	const targets = document.querySelectorAll('.textAnime');
	targets.forEach((el) => {
		const text = (el.textContent || '').trim();//文字列を取り出す
		const chars = Array.from(text);//各文字ごとに分割
		el.textContent = "";
		chars.forEach((ch,i) => {
			const span = document.createElement('span');
			span.textContent = ch;
			
			const delay = 0.08 * (i + 1);
			span.style.transitionDelay = `${delay}s`;
			span.style.webkitTransitionDelay = `${delay}s`;
			
			el.appendChild(span);
		});
	});
});

(() => {
  const run = () => {
    const els = document.querySelectorAll('.textAnime');
    if (!els.length) return;

    const update = () => {
      const y = window.pageYOffset || document.documentElement.scrollTop;
      const vh = window.innerHeight || document.documentElement.clientHeight;

      els.forEach((el) => {
        //↓要素の80px下が起点(出すタイミングによって数値を変更)
        const top = el.getBoundingClientRect().top + y + 20;
        //↓画面内に入った時アニメーションを毎回発生させる場合↓
        el.classList.toggle('fadeIn', y >= top - vh);
        //↓アニメーションを初回のみにしたい場合↓
        //if (y >= top - vh) el.classList.add('fadeIn');
      });
    };

    const onChange = () => requestAnimationFrame(update);

    window.addEventListener('scroll', onChange, { passive: true });
    update();
  };

  document.readyState === 'loading'
    ? document.addEventListener('DOMContentLoaded', run)
    : run();
})();

フェードイン実装方法

実際に使用するときはcssとjsをサイトにコピペし、フェードインさせたい要素全てにtextAnimeクラスを付けます。
それぞれの動きに合わせて以下のクラスを追加してください。

  • 下からにょきっと:txtToTop
  • 上からにょきっと:txtToBottom
  • 左からさらさらと:txtToRight
  • 左からカラーリング:txtColor
  • 縦軸にくるくる:txtRotateX
  • 横軸にくるくる:txtRotateY

実際の動き

下からにょきっと

ANIMATION

上からにょきっと

ANIMATION

左からさらさらと

ANIMATION

左からカラーリング

ANIMATION

縦軸にくるくる

ANIMATION

横軸にくるくる

ANIMATION

みんなにもシェアしてあげて!

この記事を書いた人

WEBサイトで使える“動くUI”を、コピペで実装可能にし、どこでも誰でも使えるコードに特化して発信しているフロントエンドエンジニア。
中学生で初めてコードに出会い初めてコーディングを知る。
その後、WEB制作会社のフロントエンドエンジニアとしてキャリアをスタートし、フリーランスを経て、現在はWEB制作会社の代表取締役。
コーディングによって人生を創り上げてきたからこそ、コードを通して誰かの役に立てたらという想いで、これまでの知識と経験を総動員したコードを公開中。

コメント

コメントする