I have a project I am working on where one div (div1) has a ‘click’ event listener. When it is clicked, I have div1 sliding over to the right using a @keyframes animation. However I also want another div (div2) to fade in while div1 is sliding. To do so I am using another @keyframes animation.
Here is the HTML code:
<div class="div1"> <h3> Important </h3> </div> <div class="div2"> <p> This is the text that I would like to have faded in when div1 is clicked on </p> </div>
There is multiple div1s and multiple div2s but for the sake of simplicity, I just included one set of them. Let me know if you would like to see more code.
Here is the CSS code:
.div1 { /* Style */ display: flex; position: relative; flex-direction: column; /* Dimensions */ width: 17vw; height: 17vw; min-width: 160px; min-height: 160px; max-width: 190px; max-height: 190px; /* Animation */ animation-name: slide; animation-duration: .8s; animation-fill-mode: forwards; animation-timing-function: ease-out; animation-play-state: paused; } @keyframes slide { from { left: 0; } to { left: 75vw; } } .div2 { position: relative; max-width: 70vw; display: none; animation-name: fade; animation-duration: .8s; animation-fill-mode: forwards; animation-delay: .5s; animation-play-state: pause; } @keyframes fade { from { display: none; } to { display: block; } } .run-animation { animation-play-state: running; }
There is more code for styling and such. The run-animation class will be added to both divs when div1 is clicked.
Here is the JavaScript code:
var div1 = document.getElementsByClassName('div1'); for (var i = 0; i < div1.length; i++) { div1[i].addEventListener("click", function() { this.className = "div1 run-animation" var div2= document.getElementsByClassName('div2'); /* I am just selecting the first div2 to change just one */ div2[0].className = "div2 run-animation" }) }
The code does update the class names for both div1, and div2. My problem is that only div1 animates, div2 doesn’t change it just stays (display: none;). How can I solve this problem? Let me know if you need me to elaborate on anything more. Thank You.
Snippet:
var div1 = document.getElementsByClassName('div1'); for (var i = 0; i < div1.length; i++) { div1[i].addEventListener("click", function() { this.classList.add("div1 run-animation") var div2= document.getElementsByClassName('div2'); /* I am just selecting the first div2 to change just one */ div2[0].classList.add("div2 run-animation") }) }
.div1 { /* Style */ display: flex; position: relative; flex-direction: column; /* Dimensions */ width: 17vw; height: 17vw; min-width: 160px; min-height: 160px; max-width: 190px; max-height: 190px; /* Animation */ animation-name: slide; animation-duration: .8s; animation-fill-mode: forwards; animation-timing-function: ease-out; animation-play-state: paused; } @keyframes slide { from { left: 0; } to { left: 75vw; } } .div2 { position: relative; max-width: 70vw; display: none; animation-name: fade; animation-duration: .8s; animation-fill-mode: forwards; animation-delay: .5s; animation-play-state: pause; } @keyframes fade { from { display: none; } to { display: block; } } .run-animation { animation-play-state: running; }
<div class="div1"> <h3> Important </h3> </div> <div class="div2"> <p> This is the text that I would like to have faded in when div1 is clicked on </p> </div>
Advertisement
Answer
So i added another class and added some effects into the animation for div2. Also changed direct class injection to classList, code is commented with the changes.
var div1 = document.getElementsByClassName('div1'); for (var i = 0; i < div1.length; i++) { div1[i].addEventListener("click", function() { this.classList.add("div1", "run-animation"); var div2= document.getElementsByClassName('div2'); /* I am just selecting the first div2 to change just one */ /*i highly recommend using classlist instead of injecting classes directly*/ div2[0].classList.remove( "hidden"); div2[0].classList.add("div2", "run-animation"); }) }
.div1 { /* Style */ display: flex; position: relative; flex-direction: column; /* Dimensions */ width: 17vw; height: 17vw; min-width: 160px; min-height: 160px; max-width: 190px; max-height: 190px; /* Animation */ animation-name: slide; animation-duration: .8s; animation-fill-mode: forwards; animation-timing-function: ease-out; animation-play-state: paused; } @keyframes slide { from { left: 0; } to { left: 75vw; } } .div2 { position: relative; max-width: 70vw; animation-name: fade; animation-duration: 2s; animation-fill-mode: forwards; animation-delay: .2s; transition: opacity 0.5s; opacity: 0;/*new for fade in*/ } /*new*/ .hidden { display: none; animation-play-state: paused; } @keyframes fade { from { display: none; /*new for fade-in*/ opacity: 0; } to { display: block; /*new for fade-in*/ opacity: 1; } } .run-animation { animation-play-state: running; }
<div class="div1"> <h3> Important </h3> </div> <div class="div2 hidden"> <p> This is the text that I would like to have faded in when div1 is clicked on </p> </div>