Wednesday, June 15, 2022

Tabbed Panes using HTML, CSS and Javascript

TabbedPane.html

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <title>Tabbed Pane</title>
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <link
      rel="stylesheet"
      type="text/css"
      media="screen"
      href="TabbedPane-styles.css"
    />
    <script defer src="./TabbedPane-script.js"></script>
  </head>
  <body>
    <div class="tabs">
      <div class="tab-header">
        <div class="active">
          <h2>Hyderabad</h2>
        </div>
        <div>
          <h2>Bengaluru</h2>
        </div>
        <div>
          <h2>Chennai</h2>
        </div>
        <div>
          <h2>Mumbai</h2>
        </div>
      </div>
      <div class="tab-indicator"></div>
      <div class="tab-body">
        <div class="active">
          <h2>Welcome to Hyderabad!!</h2>
          <p>
            Hyderabad is famous for Charminar, Golkonda Fort and delicious
            Chicken Biryani!!
          </p>
        </div>
        <div>
          <h2>Welcome to Bengaluru!!</h2>
          <p>Bengaluru is silicon valley of India!!</p>
        </div>
        <div>
          <h2>Welcome to Chennai!!</h2>
          <p>Chennai is known for its Marina Beach!!</p>
        </div>
        <div>
          <h2>Welcome to Mumbai!!</h2>
          <p>Mumbai is home to many billionaires in India!!</p>
        </div>
      </div>
    </div>
  </body>
</html>


TabbedPane-styles.css

* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}

html {
  font-size: 62.5%;
}

body {
  font-family: sans-serif;
  color: #343a40;
  line-height: 1;
  max-width: 120rem;
  padding: 6.4rem 3.2rem 3.2rem;
  margin: 0 auto;
}

.tabs {
  background-color: #ddd;
  border-radius: 5px;
  box-shadow: 0 5px 5px rgba(0, 0, 0, 0.2);
  height: 40rem;
}

.tabs .tab-header {
  height: 6rem;
  display: flex;
  align-items: center;
}

.tabs .tab-header > div {
  width: calc(100% / 4);
  text-align: center;
}

.tab-header h2 {
  font-size: 1.8rem;
  transition: all 0.5s ease-in;
}

.tab-header h2 {
  cursor: pointer;
}

.tab-header .active h2 {
  color: #c25f56;
  font-weight: 600;
  transform: scale(1.1);
}

.tabs .tab-indicator {
  width: calc(100% / 4);
  height: 0.5rem;
  border-radius: 5px;
  background-color: #c25f56;
  position: relative;
/*Refer Javascript-left property works for positioned elements*/
  transition: all 0.5s ease-in;
}

.tabs .tab-body {
  background-color: aquamarine;
  height: 33.5rem;
  padding: 5rem;
  position: relative;
  font-size: 1.4rem;
}

.tabs .tab-body div {
  position: absolute;
  display: none;
  transition: all 0.5s ease-in;
}

.tabs .tab-body .active {
  display: block;
}

.tabs .tab-body h2 {
  font-size: 1.8rem;
  margin-bottom: 1.2rem;
}


TabbedPane-script.js

const headerEl = document.querySelector(".tab-header");
const bodyEl = document.querySelector(".tab-body");

const panes = headerEl.querySelectorAll("div");
const paneBodies = bodyEl.querySelectorAll("div");

const indicatorEl = document.querySelector(".tab-indicator");

for (let i = 0; i < panes.length; i++) {
  panes[i].addEventListener("click", (e) => {
    e.preventDefault();
    if (panes[i] !== headerEl.querySelector(".active")) {
      headerEl.querySelector(".active").classList.remove("active");
      panes[i].classList.add("active");

      bodyEl.querySelector(".active").classList.remove("active");
      paneBodies[i].classList.add("active");

      indicatorEl.style.left = `calc(calc(100%/4)*${i})`;
    }
  });
}


Result





No comments:

Post a Comment