Blog

No library HTML+CSS+JS Confirm Dialog

Made an HTML+CSS+JS (JavaScript) confirm dialog today without using any external library. No jQuery!

HTML:

<a class="button button-success btn-show-confirm">Show confirm</a>
<div class="confirm dummy">
  <div class="contents">
    <div class="title">Confirm Message</div>
    <div class="message">Are you sure?</div>
    <div class="buttons">
      <a class="button button-success btn-yes">Yes</a>
      <a class="button button-danger btn-no">No</a>
      <a class="button btn-cancel">Cancel</a>
    </div>
  </div>
</div>

CSS:

@import url('https://fonts.googleapis.com/css2?family=Roboto&display=swap');
body {
  margin: 0px;
  padding: 0px;
  font-size: 14px;
  font-family: 'Roboto', sans-serif;
  color: #333;
}
.dummy {
  display: none;
}
.confirm {
  position: fixed;
  left: 0%;
  top: 0%;
  width: 100%;
  height: 100%;
  background-color: rgba(255, 255, 255, 0.7);
  opacity: 0;
  transition: opacity 0.5s;
  pointer-events: none;
}
.confirm .contents {
  display: block;
  height: auto;
  position: absolute;
  left: 50%;
  top: 50%;
  transform: translateX(-50%) translateY(-50%);
  background-color: rgba(234, 234, 234, 1);
  padding: 20px;
  border-radius: 5px;
  min-width: 350px;
}
.confirm .title {
  font-size: 1.2em;
  padding-bottom: 10px;
}
.confirm .message {
  padding-bottom: 20px;
}
.confirm .buttons {
  padding: 0px;
}
.buttons {
  padding: 10px;
}
.button {
  background-color: rgba(234, 234, 234, 0.5);
  padding: 5px;
  border-radius: 5px;
  cursor: pointer;
  transition: background-color 0.5s, color 0.4s;
  user-select: none;
  outline: none;
}
.button:hover {
  background-color: rgba(234, 234, 234, 1);
}
.button-success {
  background-color: rgba(48, 166, 74, 0.5);
  color: #333;
}
.button-success:hover {
  background-color: rgba(48, 166, 74, 1);
  color: #fff;
}
.button-danger {
  background-color: rgba(216, 58, 77, 0.5);
  color: #333;
}
.button-danger:hover {
  background-color: rgba(216, 58, 77, 1);
  color: #fff;
}
.btn-show-confirm {
  position: absolute;
  left: 50%;
  top: 50%;
  transform: translateX(-50%) translateY(-50%);
}

JS:

var confirm = function(title, message, yes, no, cancel) {
  var confirm = {
    element: document.querySelector(".confirm").cloneNode(true),
    title: title,
    message: message,
    yes: yes,
    no: no,
    cancel: cancel,
    show: function() {
      confirm.element.className = confirm.element.className.split("dummy").join("");
      confirm.element.querySelector(".title").innerHTML = title;
      confirm.element.querySelector(".message").innerHTML = message;
      confirm.element.querySelector(".btn-yes").addEventListener("click", function() {
        if (typeof yes !== "undefined") yes();
        confirm.element.style.opacity = 0;
        confirm.element.style.pointerEvents = "none";
      });
      confirm.element.querySelector(".btn-no").addEventListener("click", function() {
        if (typeof no !== "undefined") no();
        confirm.element.style.opacity = 0;
        confirm.element.style.pointerEvents = "none";
      });
      confirm.element.querySelector(".btn-cancel").addEventListener("click", function() {
        if (typeof cancel !== "undefined") cancel();
        confirm.element.style.opacity = 0;
        confirm.element.style.pointerEvents = "none";
      });
      document.querySelector("body").appendChild(confirm.element);
      confirm.element.style.opacity = 1;
      confirm.element.style.pointerEvents = "auto";
    },
    hide: function() {
      confirm.element.style.opacity = 0;
      confirm.element.style.pointerEvents = "none";
    }
  };
  confirm.show();
  return confirm;
};
document.querySelector(".btn-show-confirm").addEventListener("click", function() {
  confirm("Title", "Are you sure?", function() {
    console.log("yes");
  }, function() {
    console.log("no");
  }, function() {
    console.log("cancel");
  });
});

CodePen Preview:

See the Pen
No library HTML+CSS+JS Confirm Dialog
by Animated Creativity (@animatedcreativity)
on CodePen.

Hope it helps someone!

Leave a Reply

Your email address will not be published. Required fields are marked *