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-green-600 text-white border-green-600 disabled:opacity-50 disabled:pointer-events-none hover:text-white hover:bg-green-700 hover:border-green-700 active:bg-green-700 active:border-green-700 focus:outline-none focus:ring-4 focus:ring-green-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-green-600 text-white border-green-600 disabled:opacity-50 disabled:pointer-events-none hover:text-white hover:bg-green-700 hover:border-green-700 active:bg-green-700 active:border-green-700 focus:outline-none focus:ring-4 focus:ring-green-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-green-600 text-white border-green-600 disabled:opacity-50 disabled:pointer-events-none hover:text-white hover:bg-green-700 hover:border-green-700 active:bg-green-700 active:border-green-700 focus:outline-none focus:ring-4 focus:ring-green-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-green-600 text-white border-green-600 disabled:opacity-50 disabled:pointer-events-none hover:text-white hover:bg-green-700 hover:border-green-700 active:bg-green-700 active:border-green-700 focus:outline-none focus:ring-4 focus:ring-green-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-green-600 text-white border-green-600 disabled:opacity-50 disabled:pointer-events-none hover:text-white hover:bg-green-700 hover:border-green-700 active:bg-green-700 active:border-green-700 focus:outline-none focus:ring-4 focus:ring-green-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-green-600 text-white border-green-600 disabled:opacity-50 disabled:pointer-events-none hover:text-white hover:bg-green-700 hover:border-green-700 active:bg-green-700 active:border-green-700 focus:outline-none focus:ring-4 focus:ring-green-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-green-600 text-white border-green-600 disabled:opacity-50 disabled:pointer-events-none hover:text-white hover:bg-green-700 hover:border-green-700 active:bg-green-700 active:border-green-700 focus:outline-none focus:ring-4 focus:ring-green-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-green-600 text-white border-green-600 disabled:opacity-50 disabled:pointer-events-none hover:text-white hover:bg-green-700 hover:border-green-700 active:bg-green-700 active:border-green-700 focus:outline-none focus:ring-4 focus:ring-green-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-green-600 text-white border-green-600 disabled:opacity-50 disabled:pointer-events-none hover:text-white hover:bg-green-700 hover:border-green-700 active:bg-green-700 active:border-green-700 focus:outline-none focus:ring-4 focus:ring-green-100"
							>
					 Back to First Modal
					 </button>
				</div>
		 </div>
 </div>
</div>