スクロールでdivごとにフェードイン+ディレイさせたいが、全てのdivに反映されてしまう
解決済
回答 1
投稿
- 評価
- クリップ 0
- VIEW 2,064
前提・実現したいこと
スクロールでフェードイン+同じdiv(.js-scroll-box)内にあるものはディレイ
というものを、jqueryで実装したかったのですが、
可視領域に入っていないものを含めた全てにクラス付与されてしまい困っています。
「見えているjs-scroll-boxの中の、js-scroll-fadeにクラス付与」という形にすればいいと思うのですが、
どうすればいいでしょうか。
<div class="space"></div>
<div class="box js-scroll-box">
<p class="js-scroll-fade">ダミーテキストダミーテキスト</p>
<p class="js-scroll-fade fade-left">ダミーテキストダミーテキスト</p>
<p class="js-scroll-fade fade-right">ダミーテキストダミーテキスト</p>
</div>
<div class="box js-scroll-box">
<p class="js-scroll-fade">ダミーテキストダミーテキスト</p>
<p class="js-scroll-fade fade-left">ダミーテキストダミーテキスト</p>
<p class="js-scroll-fade fade-right">ダミーテキストダミーテキスト</p>
</div>
.space{
height: 100vh;
}
.box{
background: #ccc;
margin-bottom: 600px;
}
.js-scroll-fade {
position: relative;
opacity: 0;
transform: translate(0, 50px);
transition: all 1.2s ease-out;
}
.js-scroll-fade.fade-right {
transform: translate(50px, 0px);
}
.js-scroll-fade.fade-left {
transform: translate(-50px, 0px);
}
.js-scroll-fade.is-animation{
opacity: 1;
transform: translate(0, 0);
}
(function(){
$(window).scroll(function (){
$('.js-scroll-box').each(function(){
var elemPos = $(this).offset().top;
var scroll = $(window).scrollTop();
var windowHeight = $(window).height();
if (scroll > elemPos - windowHeight + 100){
$('.js-scroll-fade').each(function(i){
$(this).delay(600*i).queue(function() {
$(this).addClass('is-animation').dequeue();
});
});
}
});
});
});
失敗
.js-scroll-boxにクラスをつけて、そのクラスの中のjs-scroll-fadeにクラスを付与しては?と思い試しました。
可視領域に入ってからフェードされるようになったものの、2つ目のboxの開始が遅くなってしまいました(ディレイの関係でしょうか?)
$(function(){
$(window).scroll(function (){
$('.js-scroll-box').each(function(){
var elemPos = $(this).offset().top;
var scroll = $(window).scrollTop();
var windowHeight = $(window).height();
if (scroll > elemPos - windowHeight){
$(this).addClass('js-scroll-box-on');
}
if (scroll > elemPos - windowHeight + 100){
$('.js-scroll-box-on .js-scroll-fade').each(function(i){
$(this).delay(600*i).queue(function() {
$(this).addClass('is-animation').dequeue();
});
});
}
});
});
});
最近使い始めたばかりなのでお見苦しいコードかと思います。すみません。
分かる方がいらっしゃいましたら、よろしくお願いいたします。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+2
指定のスクロール値に来たかどうかの判断をしてる条件式の中が
$('.js-scroll-fade').each()
なっているのですべての「.js-scroll-fade」に対してクラスがついています。
以下のように書き換えてスクロール値に達した「.js-scroll-box」の中の「.js-scroll-fade」
という指定に変えてみてください。
if (scroll > elemPos - windowHeight + 100) {
$(this).find('.js-scroll-fade').each(function (i) {
$(this).delay(600 * i).queue(function () {
$(this).addClass('is-animation').dequeue();
});
});
}
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.19%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2018/07/24 13:11
(this).findは今後も使いどころが多そうに感じましたので、早期に知る事ができて良かったです。
サンプルまでつけてくださり、ありがとうございました。