2016-07-13 20 views
3

slidetoggleslideDownを使用してdiv要素の表示/非表示を試みています。その完璧に動作します。 今私がしようとしているのは、表示されているdivのみに対してaddClass 'visible-divs'と表示され、非表示になるときはremoveClassになります。jqueryクラスの追加と削除

問題は、クラスが正常に追加されましたが、そのクラスを非表示にする場合は、クラスslides upを削除しません。私は間違って何をしていますか?これが機能するために

$(".OffersContainer > div:gt(0)").hide(); 
 
    
 
$(".OffersContainer > span").click(function() { 
 
    this.clickCount = (this.clickCount || 0) + 1 
 
    var command = this.clickCount % 3 === 0 ? 'slideToggle' : 'slideDown'; 
 
    $(this).siblings(this.clickCount % 3 === 1 ? "div:lt(3)" : "div:gt(0)")[command](); 
 
    $('.pan-box').filter(':visible').addClass("visible-divs"); 
 
    $('.pan-box').filter(':hidden').removeClass("visible-divs"); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div class="OffersContainer"> 
 
    <div class='pan-box'>A</div> 
 
    <div class='pan-box'>B</div> 
 
    <div class='pan-box'>C</div> 
 
    <div class='pan-box'>D</div> 
 
    <div class='pan-box'>E</div> 
 
    <span>Show more</span> 
 
</div>

+1

OP – guradio

答えて

4

あなたはアニメーションが完了した後に:visible/:hidden要素を選択する必要があります。これを行うには、コールバック関数のパラメータを使用します。余談として

$(".OffersContainer > span").click(function() { 
    this.clickCount = (this.clickCount || 0) + 1 
    var command = this.clickCount % 3 === 0 ? 'slideToggle' : 'slideDown'; 
    $(this).siblings(this.clickCount % 3 === 1 ? "div:lt(3)" : "div:gt(0)")[command](function() { 
     $('.pan-box').filter(':visible').addClass("visible-divs"); 
     $('.pan-box').filter(':hidden').removeClass("visible-divs"); 
    }); 
}); 

Updated fiddle

を、隠し要素にクラスを変更する点は何ですか?定義により、その効果は見られません。

+0

に関連するコードを追加してください。私のコードの後半で、クラス 'visible-divs 'を持つdivにロジックを適用しました。したがって、divが非表示になったら、このクラスを取り除く必要があります。 –

+0

まさに私の主張は、クラス属性の状態を維持する代わりに ':visible'を使うことだけです。 –

+0

彼はアニメーションの前にクラスを追加/削除することもできます。それ以外の場合は、コールバック関数内にすべての受信コードを配置する必要があります。 – skobaljic

0

どのようなオプションを隠すか表示するかを既に知っているので、このコードを使用するよりも、アニメーションが終了するのを待たずに待つ必要がある場合は、:hiddenセレクタだけを使用することができます:JSFiddle playgroundにも

$(".OffersContainer > div:gt(0)").hide(); 
 
$(".OffersContainer > span").click(function() { 
 
    this.clickCount = (this.clickCount || 0) + 1 
 
    var command = this.clickCount % 3 === 0 ? 'slideToggle' : 'slideDown'; 
 
    $(this).siblings(this.clickCount % 3 === 1 ? "div:lt(3)" : "div:gt(0)")[command](); 
 
    console.log(this.clickCount % 3 * 3 - 1); 
 
    $('.pan-box:lt(' + (this.clickCount % 3 * 3) + ')').addClass("visible-divs"); 
 
    $('.pan-box:gt(' + (this.clickCount % 3 * 3) + ')').removeClass("visible-divs"); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div class="OffersContainer"> 
 
    <div class='pan-box'>A</div> 
 
    <div class='pan-box'>B</div> 
 
    <div class='pan-box'>C</div> 
 
    <div class='pan-box'>D</div> 
 
    <div class='pan-box'>E</div> 
 
    <span>Show more</span> 
 
</div>

関連する問題