Tailwind CSS Modal

Use Bootstrap’s JavaScript modal plugin to add dialogs to your site for lightboxes, user notifications, or completely custom content.

Example

Toggle a working modal demo by clicking the button below. It will slide down and fade in from the top of the page.

<button
  type="button"
  class="btn inline-flex items-center gap-x-2 bg-indigo-600 text-white border-indigo-600 disabled:opacity-50 disabled:pointer-events-none hover:text-white hover:bg-indigo-700 hover:border-indigo-700 active:bg-indigo-700 active:border-indigo-700 focus:outline-none focus:ring-4 focus:ring-indigo-100"
  data-bs-toggle="modal"
  data-bs-target="#exampleModal"
  >
   Launch demo modal
   </button>
   <div class="modal fade" id="exampleModal" tabindex="-1" aria-labelledby="exampleModalLabel" aria-hidden="true">
      <div class="modal-dialog">
         <div class="modal-content">
            <div class="flex justify-between items-center px-6 py-4 border-b border-gray-300">
               <h5 class="font-bold text-gray-800" id="userModalLabel">Modal Title</h5>
               <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close">
                  <svg
                     xmlns="http://www.w3.org/2000/svg"
                     class="icon icon-tabler icon-tabler-x text-gray-700"
                     width="24"
                     height="24"
                     viewBox="0 0 24 24"
                     stroke-width="2"
                     stroke="currentColor"
                     fill="none"
                     stroke-linecap="round"
                     stroke-linejoin="round"
                     >
                     <path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
                     <path d="M18 6l-12 12"></path>
                     <path d="M6 6l12 12"></path>
                  </svg>
               </button>
            </div>
            <div class="px-6 py-4 overflow-y-auto space-y-3">
               <p>This is a wider card with supporting text below as a natural lead-in to additional content.</p>
               <p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Rerum doloremque esse necessitatibus veritatis, praesentium voluptate?</p>
            </div>
            <div class="border-t border-gray-300 px-6 py-4 flex justify-end gap-3">
               <button
                  type="button"
                  class="btn inline-flex items-center gap-x-2 bg-gray-200 text-gray-800 border-gray-200 border disabled:opacity-50 disabled:pointer-events-none hover:text-white hover:bg-gray-700 hover:border-gray-700 active:bg-gray-700 active:border-gray-700 focus:outline-none focus:ring-4 focus:ring-gray-300"
                  data-bs-dismiss="modal"
                  >
               Close
               </button>
               <button
                  type="button"
                  class="btn inline-flex items-center gap-x-2 bg-indigo-600 text-white border-indigo-600 disabled:opacity-50 disabled:pointer-events-none hover:text-white hover:bg-indigo-700 hover:border-indigo-700 active:bg-indigo-700 active:border-indigo-700 focus:outline-none focus:ring-4 focus:ring-indigo-100"
                  >
               Save changes
               </button>
            </div>
         </div>
      </div>
   </div>

Scrolling long content

When modals become too long for the user’s viewport or device, they scroll independent of the page itself. Try the demo below to see what we mean.

<button
  type="button"
  class="btn inline-flex items-center gap-x-2 bg-indigo-600 text-white border-indigo-600 disabled:opacity-50 disabled:pointer-events-none hover:text-white hover:bg-indigo-700 hover:border-indigo-700 active:bg-indigo-700 active:border-indigo-700 focus:outline-none focus:ring-4 focus:ring-indigo-100"
  data-bs-toggle="modal"
  data-bs-target="#ScrollbarModal"
  >
   Launch Demo Modal
   </button>
   <div class="modal fade" id="ScrollbarModal" tabindex="-1" aria-labelledby="ScrollbarModalLabel" aria-hidden="true">
      <div class="modal-dialog modal-dialog-scrollable">
         <div class="modal-content">
            <div class="flex justify-between items-center px-6 py-4 border-b border-gray-300">
               <h5 class="font-bold text-gray-800" id="userModalLabel">Modal Title</h5>
               <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close">
                  <svg
                     xmlns="http://www.w3.org/2000/svg"
                     class="icon icon-tabler icon-tabler-x text-gray-700"
                     width="24"
                     height="24"
                     viewBox="0 0 24 24"
                     stroke-width="2"
                     stroke="currentColor"
                     fill="none"
                     stroke-linecap="round"
                     stroke-linejoin="round"
                     >
                     <path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
                     <path d="M18 6l-12 12"></path>
                     <path d="M6 6l12 12"></path>
                  </svg>
               </button>
            </div>
            <div class="px-6 py-4 overflow-y-auto space-y-3">
               <p>
                  Cras mattis consectetur purus sit amet fermentum. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Morbi leo risus, porta ac consectetur ac, vestibulum at
                  eros.
               </p>
               <p>Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor.</p>
               <p>
                  Aenean lacinia bibendum nulla sed consectetur. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Donec sed odio dui. Donec ullamcorper nulla non
                  metus auctor fringilla.
               </p>
               <p>
                  Cras mattis consectetur purus sit amet fermentum. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Morbi leo risus, porta ac consectetur ac, vestibulum at
                  eros.
               </p>
               <p>Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor.</p>
               <p>
                  Aenean lacinia bibendum nulla sed consectetur. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Donec sed odio dui. Donec ullamcorper nulla non
                  metus auctor fringilla.
               </p>
               <p>
                  Cras mattis consectetur purus sit amet fermentum. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Morbi leo risus, porta ac consectetur ac, vestibulum at
                  eros.
               </p>
               <p>Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor.</p>
               <p>
                  Aenean lacinia bibendum nulla sed consectetur. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Donec sed odio dui. Donec ullamcorper nulla non
                  metus auctor fringilla.
               </p>
               <p>
                  Cras mattis consectetur purus sit amet fermentum. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Morbi leo risus, porta ac consectetur ac, vestibulum at
                  eros.
               </p>
               <p>Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor.</p>
               <p>
                  Aenean lacinia bibendum nulla sed consectetur. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Donec sed odio dui. Donec ullamcorper nulla non
                  metus auctor fringilla.
               </p>
               <p>
                  Cras mattis consectetur purus sit amet fermentum. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Morbi leo risus, porta ac consectetur ac, vestibulum at
                  eros.
               </p>
               <p>Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor.</p>
               <p>
                  Aenean lacinia bibendum nulla sed consectetur. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Donec sed odio dui. Donec ullamcorper nulla non
                  metus auctor fringilla.
               </p>
               <p>
                  Cras mattis consectetur purus sit amet fermentum. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Morbi leo risus, porta ac consectetur ac, vestibulum at
                  eros.
               </p>
               <p>Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor.</p>
               <p>
                  Aenean lacinia bibendum nulla sed consectetur. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Donec sed odio dui. Donec ullamcorper nulla non
                  metus auctor fringilla.
               </p>
            </div>
            <div class="border-t border-gray-300 px-6 py-4 flex justify-end gap-3">
               <button
                  type="button"
                  class="btn inline-flex items-center gap-x-2 bg-gray-200 text-gray-800 border-gray-200 border disabled:opacity-50 disabled:pointer-events-none hover:text-white hover:bg-gray-700 hover:border-gray-700 active:bg-gray-700 active:border-gray-700 focus:outline-none focus:ring-4 focus:ring-gray-300"
                  data-bs-dismiss="modal"
                  >
               Close
               </button>
               <button
                  type="button"
                  class="btn inline-flex items-center gap-x-2 bg-indigo-600 text-white border-indigo-600 disabled:opacity-50 disabled:pointer-events-none hover:text-white hover:bg-indigo-700 hover:border-indigo-700 active:bg-indigo-700 active:border-indigo-700 focus:outline-none focus:ring-4 focus:ring-indigo-100"
                  >
               Save changes
               </button>
            </div>
         </div>
      </div>
   </div>

Vertically centered

Add .modal-dialog-centered to .modal-dialog to vertically center the modal.

<button
      type="button"
      class="btn inline-flex items-center gap-x-2 bg-indigo-600 text-white border-indigo-600 disabled:opacity-50 disabled:pointer-events-none hover:text-white hover:bg-indigo-700 hover:border-indigo-700 active:bg-indigo-700 active:border-indigo-700 focus:outline-none focus:ring-4 focus:ring-indigo-100"
      data-bs-toggle="modal"
      data-bs-target="#verticalModal"
      >
   Launch Demo Modal
   </button>
   <div class="modal fade" id="verticalModal" tabindex="-1" aria-labelledby="verticalModalLabel" aria-hidden="true">
      <div class="modal-dialog modal-dialog-centered">
         <div class="modal-content">
            <div class="flex justify-between items-center px-6 py-4 border-b border-gray-300">
               <h5 class="font-bold text-gray-800" id="userModalLabel">Modal Title</h5>
               <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close">
                  <svg
                     xmlns="http://www.w3.org/2000/svg"
                     class="icon icon-tabler icon-tabler-x text-gray-700"
                     width="24"
                     height="24"
                     viewBox="0 0 24 24"
                     stroke-width="2"
                     stroke="currentColor"
                     fill="none"
                     stroke-linecap="round"
                     stroke-linejoin="round"
                     >
                     <path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
                     <path d="M18 6l-12 12"></path>
                     <path d="M6 6l12 12"></path>
                  </svg>
               </button>
            </div>
            <div class="px-6 py-4 overflow-y-auto space-y-3">
               <p>
                  Cras mattis consectetur purus sit amet fermentum. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Morbi leo risus, porta ac consectetur ac, vestibulum at
                  eros.
               </p>
               <p>Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor.</p>
               <p>
                  Aenean lacinia bibendum nulla sed consectetur. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Donec sed odio dui. Donec ullamcorper nulla non
                  metus auctor fringilla.
               </p>
            </div>
            <div class="border-t border-gray-300 px-6 py-4 flex justify-end gap-3">
               <button
                  type="button"
                  class="btn inline-flex items-center gap-x-2 bg-gray-200 text-gray-800 border-gray-200 border disabled:opacity-50 disabled:pointer-events-none hover:text-white hover:bg-gray-700 hover:border-gray-700 active:bg-gray-700 active:border-gray-700 focus:outline-none focus:ring-4 focus:ring-gray-300"
                  data-bs-dismiss="modal"
                  >
               Close
               </button>
               <button
                  type="button"
                  class="btn inline-flex items-center gap-x-2 bg-indigo-600 text-white border-indigo-600 disabled:opacity-50 disabled:pointer-events-none hover:text-white hover:bg-indigo-700 hover:border-indigo-700 active:bg-indigo-700 active:border-indigo-700 focus:outline-none focus:ring-4 focus:ring-indigo-100"
                  >
               Save changes
               </button>
            </div>
         </div>
      </div>
   </div>

Optional sizes

Modals have three optional sizes, available via modifier classes to be placed on a .modal-dialog . These sizes kick in at certain breakpoints to avoid horizontal scrollbars on narrower viewports. Add

<div class="modal-dialog !max-w-screen-xl">...</div>
  <div class="modal-dialog !max-w-screen-lg">...</div>
  <div class="modal-dialog !max-w-screen-xs">...</div>

Toggle between modals

Toggle between two separate modals.

<button
    type="button"
    class="btn inline-flex items-center gap-x-2 bg-indigo-600 text-white border-indigo-600 disabled:opacity-50 disabled:pointer-events-none hover:text-white hover:bg-indigo-700 hover:border-indigo-700 active:bg-indigo-700 active:border-indigo-700 focus:outline-none focus:ring-4 focus:ring-indigo-100"
    data-bs-toggle="modal"
    data-bs-target="#optionalfirstModal"
    >
  Open Modal
  </button>
  <div class="modal fade" id="optionalfirstModal" tabindex="-1" aria-labelledby="optionalfirstModalLabel" aria-hidden="true">
    <div class="modal-dialog">
       <div class="modal-content">
          <div class="flex justify-between items-center px-6 py-4 border-b border-gray-300">
             <h5 class="font-bold text-gray-800" id="userModalLabel">Modal Title</h5>
             <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close">
                <svg
                   xmlns="http://www.w3.org/2000/svg"
                   class="icon icon-tabler icon-tabler-x text-gray-700"
                   width="24"
                   height="24"
                   viewBox="0 0 24 24"
                   stroke-width="2"
                   stroke="currentColor"
                   fill="none"
                   stroke-linecap="round"
                   stroke-linejoin="round"
                   >
                   <path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
                   <path d="M18 6l-12 12"></path>
                   <path d="M6 6l12 12"></path>
                </svg>
             </button>
          </div>
          <div class="px-6 py-4 overflow-y-auto space-y-3">
             <p>
                Cras mattis consectetur purus sit amet fermentum. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Morbi leo risus, porta ac consectetur ac, vestibulum at
                eros.
             </p>
             <p>Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor.</p>
             <p>
                Aenean lacinia bibendum nulla sed consectetur. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Donec sed odio dui. Donec ullamcorper nulla non
                metus auctor fringilla.
             </p>
          </div>
          <div class="border-t border-gray-300 px-6 py-4 flex justify-end gap-3">
             <button
                type="button"
                class="btn inline-flex items-center gap-x-2 bg-gray-200 text-gray-800 border-gray-200 border disabled:opacity-50 disabled:pointer-events-none hover:text-white hover:bg-gray-700 hover:border-gray-700 active:bg-gray-700 active:border-gray-700 focus:outline-none focus:ring-4 focus:ring-gray-300"
                data-bs-dismiss="modal"
                >
             Close
             </button>
             <button
                type="button"
                data-bs-target="#optionalsecondModal"
                data-bs-toggle="modal"
                class="btn inline-flex items-center gap-x-2 bg-indigo-600 text-white border-indigo-600 disabled:opacity-50 disabled:pointer-events-none hover:text-white hover:bg-indigo-700 hover:border-indigo-700 active:bg-indigo-700 active:border-indigo-700 focus:outline-none focus:ring-4 focus:ring-indigo-100"
                >
             Second Modal
             </button>
          </div>
       </div>
    </div>
  </div>
  <div class="modal fade" id="optionalsecondModal" tabindex="-1" aria-labelledby="optionalsecondModalLabel" aria-hidden="true">
    <div class="modal-dialog">
       <div class="modal-content">
          <div class="flex justify-between items-center px-6 py-4 border-b border-gray-300">
             <h5 class="font-bold text-gray-800" id="userModalLabel">Second Modal Title</h5>
             <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close">
                <svg
                   xmlns="http://www.w3.org/2000/svg"
                   class="icon icon-tabler icon-tabler-x text-gray-700"
                   width="24"
                   height="24"
                   viewBox="0 0 24 24"
                   stroke-width="2"
                   stroke="currentColor"
                   fill="none"
                   stroke-linecap="round"
                   stroke-linejoin="round"
                   >
                   <path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
                   <path d="M18 6l-12 12"></path>
                   <path d="M6 6l12 12"></path>
                </svg>
             </button>
          </div>
          <div class="px-6 py-4 overflow-y-auto space-y-3">
             <p>
                Cras mattis consectetur purus sit amet fermentum. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Morbi leo risus, porta ac consectetur ac, vestibulum at
                eros.
             </p>
          </div>
          <div class="border-t border-gray-300 px-6 py-4 flex justify-end gap-3">
             <button
                type="button"
                data-bs-target="#optionalfirstModal"
                data-bs-toggle="modal"
                class="btn inline-flex items-center gap-x-2 bg-indigo-600 text-white border-indigo-600 disabled:opacity-50 disabled:pointer-events-none hover:text-white hover:bg-indigo-700 hover:border-indigo-700 active:bg-indigo-700 active:border-indigo-700 focus:outline-none focus:ring-4 focus:ring-indigo-100"
                >
             Back to First Modal
             </button>
          </div>
       </div>
   </div>
  </div>