ノベルティメディア

MEDIA

【2022版/後編】【コピペで使える】スプリットテキストアニメーションの作り方【1文字ずつ文字を動かす】

【2022版/後編】【コピペで使える】スプリットテキストアニメーションの作り方【1文字ずつ文字を動かす】
橋本大地
【2022版/後編】【コピペで使える】スプリットテキストアニメーションの作り方【1文字ずつ文字を動かす】

みなさんこんにちは。エンジニアの橋本です。
今回は以前ご紹介させていただいたスプリットテキストアニメーションの作り方について、2022版として再度ご紹介させていただきたいと思います!
こちらは後編の記事になっているので、前編はこちらから。

こちらのスプリットアニメーションについては、スクロールでクラスを付与するこちらの関数を利用します!
本記事でも解説しますが、詳しくご覧になりたい方は、上記のリンクからご覧ください。

スプリットテキストをスクロールで動かす

表題の通り、前回の状態では、スプリットテキストにアニメーションは加えられても、発火のタイミングは制御できなかったと思います。
ですので、下記のソースを用います。

function targetAddClass(targetName, addClassName) {
    let target = document.querySelectorAll(targetName);
    target.forEach(function(elm) {
        const scriptTime = elm.dataset.scripttime;
        const rect = elm.getBoundingClientRect();
        const scrollTop = window.pageYOffset || document.documentElement.scrollTop;
        const elmPosison = rect.top + scrollTop; 
        const windowHeight = window.innerHeight
        const delayHeightpx = windowHeight * 0.2;

        if (scrollTop > elmPosison - windowHeight + delayHeightpx) {
            let delay = scriptTime ? scriptTime : 0;
            setTimeout(function() {
                elm.classList.add(addClassName);
            }, delay);
        }

    });
}

window.addEventListener('scroll', () => {
    targetAddClass("c-split-up", "is-active");
}

こちらのコードをコピペしていただければOKです!
前回生み出されたスプリットテキスト内のspanタグが持つクラスに対し、is-activeが付与される仕組みになっているので、発火のタイミングが制御できるようになりました。
上記のソースに合わせて、前編でご紹介させていただいた下記のソースを追加しましょう

function splitTextSpan(targetElm, addClass) {
    document.querySelectorAll(targetElm).forEach((splitText) => {
        let arr = splitText.textContent.split('');
        let innerHtmlText = "";
        let count = 0;
        for (let i = 0; i < arr.length; i++) {
            if (!arr[i].match(/\s+/)) {
                let time = splitText.dataset.scripttime;
                if (time) {
                    innerHtmlText += '<span class="' + addClass + '" data-scripttime="' + (time * count) + '">' + arr[i] + '</span>';
                } else {
                    innerHtmlText += '<span class="' + addClass + '">' + arr[i] + '</span>';
                }
                count++;
            }
        }
        splitText.innerHTML = "";
        splitText.innerHTML = innerHtmlText;
        splitText.style.opacity = "1";

    });
}

splitTextSpan('.js-split', "c-split-up");

実際の使い方としては、こんな感じのコンボになります。

splitTextSpan(‘.js-split’, “c-split-up”);
targetAddClass(“c-split-up”, “is-active”);


しかしながらここで問題になるのが、c-spilit-up群に高さが発生している場合です。
【高さが発生】の定義は、単純に縦書きや行落ちなどによって、発火しない位置と発火する位置が生じてしまうことを指します。

応用編:縦書きはどうしよう…

それではしっかり中身を理解したうえで、応用編といきましょう。
用途によっていろいろとソースを変える必要がありますので、必要に応じてご対応いただければと思います!

let addClassArr = document.querySelector(".js-split").querySelectorAll(".c-split-up");

addClassArr.forEach(function(elm) {
        let time = elm.dataset.scripttime;
        if (time) {
            setTimeout(function() {
                elm.classList.add("is-active")
            }, time)
        } else {
            elm.classList.add("is-active")
        }
});

まず、【分解したい文字列の親要素内】に存在する、【分割する文字列に付与する要素】を取得します。
その後、それらにis-activeを付与します。

こちらの動きをjs-splitが画面上に見えた際に発火させれば、高さに関係なくきれいに狙った通りの遅延した動きを実現することが可能になります。

まとめ

今回は特定の要素内の文字列に対し、一文字ずつ区切ってアクションを起こしてみました。
最後だけ少し複雑になってしまいましたが、子要素に対して一気にクラス付与するなどの関数は、また別の機会に個別でご紹介させていただきますね!

それではまた!

この記事をシェアする
橋本大地

橋本大地

Engineer

バックエンドを経てフロントエンドの世界へ 持ち前のポジティブさと細やかさでノベルティを救う☆ 元気の源は愛妻弁当! 乾電池を通勤カバンに常備しているのできっと電池で動いています。

Webプロモーション・業務改善は
ノベルティひとつで完結

はじめての依頼にも
全力でサポートさせていただきます

メールでのお問い合わせ

おすすめ記事/ PICKUP

    記事カテゴリー/ CATEGORY

      Webプロモーションや業務改善・DX化

      企業の課題はノベルティひとつで完結

      ホームページ制作などのWeb制作をはじめ、
      システム開発やマーケティング支援などワンストップで対応
      まずはお気軽にお問い合わせください

      お問い合わせ

      お電話またはメールでお気軽にお問い合わせください。