2016-08-13 7 views
0

開始時に表示なしの要素があります。クラスを追加すると、CSSを使用してフェードインされます。ディスプレイのあるCSSアニメーションキーフレームは、フェードインすることはできませんが、フェードアウトはしません。

私はthis tutorialがフェードインに適しているキーフレームを使用していますが、同じ方法でフェードアウトしたい場合、要素はアニメーションなしですぐに非表示になります。

基本的には次のようになります。あなたはdisplayプロパティをアニメーション化または移行することはできません http://codepen.io/MickL/pen/NAopXN

+0

あなたが例でわかるように、私はフェードインのためにそれをアニメーション – Mick

+1

とき。 '.box'セレクタで' display:none'を削除すると、アニメーションはスムーズになりますが、ボックスは崩壊しません。 – sniels

答えて

3

。フェードインが動作する理由とフェードアウトが混乱する理由は、displayopacityの両方を組み合わせたものではありません。

displayプロパティは、.activeが適用されるかどうかによってのみ指定されます。アニメーションは実際には変更されませんが、opacityは期待どおりにアニメートされます。フェードインでは、要素がすぐに表示され、次に要素が透明から不透明に移行することを意味します。フェードアウトでは、エレメントをすぐに非表示にしてから、非表示から非表示に遷移します。

これを解決するにはいくつかの方法がありますが、その種類は状況によって異なります。たとえば、block要素としてそれを残し、それを崩壊させるためにheightプロパティを使用できます。

$('button').on('click', function(e) { 
 
    e.preventDefault(); 
 
    $(this).siblings('.box').toggleClass('active'); 
 
})
@import "bourbon"; 
 
* { 
 
    box-sizing: border-box; 
 
    text-align: center; 
 
} 
 
button { 
 
    margin: 30px 0; 
 
    border: 1px solid #ccc; 
 
    text-align: center; 
 
    padding: 1em; 
 
    background: none; 
 
    box-shadow: none; 
 
} 
 
.box { 
 
    margin: 0 auto; 
 
    width: 80%; 
 
    height: 0; 
 
    display: block; 
 
    line-height: 100px; 
 
    background: #ccc; 
 
    border: 1px solid #444; 
 
    text-align: center; 
 
    opacity: 0; 
 
    animation: FadeOut 1s ease-in-out; 
 
} 
 
.box.active { 
 
    display: block; 
 
    height: initial; 
 
    opacity: 1; 
 
    animation: FadeIn 1s ease-in-out; 
 
} 
 
@keyframes FadeIn { 
 
    0% { 
 
    opacity: 0; 
 
    height: initial; 
 
    } 
 
    100% { 
 
    opacity: 1; 
 
    height: initial; 
 
    } 
 
} 
 
@keyframes FadeOut { 
 
    0% { 
 
    opacity: 1; 
 
    height: initial; 
 
    } 
 
    99% { 
 
    opacity: 0; 
 
    height: initial; 
 
    } 
 
    100% { 
 
    height: 0; 
 
    opacity: 0; 
 
    height: 0; 
 
    } 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div class="col"> 
 
    <button class="toggle-good">Toggle display</button> 
 
    <p class="box good">I move nicely!</p> 
 
    <p>Extra paragraph to show collapse</p> 
 
</div>

+1

ページがロードされたときにフェードアウトアニメーションが表示されるだけです( – Mick

+0

) 'FadeOut'アニメーションを別のクラス(例えば' inactive')に置くことで、それを修正できる可能性があります。必要に応じて2つのクラスを追加して削除します。 –

1

:ここ

.box { 
    display: none; 
    opacity: 0; 
    animation: FadeOut 1s ease-in-out; 

    &.active { 
    display: block; 
    opacity: 1; 
    animation: FadeIn 1s ease-in-out; 
    } 
} 

は "作業" の例です。

注:これはキーフレームアニメーションでは使用できないとは限りませんが、と実際にはと同じではありません。 .activeクラスは即座ので、アニメーションを削除発射する時間がないとデフォルトdisplay:noneは今すぐに適用されているので

あなたCodepenデモが意図したとおりに動作しない理由はあります。

とにかくJqueryを使用しているので、便利な機能を内蔵したfadeToggleがあります。 display:noneがあなたの問題の根本であるアニメーション化しようとすると

$('button').on('click', function(e) { 
 
    e.preventDefault(); 
 
    $(this).siblings('.box').fadeToggle(500); 
 
})
* { 
 
    box-sizing: border-box; 
 
    text-align: center; 
 
} 
 
button { 
 
    margin: 30px 0; 
 
    border: 1px solid #ccc; 
 
    text-align: center; 
 
    padding: 1em; 
 
    background: none; 
 
    box-shadow: none; 
 
} 
 
.box { 
 
    margin: 0 auto; 
 
    width: 80%; 
 
    display: none; 
 
    line-height: 100px; 
 
    background: #ccc; 
 
    border: 1px solid #444; 
 
    text-align: center; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div class="col"> 
 
    <button class="toggle-good">Toggle display</button> 
 
    <p class="box good">I move nicely!</p> 
 
</div>

+0

いいえ、あなたは本当にそうではありませんでした...それはそのように見えるかもしれませんが、アニメーション化できません。あなたはキーフレームでそれを使うことができますが、**即座に 'none'から' block'に切り替わります –

+0

この例では、プレフィックスを使用しませんでした。これは一部のブラウザでは動作しないため、表示されない場合があります。私はプレフィックスを必要としないクロムでテストしました。アニメーションとキーフレームに-moz-を追加すると、それは動作します... – Mick

+0

最新のFirefoxとSafariも動作しています。 – Mick

関連する問題