<div id="container" class="fx fx-gap">
  <div class="btn active"></div>
  <div class="btn"></div>
  <div class="btn"></div>
  <div class="btn"></div>
</div>
body {
  height: 100%;
  margin: 0;
  user-select: none;
  -webkit-tap-highlight-color: transparent;
  background-color: #e91e63;
}

.fx {
  display: flex;
}

.fx-gap {
  gap: 18px;
}

#container {
  position: absolute;
  top: 50%;
  right: 0;
  left: 0;
  width: 180px;
  height: 20px;
  margin: 0 auto;
  transform: translateY(-50%);
}

.btn {
  width: 20px;
  height: 20px;
  background-color: #fff;
  border-radius: 20px;
  cursor: pointer;
  transition: 0.3s ease width;
}

.btn.active {
  width: 60px;
  cursor: auto;
}
let containerElm = null;

function switchToNext(evt) {
  const { target } = evt;
  if (!target.classList.contains("btn")) {
    return;
  }
  const clickedBtn = target;
  if (clickedBtn.classList.contains("active")) {
    return;
  }

  const activeBtn = containerElm.getElementsByClassName("active")[0];
  activeBtn?.classList.remove("active");
  clickedBtn.classList.add("active");
}

document.addEventListener("DOMContentLoaded", () => {
  containerElm = document.getElementById("container");
  containerElm.addEventListener("click", switchToNext);
});

External CSS

This Pen doesn't use any external CSS resources.

External JavaScript

This Pen doesn't use any external JavaScript resources.