最初は文字を全て非表示にしておいて、スクロールしたら1文字ずつ表示というのを今回はご紹介したいと思います。
また今回の実装では『inview.js』というjQueryのプラグインを使うので、『inview.js』の使い方についてはこちらの記事を参照下さい。
inview.jsでスクロールして表示領域に入ったらフェードインさせる方法【jQueryプラグイン】
続きを見る
(有料になっていたらすいません🙇♂️)
inview.jsを使ってスクロールしたら1文字ずつ表示させる方法
早速ですがこちらがデモになります。
See the Pen
スクロールすると1文字ずつ表示 by junpei (@junpei-sugiyama)
on CodePen.
もう一度最初から見たい場合は右下の『Rerun』をクリックして下さい。
冒頭にも書いた『inview.js』は『スクロールして要素が画面内に入ったら◯◯する』というものなので、今回の場合は『スクロールして非表示にしている文字が画面内に入ったら表示する』という形になります。
コード解説
コードを解説します。
まずHTMLはこちらになります。
<p class="text-animation">じゅんぺいブログ</p>
1文字ずつ表示させるために1文字ずつspanタグで囲みますが、それはHTMLではなくjQueryの方でやるので、HTMLはそのままで大丈夫です。
CSSはこちらです。
.text-animation span {
opacity: 0;
}
これはspanタグで囲まれた文字をopacity: 0;
で透明にして見えなくてします(正確には『非表示』ではなく『見えない』になります)
HTMLにはspanタグはないので『??』と思うかも知れませんが、先ほども書いた通りspanタグはjQueryによって囲まれるので大丈夫です。
なぜHTMLで直接spanタグを囲まないのかというと、文字数が増えたりしたら1つずつ囲むのが大変だからです。
そして重要なのがjQueryになります。
$(function () {
$(".text-animation").each(function () {
// 1文字ずつ<span>で囲む
$(this)
.children()
.addBack()
.contents()
.each(function () {
if (this.nodeType == 3) {
$(this).replaceWith(
$(this).text().replace(/(\S)/g, "<span>$1</span>")
);
}
});
// スクロールして要素が画面内に入ったら文字を表示
$(this).on("inview", function () {
// 1文字ずつ順番に表示(不透明にする)
$(this).css({ opacity: 1 });
for (var i = 0; i <= $(this).children("span").length; i++) {
$(this)
.children("span")
.eq(i)
.delay(200 * i) // 文字間の時間
.animate({ opacity: 1 }, 1000); // 全部表示されるまでの時間
}
});
});
});
この中でご自身でカスタマイズする場合は、2行目の文字に対するclass名と、最後の時間の数字になります。
あとはopacity
の部分をanimate()
で使えるプロパティであれば変更可能です(数字で指定できるものだけなので、colorなどは不可)
例えば以下のようにフォントサイズを大きくすることも可能です。
See the Pen
Untitled by junpei (@junpei-sugiyama)
on CodePen.
以上になります。