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>