マークアップ

<div class="js--modal-open" data-target="modal01">クリック1</div>
<div class="js--modal-open" data-target="modal02">クリック2</div>

<!-- data-targetで紐付けた内容 idで管理 -->
<div id="modal01" class="modal js--modal">
  <div class="modal__bg js--modal-close"></div>
  <div class="modal__content">
    <p>1つ目モーダルウィンドウです。</p>
    <div class="modal__close-btn js--modal-close"></div>
  </div>
</div>

<div id="modal02" class="modal js--modal">
  <div class="modal__bg js--modal-close"></div>
  <div class="modal__content">
    <p>2つ目モーダルウィンドウです。</p>
    <div class="modal__close-btn js--modal-close"></div>
  </div>
</div>

js

// modal(写真など)
// ==============================
document.addEventListener("DOMContentLoaded", function () {
  let scrollPosition = 0;

  document.querySelectorAll(".js--modal-open").forEach(button => {
    button.addEventListener("click", function (event) {
      event.preventDefault();
      scrollPosition = window.scrollY;
      document.body.classList.add("fixed");
      document.body.style.top = `-${scrollPosition}px`;

      let targetId = this.dataset.target;
      let modal = document.getElementById(targetId);
      if (modal) {
        modal.classList.add("is--visible");
      }
    });
  });

  document.querySelectorAll(".js--modal-close").forEach(closeButton => {
    closeButton.addEventListener("click", function () {
      document.body.classList.remove("fixed");
      document.body.style.top = "";
      window.scrollTo(0, scrollPosition);

      document.querySelectorAll(".js--modal").forEach(modal => {
        modal.classList.remove("is--visible");
      });
    });
  });
});

SCSS

// モーダルを開いたときのスクロール固定
body.fixed {
  position: fixed;
  width: 100%;
  height: 100%;
  left: 0;
}

// モーダルの基本スタイル
.modal {
  opacity: 0;
  visibility: hidden;
  transition: opacity 0.3s ease, visibility 0.3s ease;
  height: 100vh;
  position: fixed;
  top: 0;
  width: 100%;
  z-index: 99999;
  left: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  
  &.is--visible {
    opacity: 1;
    visibility: visible;
  }
}

// モーダル背景(黒の半透明オーバーレイ)
.modal__bg {
  background: rgba(0, 0, 0, 0.8);
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
}

// モーダルのコンテンツ(ウィンドウ)
.modal__content {
  box-sizing: border-box;
  background: #fff;
  padding: 45px;
  position: relative;
  width: 90%;
  max-width: 113rem;
  max-height: 80vh;
  min-height: 400px;
  border-radius: 8px;
  overflow: auto;
  box-shadow: 0px 4px 10px rgba(0, 0, 0, 0.2);

  // 画面中央に配置
  // transform: translateY(-50%);
  // top: 50%;
}

// 閉じるボタン
.modal__close-btn {
  position: absolute;
  width: 40px;
  height: 40px;
  top: 15px;
  right: 15px;
  cursor: pointer;

  &:before,
  &:after {
    content: "";
    display: block;
    width: 30px;
    height: 2px;
    background: #000;
    position: absolute;
    top: 50%;
    left: 50%;
    transform-origin: center;
  }

  &:before {
    transform: translate(-50%, -50%) rotate(45deg);
  }

  &:after {
    transform: translate(-50%, -50%) rotate(-45deg);
  }

  // ホバー時のスタイル
  &:hover {
    opacity: 0.7;
  }
}