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

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

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

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

jQuery

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

CSS

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

Q&A

1回答

429閲覧

同じクラス名の要素を上からスクロールして表示された分だけアニメーションを効かせたい

of_the_europa

総合スコア11

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

jQuery

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

CSS

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

0グッド

0クリップ

投稿2022/08/07 04:18

該当の要素までスクロールすると青い帯のようなものが横からにゅーっと出てくるアニメーションを実装させたいのですが、同じクラス名で指定しているためか最初のアニメーションが実行されると、下にある同じクラスの要素もスクロールを待たずに一緒に実行されてしまいます。
cssで.one_postというクラスが縦にいくつも並んでいて、アニメーションはその中のnth-of-type(4n+1)ずつ、それぞれスクロールするごとに動作させることになっています。

<script> jQuery(function(){ let blue_band = $('.one_post:nth-of-type(4n+1)'); let blue_top = blue_band.offset().top; let blueBand = "blueBand_"; // 疑似要素のスタイルをまるっと指定する let blue_css = ` .one_post:nth-of-type(4n+1)::before{ position: absolute; content: ""; display: inline-block; background: #6CA5E8 repeat-x; border-radius: 128px 0 0 128px; top: 0; width: 100%; height: 256px; z-index: 1; animation: slideIn 1.5s ease-in-out forwards; } @keyframes slideIn { 0%{ transform: translateX(95vw); opacity: 1; } 100%{ transform: translateX(2vw); opacity: 1; } }`; // styleタグにblue_cssの記述をセットする let style = $('<style>'); style.text(blue_css); $(window).scroll(function(){ for(let i = 1; i <= blue_band.length; i++){ let b_subject = blue_band.attr("id", blueBand+i); let scroll = $(window).scrollTop(); let windowHeight = $(window).height(); let b_top = b_subject.scrollTop(); if(scroll >= b_top - windowHeight){ $('body').append(style); } } }); });

最初、eachで試して一緒に実行されてしまったので、次に上記のfor文でidにそれぞれの数字を加えてみたのですが、結局同じ数字になってしまってアニメーションもやはり同じタイミングで動作してしまいました。
本当ならblue_band.attr("id", blueBand+i);のところをblue_band[i].attr("id", blueBand+i);としたかったのですが、「 TypeError: blue_band[i].attr is not a function 」とエラーになってしまったので、今は[i]を外しています。

こういったjqueryの個別の処理に対して、詰まることが多いように実感しております。
どうかお力をいただきたく、何卒宜しくお願い致します。

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

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

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

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

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

guest

回答1

0

.each()を試してみてはどうでしょうか。
.each() | jQuery API Documentation


コメントを受けて追記

 どうやら、「idが同じ数字になってしまう」ということは問題ではなかったようなので、スクロールエフェクトに関する一般論的な回答を追記します。

 Intersection Observer を利用するのが楽だと思います。
JSでのスクロール連動エフェクトにはIntersection Observerが便利 - ICS MEDIA


 なお、スタイルを変更するのにstyle要素を差し込むのはやめた方がいいかと思います。

 以下の記事が参考になると思います。
スタイルとクラス

投稿2022/08/08 00:56

編集2022/08/08 04:44
Lhankor_Mhy

総合スコア36117

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

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

of_the_europa

2022/08/08 03:51

ご対応ありがとうございます。 each()に変更してみましたが、自分の書き方が悪いのか、現状は変わりませんでした。 function moveAnime(b_top){ blue_band.each(function(i){ let scroll = $(window).scrollTop(); let windowHeight = $(window).height(); if(scroll >= b_top - windowHeight){ $('body').append(style); } }); } $(window).scroll(function(){ moveAnime(blue_top); }); 引数のインデックスをうまく使いたかったのですが、$(this).eq(i).offset().top;などとすると、タイプエラーが発生するので諦めました。
Lhankor_Mhy

2022/08/08 04:16 編集

ご質問は「idが同じ数字になってしまう」というものではなかったのですか……?
of_the_europa

2022/08/08 04:39

失礼いたしました。 function moveAnime(){ blue_band.each(function(i){ let b_subject = $(this).attr("id", blueBand+i); let scroll = $(window).scrollTop(); let windowHeight = $(window).height(); let b_top = b_subject.offset().top; if(scroll >= b_top - windowHeight){ $('body').append(style); } }); $(window).scroll(function(){ moveAnime(); }); とりあえずはこれで、idにそれぞれのインデックスを持たせることができました。 しかし、スクロールすると最初の要素に合わせて、次の要素も同時に動作するのは変わらないようです。 id付与じゃなくても、スクロールでなにか動作を切り分ける方法はないでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問