テキストを1文字ずつスライドしてフェードイン表示

テキストを1文字ずつスライドしてフェードイン表示するには、次のようは方法で実装することができます。

JavaScript (ES6以降)

(() => {
	window.addEventListener('DOMContentLoaded', () => {
		const parentElem = document.querySelector('.sample');
		const addDelay   = 100; // 表示遅延秒数

		let delay = 0, childNodes = [];

		parentElem.childNodes.forEach(childElem => childNodes.push(childElem));

		childNodes.forEach(childElem => {
			if (childElem.nodeType !== 3) return true;

			childElem.textContent.split('').forEach(char => {
				const charElem = document.createElement('span');
				charElem.innerHTML = char === ' ' ? ' ' : char;
				charElem.classList.add('anim');
				charElem.classList.add('hidden');
				charElem.style.transitionDelay = `${delay}ms`;

				charElem.addEventListener('transitionend', event => {
					if (event.propertyName === 'opacity') return true;
					event.target.replaceWith(event.target.textContent);
				});

				parentElem.insertBefore(charElem, childElem);

				delay += addDelay;
			});

			parentElem.removeChild(childElem);
		});

		setTimeout(() => {
			parentElem.querySelectorAll('.hidden').forEach(charElem => {
				charElem.classList.remove('hidden');
			});
		}, 100);
	});
})();

CSS

.sample span.anim {
	display:inline-block;
	transition:opacity 0.4s ease-out, translate 0.4s ease-out;
}

.sample span.hidden {
	opacity:0;
	translate:0 -1em;
}

ポイント

String.splitメソッドで、引数に空を指定することで、1文字ずつに分割し配列にします。

1つの文字に対してspan要素を囲います。
span要素にはクラス名「anim」と「hidden」を設定し、クラス名「hidden」に対して、CSSで非表示にしておきます。
ここでspan要素のクラス名「hidden」に対して、CSSでopacityプロパティで透明に、translateプロパティで移動開始位置を設定します。

CSSのtransition-delayプロパティで、1文字ずつ100ms遅延を設定していきます。
1文字目は0秒、2文字目は100ミリ秒、3文字目は200ミリ秒という感じで遅延させます。

最後にspan要素のクラス名「hidden」を一斉に削除して表示します。

デモ

Lorem ipsum dolor sit amet, consectetur adipisicing elit.

JavaScript逆引きリファレンス一覧へ戻る