テキストを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」を一斉に削除して表示します。