Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Modal not closing with button

I have the following dialog:

const gridContainer = document.querySelector(".grid-container");
const addBookBtn = document.querySelector("#add-book-btn");
const dialog = document.querySelector("dialog");
const dialogCloseBtn = document.querySelector("#dialog-close-btn")
addBookBtn.addEventListener('click', () => dialog.showModal());
dialogCloseBtn.addEventListener('click', () => dialog.close());
body {
    margin: 0;
    font-family: 'Poppins', sans-serif;
    font-size: 12px;
}

.container {
    display: grid;
    grid-template-rows: 150px 3fr;
}

.header {
    background-color: white ;
    font-size: 1.6rem;
    font-weight: 900;
    display: flex;
    justify-content: left;
    align-items: center;
    padding-left: 5vw;
    box-shadow: 0 5px 5px darkgray;
    z-index: 1;
}

.main-content {
    background-color: lightgray;
    display: grid;
    grid-template-rows: 150px 4fr;
}

.main-content>button {
    grid-column: 1 / -1;
    width: 200px;
    height: 60px;
    margin: 20px;
    background-color: silver;
    border: none;
    box-shadow: 0px 2px 4px darkgray;
    border-radius: 15px;
    justify-self: center;
    align-self: center;
    font-size: 1.5rem;
    font-family: 'Poppins', sans-serif; /* why does it not inherit the family? */
}

.main-content>button:hover {
    background-color: darkgray;
}

.grid-container {
    display: grid;
    padding: 0 5rem 5rem 5rem;
    grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
    grid-auto-rows: 1fr;
    gap: 4em
}

.book-card {
    background-color: white;
    border-radius: 15px;
    box-shadow: 0px 1px 4px darkgray;
    min-height: 300px;
    display: flex;
    flex-direction: column;
    justify-content: space-evenly;
    align-items: center;
    padding: 30px;
    font-size: 1.4rem;
}

.book-card>p {
    margin: 0;
}

.remove-btn {
    font-size: 1.3rem;
    border-radius: 5px;
    width: 100px;
    height: 50px;
    box-shadow: 0px 2px 4px darkgray;
}

.remove-btn:hover {
    background-color: red;
}

dialog {
    display: flex;
    max-height: auto;
    max-width: auto;
    z-index: 10;
    justify-content: center;
    align-items: center;
    padding: 40px;
}

.modal>form {
    font-size: 1.1rem;
    display: grid;
    grid-template: repeat(5, 1fr) / 1fr 1fr;
    gap: 15px;
}

::backdrop {
    opacity: 0.5;
}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>My Library</title>
    <script src="main.js" defer></script>
    <link rel="stylesheet" href="styles.css">
    <link rel="preconnect" href="https://fonts.googleapis.com">
    <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
    <link href="https://fonts.googleapis.com/css2?family=Chicle&family=Poppins&display=swap" rel="stylesheet">
</head>
<body>
    <div class="container">
        <div class="header">
            <h1>library</h1>
        </div>
        <div class="main-content">
            <button type="button" id="add-book-btn">+ Add book</button>
            <div class="grid-container"></div>
        </div>
    </div>

    <div>
        <dialog class="modal">
            <form method="dialog">
                <label for="author">Author</label>
                <input type="text" id="author" placeholder="J.R.R. Tolkien">
                <label for="title">Title</label>
                <input type="text" id="title" placeholder="The Lord of The Rings">
                <label for="pages">Pages</label>
                <input type="number" id="pages"> 
                <label for="read">Have you read it?</label>
                <input type="checkbox" id="read">
                <button type="submit">Submit</button>
                <button type="submit" id="dialog-close-btn">Close</button>
            </form>
        </dialog>
    </div>
</body>
</html>

However, somehow it’s not working properly. I see the backdrop change back to a bit less dark but the modal is still there. What am I doing wrong? Though when I tried it here it looks like it’s working. Can it be VSC? All the answers I found are related to Bootstrap which I’m not using…

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

>Solution :

The issue is because your modal dialog is always visible. You need to set it to display: none by default then display: flex when showModalDialog() is called.

To do that you can make this change to your CSS:

dialog {
  display: none;
  /* other properties... */
}

dialog[open] {
  display: flex;
}

Here’s a full working example:

const gridContainer = document.querySelector(".grid-container");
const addBookBtn = document.querySelector("#add-book-btn");
const dialog = document.querySelector("dialog");
const dialogCloseBtn = document.querySelector("#dialog-close-btn")
addBookBtn.addEventListener('click', () => dialog.showModal());
dialogCloseBtn.addEventListener('click', () => dialog.close());
body {
  margin: 0;
  font-family: 'Poppins', sans-serif;
  font-size: 12px;
}

.container {
  display: grid;
  grid-template-rows: 150px 3fr;
}

.header {
  background-color: white;
  font-size: 1.6rem;
  font-weight: 900;
  display: flex;
  justify-content: left;
  align-items: center;
  padding-left: 5vw;
  box-shadow: 0 5px 5px darkgray;
  z-index: 1;
}

.main-content {
  background-color: lightgray;
  display: grid;
  grid-template-rows: 150px 4fr;
}

.main-content>button {
  grid-column: 1 / -1;
  width: 200px;
  height: 60px;
  margin: 20px;
  background-color: silver;
  border: none;
  box-shadow: 0px 2px 4px darkgray;
  border-radius: 15px;
  justify-self: center;
  align-self: center;
  font-size: 1.5rem;
  font-family: 'Poppins', sans-serif;
  /* why does it not inherit the family? */
}

.main-content>button:hover {
  background-color: darkgray;
}

.grid-container {
  display: grid;
  padding: 0 5rem 5rem 5rem;
  grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
  grid-auto-rows: 1fr;
  gap: 4em
}

.book-card {
  background-color: white;
  border-radius: 15px;
  box-shadow: 0px 1px 4px darkgray;
  min-height: 300px;
  display: flex;
  flex-direction: column;
  justify-content: space-evenly;
  align-items: center;
  padding: 30px;
  font-size: 1.4rem;
}

.book-card>p {
  margin: 0;
}

.remove-btn {
  font-size: 1.3rem;
  border-radius: 5px;
  width: 100px;
  height: 50px;
  box-shadow: 0px 2px 4px darkgray;
}

.remove-btn:hover {
  background-color: red;
}

dialog {
  display: none;
  max-height: auto;
  max-width: auto;
  z-index: 10;
  justify-content: center;
  align-items: center;
  padding: 40px;
}

dialog[open] {
  display: flex;
}

.modal>form {
  font-size: 1.1rem;
  display: grid;
  grid-template: repeat(5, 1fr) / 1fr 1fr;
  gap: 15px;
}

::backdrop {
  opacity: 0.5;
}
<link href="https://fonts.googleapis.com/css2?family=Chicle&family=Poppins&display=swap" rel="stylesheet">

<div class="container">
  <div class="header">
    <h1>library</h1>
  </div>
  <div class="main-content">
    <button type="button" id="add-book-btn">+ Add book</button>
    <div class="grid-container"></div>
  </div>
</div>

<div>
  <dialog class="modal">
    <form method="dialog">
      <label for="author">Author</label>
      <input type="text" id="author" placeholder="J.R.R. Tolkien">
      <label for="title">Title</label>
      <input type="text" id="title" placeholder="The Lord of The Rings">
      <label for="pages">Pages</label>
      <input type="number" id="pages">
      <label for="read">Have you read it?</label>
      <input type="checkbox" id="read">
      <button type="submit">Submit</button>
      <button type="submit" id="dialog-close-btn">Close</button>
    </form>
  </dialog>
</div>
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading