94

I can make an element with an opacity of zero fade in by changing its class to .elementToFadeInAndOut with the following css:

.elementToFadeInAndOut {
    opacity: 1;
    transition: opacity 2s linear;
}

Is there a way I can make the element fade out after it fades in by editing css for this same class?

TylerH
  • 20,799
  • 66
  • 75
  • 101
user95227
  • 1,853
  • 2
  • 18
  • 36
  • Use the css defined in this link to toggle fadeIn and fadeOut classes for the required element: https://css-tricks.com/snippets/css/toggle-visibility-when-hiding-elements/ – raksheetbhat Feb 28 '19 at 13:45

5 Answers5

162

Use css @keyframes

.elementToFadeInAndOut {
    opacity: 1;
    animation: fade 2s linear;
}


@keyframes fade {
  0%,100% { opacity: 0 }
  50% { opacity: 1 }
}

here is a DEMO

.elementToFadeInAndOut {
    width:200px;
    height: 200px;
    background: red;
    -webkit-animation: fadeinout 4s linear forwards;
    animation: fadeinout 4s linear forwards;
}

@-webkit-keyframes fadeinout {
  0%,100% { opacity: 0; }
  50% { opacity: 1; }
}

@keyframes fadeinout {
  0%,100% { opacity: 0; }
  50% { opacity: 1; }
}
<div class=elementToFadeInAndOut></div>

Reading: Using CSS animations

You can clean the code by doing this:

.elementToFadeInAndOut {
    width:200px;
    height: 200px;
    background: red;
    -webkit-animation: fadeinout 4s linear forwards;
    animation: fadeinout 4s linear forwards;
    opacity: 0;
}

@-webkit-keyframes fadeinout {
  50% { opacity: 1; }
}

@keyframes fadeinout {
  50% { opacity: 1; }
}
<div class=elementToFadeInAndOut></div>
kamal pal
  • 4,187
  • 5
  • 25
  • 40
Gildas.Tambo
  • 22,173
  • 7
  • 50
  • 78
  • 8
    Adding *forwards* keeps the element hidden after the fade finishes its cycle. Awesome. – Womble Jun 01 '18 at 01:54
  • Kindly help on this one pls? https://stackoverflow.com/questions/61203327/css-animation-fadein-fadeout-2-images-continuously – newdeveloper Apr 14 '20 at 08:13
26

If you need a single fadeIn/Out without an explicit user action (like a mouseover/mouseout) you may use a CSS3 animation: http://codepen.io/anon/pen/bdEpwW

.elementToFadeInAndOut {
  animation: fadeInOut 4s linear 1 forwards;
}

@keyframes fadeInOut {
  0% {
    opacity: 0;
  }
  50% {
    opacity: 1;
  }
  100% {
    opacity: 0;
  }
}

By setting animation-fill-mode: forwards the animation will retain its last keyframe

By setting animation-iteration-count: 1 the animation will run just once (change this value if you need to repeat the effect more than once)

Raphaël Balet
  • 6,334
  • 6
  • 41
  • 78
Fabrizio Calderan
  • 120,726
  • 26
  • 164
  • 177
14

I found this link to be useful: css-tricks fade-in fade-out css.

Here's a summary of the csstricks post:

CSS classes:

.m-fadeOut {
  visibility: hidden;
  opacity: 0;
  transition: visibility 0s linear 300ms, opacity 300ms;
}
.m-fadeIn {
  visibility: visible;
  opacity: 1;
  transition: visibility 0s linear 0s, opacity 300ms;
}

In React:

toggle(){
    if(true condition){
        this.setState({toggleClass: "m-fadeIn"});
    }else{
        this.setState({toggleClass: "m-fadeOut"});
    }
}

render(){
    return (<div className={this.state.toggleClass}>Element to be toggled</div>)
}
raksheetbhat
  • 850
  • 2
  • 11
  • 25
4

Try creating a keyframes animation for the opacity attribute of your element:

<style> 
    p {
        animation-name: example;
        animation-duration: 2s;
      }

    @keyframes example {
        from {opacity: 2;}
        to {opacity: 0;}
    }
</style>

<div>
    <p>[Element to fade]</p>
</div>

(You can also set the exact percentages of animations to make it fade in/out. For example, set 0% to 2 opacity, 50% to 0 opacity, and 100% to 2 opacity. A good source for this method is W3Schools @ https://www.w3schools.com/css/tryit.asp?filename=trycss3_animation2 .)

  • This does not *fade* out. – TylerH Mar 02 '20 at 22:24
  • I've removed my downvote, but I don't know if I would call the original post a *mistake*; by changing from `display` (which cannot be animated or transitioned) to `color` (which can be animated/transitioned) [and, just as critically, added a duration], you've *fundamentally changed* the answer. – TylerH Mar 03 '20 at 00:33
0

Try this:

@keyframes animationName {
  0%   { opacity:0; }
  50%  { opacity:1; }
  100% { opacity:0; }
}
@-o-keyframes animationName{
  0%   { opacity:0; }
  50%  { opacity:1; }
  100% { opacity:0; }
}
@-moz-keyframes animationName{
  0%   { opacity:0; }
  50%  { opacity:1; }
  100% { opacity:0; }
}
@-webkit-keyframes animationName{
  0%   { opacity:0; }
  50%  { opacity:1; }
  100% { opacity:0; }
}   
.elementToFadeInAndOut {
   -webkit-animation: animationName 5s infinite;
   -moz-animation: animationName 5s infinite;
   -o-animation: animationName 5s infinite;
    animation: animationName 5s infinite;
}