##制作しているもの
画面内に入ると.fadein_ti h2に.fadeinクラスが追加され、そのテキストが1文字ずつ表示されるものを制作しています。
##つまづいている場所
1文字ずつ表示されたのを確認し、別の場所へスクロールしてからもう一度戻るとアニメーションがリピートされます。
一度追加された.fadeinをremoveClassで削除し試してみましたがダメでした。
##実装したいこと
①画面内に入ると.fadein_ti h2に.fadeinクラスが追加される
②その追加されたテキストが1文字ずつ表示される
③そのページに居る限り一度1文字ずつ表示されたものは、スクロールされても表示されたままで見える
↓現在のコードです。
jsfiddle
https://jsfiddle.net/beap532c/1/
HTML
1<p>下にスクロール↓</p> 2<div id="wrap"> 3<div class="fadein_ti"> 4 <h2><span>画面内にはいると</span><br /> 5 <span>テキストが1文字ずつ表示される</span></h2> 6</div> 7</div>
javascript
1$(window).scroll(function() { 2 var windowH = $(window).height(), 3 scrollY = $(window).scrollTop(); 4 5 $('.fadein_ti h2').each(function() { 6 var elPosition = $(this).offset().top; 7 if (scrollY > elPosition - windowH) { 8 $(this).addClass("fadein"); 9 10 //text fadein 11 var DELAY_SPEED = 70;//文字が流れる速さ 12 var FADE_SPEED = 500;//表示のアニメーション時間 13 var str = []; 14 15 $('.fadein > span').each(function(i){//セレクタで指定した要素すべて 16 $(this).css('opacity','1');//行を不透明にする 17 str[i] = $(this).text();//元のテキストをコピーし 18 $(this).text('');//テキストを消す 19 var no = i; 20 var self = this; 21 var interval = setInterval(function(){//50ミリ秒毎にチェック 22 if(no == 0 || $('.fadein > span').eq(no - 1).children('span:last').css('opacity') == 1){//最初の行または前の行が全文字表示された時 23 clearInterval(interval);//チェックを停止 24 for (var j = 0; j < str[no].length; j++) { 25 $(self).append('<span>'+str[no].substr(j, 1)+'</span>');//1文字ずつ<span>を付けて 26 $(self).children('span:last').delay(DELAY_SPEED * j).animate({opacity:'1'}, FADE_SPEED);//時間差でフェードインさせる 27 } 28 } 29 }, 50); 30 }); 31 } 32 }); 33});
css
1#wrap{ 2 margin-top:500px; 3} 4.fadein span{ 5 opacity:0; 6}
コードを見ていただいて
ここが間違っているからリピートされるのかご指導いただければと思います。
お分かりになられる方、よろしくお願いします。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/04/11 06:24
2019/04/11 06:25
2019/04/11 06:31
2019/04/11 06:34
2019/04/11 06:36