###前提・実現したいこと
jQueryを用いて「スクロールして画面内に対象の要素が入ったら順番にフェードインさせる」処理を書きました。
2回目以降も、綺麗に左から順番にフェードインするようにしたいです。
###発生している問題・エラーメッセージ
スクロールをして最初に対象の要素が画面内に入ったとき、期待通りに左から順番にフェードインします。
しかし、ある程度上までスクロールして戻り、再度下にスクロールしていくと今度は順番通りにフェードインせず、バラバラです。
1個目の要素がフェードインしなかったり、4個目より5個目の方が早くフェードインしたり。
###該当のソースコード
HTML
1<div id="contents"> 2 <div id="box1">Box1</div> 3 <ul id="list"> 4 <li>AAA</li> 5 <li>BBB</li> 6 <li>CCC</li> 7 <li>DDD</li> 8 <li>EEE</li> 9 </ul> 10 <div id="box2">Box2</div> 11</div>
CSS
1* { 2 margin: 0; 3 padding: 0; 4} 5 6#box1 { 7 height: 1000px; 8 background: #ccc; 9} 10 11#box2 { 12 height: 500px; 13 background: #ccc; 14} 15 16#list { 17 list-style: none; 18 overflow: hidden; 19} 20 21#list li { 22 width: 20%; 23 height: 100px; 24 border: 1px solid #333; 25 float: left; 26 box-sizing: border-box; 27} 28 29.fadeUpOrder { 30 position: relative; 31 bottom: -100px; 32 opacity: 0; 33 transition: all .5s; 34} 35 36.fadeUpOrder.active { 37 bottom: 0; 38 opacity: 1; 39}
JavaScript
1$(function(){ 2 $('#list li').addClass('fadeUpOrder'); 3 var elem = $('.fadeUpOrder'); 4 5 $(window).on('scroll', function(){ 6 var scr = $(window).scrollTop(); 7 var winHeight = $(window).height(); 8 elem.each(function(i){ 9 if(scr + winHeight > $(this).offset().top + 100){ 10 $(this).delay(i * 100).queue(function(){ 11 $(this).addClass('active').dequeue(); 12 }); 13 }else{ 14 $(this).removeClass('active'); 15 } 16 }); 17 }); 18});
状況が再現できるコード
https://jsfiddle.net/5Lnnpnhq/1/
###試したこと
開発者ツールで対象の要素のクラスの付与状態がどうなっているか監視しました。
スクロールして戻った際、画面外にも関わらずactiveクラスがついている場合があります。
.queue()を使っているせいだと思うのですが、どのように対処したらいいかがわかりません。
###補足情報(言語/FW/ツール等のバージョンなど)
jQuery 3.2.1

回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/10/19 08:06