簡単。
完成イメージ
WEBサイトのキャンペーンページとかでたまにあるやつ。
ページを読み込んだ際に一文字ずつフェードインする、いっぱいついてるとまだるっこいアレ。
構築の考え方
フェードインはcssで仕込む。フェードインの前と後のstyleをclassの付与で切り替える。
フェードインのタイミングはjs(jQuery)で仕込む。一定スパンでclassを付与していく。
animateを個別に作ればcssで完結できるけど、一文字ずつ設定しなきゃいけないので組むのがめんどくさいし、増減したときもめんどくさい。だから発火のタイミングはjsでやっていこうって感じ。
<div class="target"><span>あ</span><span>あ</span><span>あ</span><span>あ</span><span>あ</span><span>あ</span></div>
一文字ずつフェードインするから文字をそれぞれ拾えるようにタグで分ける。eachで回して順番にspanを拾って、classを付けていく。
やっていく
手打ちはだるいんで、これもjsでやったらいいんじゃんね。
HTMLでこういうのがあったとして。
<div class="target">ああああああ</div>
CSSをこんな感じにする。
.target span{
display: inline-block;
position: relative;
top: 20px;
opacity: 0;
transition: top .4s ease, opacity .4s ease;
}
.target span.active{
top: 0;
opacity: 1;
}
指定要素内の文字列を<span>で区切る。こう、というかこちらのまんま。
$('.target').each(function() {
var content = $(this).html();
var trimText = $.trim(content);
var newText = "";
trimText.split("").forEach(function(e) {
if(e == ' '){
// 空白対策
newText += '<span> </span>';
} else {
newText += '<span>' + e + '</span>';
}
});
$(this).html(newText);
});
で、こう。
var delayTime = 2000;
$('.target').find('span').each(function(){
$(this).delay(delayTime).queue(function(){
$(this).addClass('active');
})
delayTime = delayTime + 100;
})
最初の2000は表示するまでのディレイで、後にある100は文字ごとのディレイ。一定間隔でclassを付与するようになる。
なんでjsを分けて書いてあるかは、次の内容にかかわる話。
<span>で区切る方法について
上記の方法だと一部の状況で難点がある。
js側で文字を<span>区切りにするから楽なんだけど、テキスト内にHTMLタグがあった場合、それも一文字ずつ区切られるのでタグとして成り立たなくなる。
だから、単純にテキスト情報だけを入れるならjsで自動化すればいいけど、中で改行したいとかになった場合、<span>の挿入は手打ちにしたほうがいい。
ネックになる部分
.delay()を使用する場合、そのまま.addClass()とかをつなげても動かない。
今回は.queue()をかませることで動くというケース。
コメント