JSFiddle - React, Tailwind, and code Playground

HTML

<h1 style="text-align: center;">JavaScript 系列三:練習3 ── modal 互動視窗元件</h1>

<div class="control-btn-group">
  <button class="block-btn" onclick="loginModal()">點我登入帳號</button>
  <button class="block-btn" onclick="postModal()">點我新增貼文</button>
</div>

<div class="modal" id="login-modal">
  <div class="login-modal-div">
    <label for="user">帳號:</label>
    <input type="text" name="user" id="user" placeholder="帳號" required>

    <label for="password">密碼:</label>
    <input type="password" name="password" id="password" placeholder="密碼" required>

    <div class="block-btn-group">
      <button class="block-btn" onclick="">登入</button>
      <button class="block-btn btn-close" onclick="closeWindow()">關閉</button>
    </div>

    <button class="x-btn" onclick="closeWindow()">X</button>
  </div>
</div>

<div class="modal" id="post-modal">
  <div class="post-modal-div">
    <label for="headline">標題:</label>
    <input type="text" name="headline" id="headline" placeholder="標題" required>

    <label for="content">內文:</label>
    <textarea name="content" id="content" placeholder="內文" required></textarea>

    <div class="block-btn-group">
      <button class="block-btn" onclick="">張貼</button>
      <button class="block-btn btn-close" onclick="closeWindow()">關閉</button>
    </div>

    <button class="x-btn" onclick="closeWindow()">X</button>
  </div>
</div>

<div class="lorem">
  <p>假文用來測試有捲軸的狀態下,彈跳視窗是否置中於瀏覽器視窗</p>
  Lorem ipsum dolor sit amet consectetur adipisicing elit. Ducimus corporis quis asperiores voluptatem, fugit
  itaque cum accusantium earum sint, eos, architecto suscipit voluptatum! Vitae, et? Pariatur voluptatem sint
  expedita molestiae!
  Tempore delectus necessitatibus iusto nesciunt et neque iste voluptas porro veniam est quia, error ea fugiat
  similique. Numquam modi exercitationem, cumque eligendi animi quaerat? Saepe necessitatibus fugit minima
  reiciendis ea!
</div>

CSS

* {
  padding: 0;
  margin: 0;
}

body {
  width: 100%;
  height: 100%;
}

.control-btn-group {
  width: 300px;
  margin: 20px auto;
  display: flex;
  justify-content: space-between;
}

.block-btn {
  padding: 5px 10px;
  line-height: 30px;
  font-size: 16px;
  font-weight: 900;
  border-radius: 10px;
  background-color: #aaa;
  border: none;
  color: #000;
  cursor: pointer;
  transition: 0.3s;
}

.block-btn:hover {
  background-color: #000;
  color: #fff;
}

.modal {
  position: fixed;
  top: 0;
  bottom: 0;
  left: 0;
  right: 0;
  background-color: rgba(100, 100, 100, 0.7);
  opacity: 0;
  z-index: -1;
  transition: 0.5s;
}

.modal.active {
  opacity: 1;
  z-index: 1;
}

.modal .login-modal-div,
.modal .post-modal-div {
  position: absolute;
  padding: 20px;
  background-color: #ccc;
  top: 50%;
  left: 50%;
  transform: translateX(-50%) translateY(-50%);
  border-radius: 10px;
}

.modal .login-modal-div {
  width: 300px;
}

.modal .post-modal-div {
  width: 600px;
}

.modal label,
.modal input,
.modal textarea {
  display: block;
  width: 100%;
  box-sizing: border-box;
}

.modal label {
  font-size: 18px;
  font-weight: 900;
}

.modal input,
.modal textarea {
  padding: 5px 10px;
  font-size: 14px;
  line-height: 1.5;
  margin: 5px 0 20px;
}

.modal textarea {
  resize: vertical;
  height: 300px;
}

.modal .block-btn-group {
  display: flex;
  justify-content: space-between;
  align-items: center;
}

.modal .block-btn-group .block-btn {
  width: 45%;
}

.modal .x-btn {
  position: absolute;
  top: 10px;
  right: 10px;
  font-size: 14px;
  width: 20px;
  line-height: 20px;
  box-sizing: border-box;
  font-weight: 900;
  color: #aaa;
  background-color: transparent;
  border: none;
  cursor: pointer;
}

.modal .x-btn:hover {
  color: #000;
}

.lorem {
  font-size: 50px;
  line-height: 2;
  text-align: justify;
}

.lorem p {
  text-align: center;
}

JavaScript

function loginModal() {
  let window = document.querySelector("#login-modal");
  window.classList.add("active");
}

function postModal() {
  let window = document.querySelector("#post-modal");
  window.classList.add("active");
}

function closeWindow() {
  let activeBtn = event.target;
  let window = activeBtn.closest(".modal");
  window.classList.remove("active");
}