2016-08-13 45 views
0

我有这对开始显示没有的元素。当我向它添加一个类时,我希望它使用CSS淡入。与显示没有CSS动画关键帧作品淡入,但不是淡出

我发现this tutorial使用的关键帧对淡入淡出效果很好。但是如果我想以同样的方式淡出,元素会立即隐藏并且不会动画。

基本上它看起来是这样的:

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

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

这里是一个 “工作” 的例子: http://codepen.io/MickL/pen/NAopXN

+0

正如你看到的例子,我制作动画的淡入 – Mick

+1

当你。在'.box'选择器中删除'display:none',动画变得平滑,但是框不会折叠。 – sniels

回答

3

试图动画display:none是你的问题的根源。为什么淡入作品和淡出不会在混乱来自同时使用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

唯一的问题是,当页面加载时,我看到fadeout-animation:( – Mick

+0

)通过将'FadeOut'动画放在单独的类上(例如'inactive'),可以解决这个问题。根据需要添加和删除这两个类。 –

1

你不能动画或过渡的显示性能。

注意:这并不是说你不能在关键帧动画中使用它,但这与实际上的动画效果不一样。

为什么你Codepen演示不按预期工作的原因是因为.active类被删除瞬间所以动画出了没有时间和开火默认display:none现在立即生效。

既然你无论如何使用jQuery,有一个内置的功能fadeToggle将做你想做的。

$('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

在我没有使用前缀的例子。这可能在某些浏览器中不起作用,因此您可能看不到它。我在不需要前缀的Chrome中进行测试。如果您将动画和关键帧添加到动画和关键帧中,它将起作用... – Mick

+0

最新的Firefox和Safari也在运行。 – Mick