JSFiddle - React, Tailwind, and code Playground

Show Loading Overlay Based on Clicks

by Hugo Carneiro

HTML

<div class="overlay-panel">

  <div class="widget-screen-loading">
    <div class="spinner-wrapper">
      <div class="spinner-cancel">Cancel</div>
      <div class="spinner-content">
        <span></span>
      </div>
    </div>
  </div>

  <button class="btn btn-default click-me">CLICK ME IF YOU CAN</button>

</div>

CSS

.widget-screen-loading {
  opacity: 0;
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  z-index: 99999;
  background: rgba(0, 0, 0, 0.4);
  pointer-events: none;
  -webkit-transition: all .5s ease;
  transition: all .5s ease;
}

.clicks-disabled .widget-screen-loading {
  pointer-events: all;
}

.clicks-disabled.show-loading .widget-screen-loading {
  opacity: 1;
  pointer-events: all;
}

.widget-screen-loading .spinner-wrapper {
  position: absolute;
  width: 220px;
  height: 80px;
  top: calc(50% - 30px);
  left: calc(50% - 110px);
  background: #FFF;
  border: 1px solid rgba(0, 0, 0, 0.6);
  border-radius: 6px;
  -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);
  box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);
  pointer-events: none;
}

.clicks-disabled.show-loading .widget-screen-loading .spinner-wrapper {
  pointer-events: all;
}

.widget-screen-loading .spinner-wrapper .spinner-cancel {
  position: absolute;
  bottom: 0;
  left: 0;
  right: 0;
  text-align: center;
  padding: 6px 0;
  border-top: 1px solid #d4d4d4;
  border-bottom-left-radius: 6px;
  border-bottom-right-radius: 6px;
  z-index: 1;
  cursor: pointer;
}

.widget-screen-loading .spinner-wrapper .spinner-cancel:hover {
  background-color: #F1F1F1;
}

.widget-screen-loading .spinner-wrapper .spinner-cancel:active {
  background-color: #EAEAEA;
}

.widget-screen-loading .spinner-content {
  position: absolute;
  top: calc(50% - 22px);
  left: calc(50% - 83px);
  width: 167px;
  height: 12px;
  margin: 0 auto;
  background: #4cc2e0;
  border: 1px solid #3c91c4;
  -moz-border-radius: 4px;
  -webkit-border-radius: 4px;
  border-radius: 4px;
}

.widget-screen-loading .spinner-content > span {
  position: absolute;
  display: block;
  height: 100%;
  background-color: #3c91c4;
}

.widget-screen-loading .spinner-content > span {
  animation: animationFrames2 1s infinite linear;
  -webkit-animation: animationFrames2 1s infinite linear;
  -moz-animation: animationFrames2 1s infinite...

JavaScript

$('.click-me').on('click', function() {
  $('.overlay-panel').addClass('clicks-disabled');
  addEvent();
});

$('.spinner-cancel').on('click', function() {
  $('.overlay-panel').removeClass('clicks-disabled show-loading');
});

function addEvent() {
  $('.clicks-disabled .widget-screen-loading').on('click', function() {
    CountFun();
  });
}

var cnt = 0;

function CountFun() {
  cnt = parseInt(cnt) + parseInt(1);
  if (cnt == 3) {
    $('.overlay-panel').addClass('show-loading');
  }
}