質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

3回答

346閲覧

テキストを1文字ずつ表示する時にリピートしてしまう問題

satoshickkk

総合スコア53

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

1クリップ

投稿2019/04/11 03:58

##制作しているもの
画面内に入ると.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}

コードを見ていただいて
ここが間違っているからリピートされるのかご指導いただければと思います。
お分かりになられる方、よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

イベントのトリガーがscrollになっているからですね。
グローバルスコープにフラグ用の変数を用意しておいて分岐かけてはどうでしょうか

投稿2019/04/11 04:23

編集2019/04/11 04:41
m.ts10806

総合スコア80850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

satoshickkk

2019/04/11 06:24

mts10806様、ご回答ありがとうございます。 なるほど…トリガーがscrollになっていることによって スクロールがその位置まで来ないとアニメーションが開始されないし 開始されても別の場所へ動くとアニメーションが1からになってしまうのですね。 「グローバルスコープにフラグ用の変数を用意しておいて分岐かけてはどうでしょうか。」 の部分をもう少し詳しくお聞きしたいのですが 詳しい記事などもし把握されていましたら是非教えていただきたいです。
m.ts10806

2019/04/11 06:25

実は回答文最後の「。」はフォークしたコードのリンクになってたりします。
satoshickkk

2019/04/11 06:31

申し訳ございません!全く気づきませんでした。。 わたしが求めていた動きそのもので感激いたしました。 自分の書いたコードとmts10806様のコードを見比べて違う部分をより詳しく調べたいと思います。 ありがとうございます!
m.ts10806

2019/04/11 06:34

あえて気づきにくくしました(1つの”解答”コードなので) やり方はたくさんあって実現方法は1つではありません。私のやり方はいわば後付けです。今の処理に追加したやり方です。 そもそも組み込み方を見直すやり方もありますので、そのあたりは色々試してみてください。
satoshickkk

2019/04/11 06:36

他の方の回答も見て思いましたが同じ動きをさせるのに 人それぞれで考え方もコードも変わってくることを学びました。 このあたりの分岐でいつもつまづいているのでより勉強したいと思います。 ありがとうございました。
guest

0

.fadeinを付与する時に違うクラスも付けて、
中断させておくのはどうでしょうか?

js

1if ($('.fadein').hasClass('show')) { 2 return; 3 } 4$(this).addClass("fadein show"); 5

投稿2019/04/11 04:54

akihiro3

総合スコア955

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

satoshickkk

2019/04/11 06:27

akihiro3様、ありがとうございます。 「違うクラスも付けて」とありますが いまfadeinをつけている→「$(this).addClass("fadein");」この部分を 教えていただいたコードに置き換えて中断させる感じでしょうか?
guest

0

スクロール後fadeinクラスをつけていますが、最初からfadeinをつけておいて
表示が終わった時点でfadeinをはずしてやったらどうでしょう?

投稿2019/04/11 04:47

yambejp

総合スコア114784

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

satoshickkk

2019/04/11 06:17

この前に試したのは、yambejp様のおっしゃる最初からfadeinを付けるものでしたが 最初からfadeinを付けておくとスクロールする前にアニメーションが終わってしまっていたので 今回後からクラスを渡すやり方を選択しました。 最初からクラスを渡す記述の場所が間違えているので スクロールする前にアニメーションが終わってしまうのでしょうか…? お時間あれば教えていただきたいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問