You are correct in thinking that display
is not animatable. It won't work, and you shouldn't bother including it in keyframe animations.
visibility
is technically animatable, but in a round about way. You need to hold the property for as long as needed, then snap to the new value. visibility
doesn't tween between keyframes, it just steps harshly.
.ele {_x000D_
width: 60px;_x000D_
height: 60px;_x000D_
_x000D_
background-color: #ff6699;_x000D_
animation: 1s fadeIn;_x000D_
animation-fill-mode: forwards;_x000D_
_x000D_
visibility: hidden;_x000D_
}_x000D_
_x000D_
.ele:hover {_x000D_
background-color: #123;_x000D_
}_x000D_
_x000D_
@keyframes fadeIn {_x000D_
99% {_x000D_
visibility: hidden;_x000D_
}_x000D_
100% {_x000D_
visibility: visible;_x000D_
}_x000D_
}
_x000D_
<div class="ele"></div>
_x000D_
If you want to fade, you use opacity
. If you include a delay, you'll need visibility
as well, to stop the user from interacting with the element while it's not visible.
.ele {_x000D_
width: 60px;_x000D_
height: 60px;_x000D_
_x000D_
background-color: #ff6699;_x000D_
animation: 1s fadeIn;_x000D_
animation-fill-mode: forwards;_x000D_
_x000D_
visibility: hidden;_x000D_
}_x000D_
_x000D_
.ele:hover {_x000D_
background-color: #123;_x000D_
}_x000D_
_x000D_
@keyframes fadeIn {_x000D_
0% {_x000D_
opacity: 0;_x000D_
}_x000D_
100% {_x000D_
visibility: visible;_x000D_
opacity: 1;_x000D_
}_x000D_
}
_x000D_
<div class="ele"></div>
_x000D_
Both examples use animation-fill-mode
, which can hold an element's visual state after an animation ends.