<h1>Animate.css modals animations</h1>
<div class="buttons">
  <button class="btn btn--1" data-modal-target="modal-1">fade</button>
  <button class="btn btn--2" data-modal-target="modal-2" data-animations="backInLeft backOutRight">back</button>
  <button class="btn btn--3" data-modal-target="modal-3" data-animations="flipInX flipOutX">flip</button>
  <button class="btn btn--4" data-modal-target="modal-4" data-animations="rollIn rollOut">roll</button>
</div>

<div class="modals">
  <div class="modals__backdrop" data-modal-backdrop></div>
  <div class="modal" data-modal-name="modal-1">
    <button class="modal__close-btn" data-modal-close-btn>X</button>
    <div class="modal__content">1 Lorem ipsum dolor sit amet consectetur adipisicing elit. Esse deserunt cupiditate aperiam repudiandae adipisci doloremque culpa asperiores placeat maxime quia amet error quasi incidunt quam ut ipsam natus, accusamus vel.</div>
  </div>
  <div class="modal" data-modal-name="modal-2">
    <button class="modal__close-btn" data-modal-close-btn>X</button>
    <div class="modal__content">2 Lorem ipsum dolor sit amet consectetur adipisicing elit. Esse deserunt cupiditate aperiam repudiandae adipisci doloremque culpa asperiores placeat maxime quia amet error quasi incidunt quam ut ipsam natus, accusamus vel.</div>
  </div>
  <div class="modal" data-modal-name="modal-3">
    <button class="modal__close-btn" data-modal-close-btn>X</button>
    <div class="modal__content">3 Lorem ipsum dolor sit amet consectetur adipisicing elit. Esse deserunt cupiditate aperiam repudiandae adipisci doloremque culpa asperiores placeat maxime quia amet error quasi incidunt quam ut ipsam natus, accusamus vel.</div>
  </div>
  <div class="modal" data-modal-name="modal-4">
    <button class="modal__close-btn" data-modal-close-btn>X</button>
    <div class="modal__content">4 Lorem ipsum dolor sit amet consectetur adipisicing elit. Esse deserunt cupiditate aperiam repudiandae adipisci doloremque culpa asperiores placeat maxime quia amet error quasi incidunt quam ut ipsam natus, accusamus vel.</div>
  </div>
</div>
@import url("https://fonts.googleapis.com/css?family=Raleway:400,400i,700");

body {
  overflow-x: hidden;
  font: 1rem / 1.5 Raleway, sans-serif;
  background-color: #fce5cd;
}

h1 {
  color: #351c75;
  font-weight: 700;
}

.btn {
  color: #fce5cd;
  font: 1rem / 1.5 Raleway, sans-serif;
  background-color: #ff3c41;
  border: none;
  border-radius: 6px;
  cursor: pointer;
  transition: background-color 200ms;
}

.btn:hover {
  background-color: #8e1c1f;
}

.modals {
  display: none;
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  z-index: 0;
}

.modals--open {
  display: flex;
}

.modals__backdrop {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background-color: #000c;
  z-index: -1;
}

.modal {
  display: none;
  position: relative;
  width: 50%;
  padding: 15px;
  margin: auto;
  text-align: center;
  color: #fce5cd;
  background-color: #351c75;
}

.modal--open {
  display: block;
}

.modal__close-btn {
  position: absolute;
  top: 0;
  right: 0;
}
function initModals(root) {
  const modalsRoot = root;
  const modalsBackdrop = modalsRoot.querySelector('[data-modal-backdrop]');
  
  let openedModal = null;
  let isOpen = false;
  let openAnim, closeAnim;

  function openModal(name) {
    openedModal = modalsRoot.querySelector(`[data-modal-name="${name}"]`);
    if (!openedModal) return;
    
    isOpen = true;
    openedModal.classList.add('modal--open', 'animate__animated', `animate__${openAnim}`);
    modalsRoot.classList.add('modals--open');
    modalsBackdrop.classList.add('animate__animated', 'animate__fadeIn');
  }

  function closeModal() {
    if (!isOpen) return;
    
    isOpen = false;
    openedModal.classList.remove(`animate__${openAnim}`);
    openedModal.classList.add(`animate__${closeAnim}`);

    modalsBackdrop.classList.remove('animate__fadeIn');
    modalsBackdrop.classList.add('animate__fadeOut');

    openedModal.addEventListener('animationend', () => {
      modalsRoot.classList.remove('modals--open');
      openedModal.classList.remove('modal--open', `animate__${closeAnim}`);
      modalsBackdrop.classList.remove('animate__fadeOut');
      openedModal = null;
    }, { once: true });
  }

  function onClick({ target, path }) {
    const openButton = target.closest('[data-modal-target]');

    if (openButton) {
      const animations = openButton.dataset.animations;
      if (animations) {
        [ openAnim = 'fadeIn', closeAnim = 'fadeOut' ] = animations.trim().split(/[\s,]+/);
      }
      else {
        [ openAnim, closeAnim ] = ['fadeIn', 'fadeOut'];
      }

      openModal(openButton.dataset.modalTarget);
    }
    else if (
      target.closest('[data-modal-close-btn]') ||
      path.includes(modalsBackdrop)
    ) {
      closeModal();
    }
  }
  
  document.addEventListener('click', onClick);
}

initModals(document.querySelector('.modals'));

External CSS

  1. https://cdnjs.cloudflare.com/ajax/libs/animate.css/4.1.1/animate.min.css

External JavaScript

This Pen doesn't use any external JavaScript resources.