Home > OS >  Activate and Deactivate CSS transitions on click
Activate and Deactivate CSS transitions on click

Time:01-11

I have made a simple sidebar navigation menu with 6 elements. Here is an example of what I want:

  • I click on the 1st element and the menu grows from 2vh to 4vh and changes its color (the transition).
  • Then I click on the 2nd element and the 2nd element grows, while the 1st one shrinks (goes back to it original styling).
  • And then if I click the 2nd element again, I want it to go back to its normal styling too. And so on with the other elements.

function scale() {
  const element = document.getElementById('nav1');
  element.classList.add('navmenu-clicked');
}
.navmenu {
  color: #213362;
  font-size: 2vh;
  position: fixed;
  left: 2%;
  text-decoration: none;
  cursor: default;
  font-family: Arial, Helvetica, sans-serif;
  transition: all 2s;
}

.navmenu-clicked {
  color: red;
  font-size: 4vh;
}

#nav1 {
  top: 30%;
}

#nav2 {
  top: 40%;
}

#nav3 {
  top: 50%;
}

#nav4 {
  top: 60%;
}

#nav5 {
  top: 70%;
}

#nav6 {
  top: 80%;
}

.panel1,
.panel2 {
  height: 100vh;
}

.panel1 {
  background-color: red;
}

.panel2 {
  background-color: blue;
}
<a  id="nav1" href="#" onclick="scale()">menu1</a>
<a  id="nav2" href="#" onclick="scale()">menu2</a>
<a  id="nav3" href="#" onclick="scale()">menu3</a>
<a  id="nav4" href="#" onclick="scale()">menu4</a>
<a  id="nav5" href="#" onclick="scale()">menu5</a>
<a  id="nav6" href="#" onclick="scale()">menu6</a>

I hope I have explained it well.

Thank you!

CodePudding user response:

If I understood correctly you want to highlight only one link at a time, and toggle active link style on click as well. See modified snippet below and my comments in JS snippet. Please note I used event delegation to handle click event which is a standard way to handle such scenarios.

let activeLink = null;
document.body.addEventListener("click", e => {
  // First reset class of current active link (if it's not null)
  if (activeLink) {
    activeLink.classList.remove("navmenu-clicked");
  }

  const link = e.target;
  if (link === activeLink) {
    // Clicked on an active link 
    activeLink = null;
  } else {
    activeLink = link;
    activeLink.classList.add("navmenu-clicked");
  }
});
.navmenu {
  color: #213362;
  font-size: 2vh;
  position: fixed;
  left: 2%;
  text-decoration: none;
  cursor: default;
  font-family: Arial, Helvetica, sans-serif;
  transition: all 2s;
}

.navmenu-clicked {
  color: red;
  font-size: 4vh;
}

#nav1 {
  top: 30%;
}

#nav2 {
  top: 40%;
}

#nav3 {
  top: 50%;
}

#nav4 {
  top: 60%;
}

#nav5 {
  top: 70%;
}

#nav6 {
  top: 80%;
}

.panel1,
.panel2 {
  height: 100vh;
}

.panel1 {
  background-color: red;
}

.panel2 {
  background-color: blue;
}
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8" />
  <meta http-equiv="X-UA-Compatible" content="IE=edge" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <link rel="stylesheet" href="style.css" />
  <title>Document</title>
</head>

<body>
  <a  id="nav1" href="#">menu1</a>
  <a  id="nav2" href="#">menu2</a>
  <a  id="nav3" href="#">menu3</a>
  <a  id="nav4" href="#">menu4</a>
  <a  id="nav5" href="#">menu5</a>
  <a  id="nav6" href="#">menu6</a>
  <script src="app.js"></script>
</body>

</html>

CodePudding user response:

You could pass this into the onclick so you only add / remove the class of the clicked element and use querySelector to remove the clicked class (if it is not the on currently clicked element) - comments in code explaining what is happening

function scale(element) {
  if (element.classList.contains('navmenu-clicked')) {
    // check if clicked element has already been clicked - if so remove class
    element.classList.remove('navmenu-clicked');
  } else {
    const clicked = document.querySelector('.navmenu-clicked');
    if (clicked) {
      // check if there is a clicked element and remove the class if there is
      clicked.classList.remove('navmenu-clicked');
    }

    // add class to clicked element
    element.classList.add('navmenu-clicked');
  }
}
.navmenu {
  color: #213362;
  font-size: 2vh;
  position: fixed;
  left: 2%;
  text-decoration: none;
  cursor: default;
  font-family: Arial, Helvetica, sans-serif;
  transition: all 2s;
}

.navmenu-clicked {
  color: red;
  font-size: 4vh;
}

#nav1 {
  top: 30%;
}

#nav2 {
  top: 40%;
}

#nav3 {
  top: 50%;
}

#nav4 {
  top: 60%;
}

#nav5 {
  top: 70%;
}

#nav6 {
  top: 80%;
}

.panel1,
.panel2 {
  height: 100vh;
}

.panel1 {
  background-color: red;
}

.panel2 {
  background-color: blue;
}
<a  id="nav1" href="#" onclick="scale(this)">menu1</a>
<a  id="nav2" href="#" onclick="scale(this)">menu2</a>
<a  id="nav3" href="#" onclick="scale(this)">menu3</a>
<a  id="nav4" href="#" onclick="scale(this)">menu4</a>
<a  id="nav5" href="#" onclick="scale(this)">menu5</a>
<a  id="nav6" href="#" onclick="scale(this)">menu6</a>

  •  Tags:  
  • Related