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

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

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

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

jQuery

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

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

Q&A

解決済

1回答

5231閲覧

画面内に要素が入ったら上から順番にクラス名を追加する

groco

総合スコア20

JavaScript

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

jQuery

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

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

0グッド

1クリップ

投稿2017/05/22 17:17

編集2017/06/08 11:20

###前提・実現したいこと

  • ページ内の画像が読み込まれている間はローディングを表示
  • 画像が全て読み込まれたら処理を開始
  • 画面内に対象の要素が入ったら画面の左からフェードインしながら下から上に移動しながら表示
  • 画面途中でリロードした時にすでにスクロールが終わっていて画面から外れている要素にも処理を実行
  • ページ内には画像とテキストが混ざっていて、ページによって画像の数もテキストの数も決まっていない
  • 「jquery-2.2.4.js」を使用

###想定している処理

  • jQuery

画面内に要素が入ったらクラス名「transparent」がある要素にクラス名「fadein」を追加
画像の読み込みが終わったらクラス名「loading」を削除

  • css

「fadein」と「transparent」で動きをつける

###発生している問題

  • 色々なサイトを参考に下記のようにしてみましたが、スクロールを開始するとまだ画面に入っていない要素にもクラス名がついてしまいます
  • 画面途中でリロードしてからスクロールすると画面の外にある「fadein」から順番にクラス名が追加されていき、なかなか画面内の要素にクラス名が追加されません
  • 画像の読み込みが終わったらクラス名「loading」を削除するという処理をどこに入れたら良いかがわからなくなりました

###該当のソースコード

javascript

1$(function() { 2 var images = document.getElementsByTagName('img'); 3 for (var i = 0; i < images.length; i++) { 4 var img = new Image(); 5 img.onload = function() { 6 var transparent = $(".transparent"); 7 $(window).scroll(function(){ 8 var transparentPosition = $(transparent).offset().top - $(window).height(); 9 if ($(window).scrollTop() > transparentPosition + 200) { 10 $.each(transparent, function(index) { 11 $(this).delay(index * 500).queue(function() { 12 $(this).addClass('fadein'); 13 }); 14 }); 15 } 16 }); 17 } 18 img.src = images[i].src; 19 }; 20}); 21

(css下記を基本に複数用意しているので一部を抜粋しています)

css

1.transparent .title { 2 opacity : 0; 3 transform : translate(0, 50px); 4 transition: all 500ms ease-out; 5} 6 7.transparent.fadein .title { 8 opacity : 1; 9 transform : translate(0, 0); 10}

lazysizes.jsやinview.jsなどのプラグインとも組み合わせたりして実現できないかと試してみましたがうまくいきませんでした。

色々と調べてみているのですが、どんどんわからなくなってきてしまいました。。
画像が全て読み込まれてから処理が開始されているかどうかの確認の仕方がわからず、ちゃんとその処理も動いているのかもちょっとわかっていません。
想定している処理がそもそも違うなどもございましたらご指摘いただけると幸いです。
とても初歩的なところもあり恐縮ですが、何卒よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

これで、

画面内に要素が入ったらクラス名「fadein」がある要素にクラス名「transparent」を追加

はできていると思います。

これでどうでしょう?

JavaScript

1$(function() { 2 $(window).on('scroll', function() { 3 var count = 0; // 今回のスクロールで、遅延フェードインした回数 4 var windowY = $(window).scrollTop() + $(window).height(); 5 6 $('.transparent').each(function() { 7 if ($(this).hasClass('fadein')) { 8 return; 9 } 10 11 var diffY = windowY - $(this).offset().top; 12 13 if (diffY > $(this).height()) { 14 // 画像が上すぎるときは、遅延しないでフェードイン 15 $(this).addClass('fadein'); 16 } 17 else if (diffY > 0) { 18 // 遅延フェードインして、次に遅延フェードインする時間を延ばす 19 $(this).delay(count++ * 500).queue(function() { 20 $(this).addClass('fadein'); 21 }); 22 } 23 }); 24 }); 25});

投稿2017/05/22 22:17

編集2017/05/23 14:36
naomi3

総合スコア1105

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

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

groco

2017/05/23 03:57

ご回答くださりありがとうございます! また、すみません、想定している処理のクラス名が逆になっていました。 -- 誤)画面内に要素が入ったらクラス名「fadein」がある要素にクラス名「transparent」を追加 正)画面内に要素が入ったらクラス名「transparent」がある要素にクラス名「fadein」を追加 -- > 画面内に要素が入ったらクラス名「fadein」がある要素にクラス名「transparent」を追加 教えていただいたものに差し替えたところ、無事にこちらの処理ができていました。 スクロールして画面から上に出ている要素にもクラス名が追加されていて期待していた動きでした! リロード時にも処理をさせたかったのと、クラス名をつけるタイミングをずらしたかったので下記にしてみました。 ```javascript $(function() { $(window).on('load scroll', function() { $('.transparent').each(function(index) { var position = $(this).offset().top - $(window).height(); var diff = $(window).scrollTop() - position; if (diff > 0 && ! $(this).hasClass('fadein')) { $(this).delay(index * 150).queue(function() { $(this).addClass('fadein'); }); } }); }); }); ``` > 画面途中でリロードしてからスクロールすると画面の外にある「fadein」から順番にクラス名が追加されていき、なかなか画面内の要素にクラス名が追加されません クラス名が追加されるタイミングをずらしたいのですが、私が追加した書き方だとまた画面外から順番に処理が開始されてしまいこの問題が発生してしまいます。 どのようにしてあげると画面下部でリロードしてもこのような問題が起こらなくなるでしょうか。
naomi3

2017/05/23 12:43

問題がないようで、現象が再現できません。HTMLと画像のサイズを教えてください。
groco

2017/05/24 07:20 編集

現在、テストページで使用している画像は合計で1.1MBです。 HTMLは下記となります。 -- (htmlは削除しました) -- 私が確認した方法を書かせていただきます。 -- 1)フッターまでスクロールしてその場でリロード 2)ページの一番上の「transparent」から「fadein」が追加され、画面に表示されているフッター部分の「transparent」に「fadein」が追加されるのにタイムラグが発生してしまう -- 何卒よろしくお願いいたします。
naomi3

2017/05/24 04:28

コードを修正したので、直っていませんか?
groco

2017/05/24 07:19

修正いただきありがとうございます。 無事に解決いたしました! 何度もご対応くださりありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問