A modal is a box that appears on top of the page to show important information or ask for a choice. An overlay is the dark background behind the modal that helps focus attention on it.
Modal and overlay patterns in Tailwind
<div class="fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center"> <div class="bg-white p-6 rounded shadow-lg max-w-md w-full"> <!-- Modal content here --> </div> </div>
fixed inset-0 makes the overlay cover the whole screen.
bg-opacity-50 makes the black background semi-transparent.
<!-- Simple modal with overlay --> <div class="fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center"> <div class="bg-white p-4 rounded"> <p>This is a modal.</p> </div> </div>
<!-- Modal with close button --> <div class="fixed inset-0 bg-black bg-opacity-60 flex items-center justify-center"> <div class="bg-white p-6 rounded shadow-lg max-w-sm w-full relative"> <button class="absolute top-2 right-2 text-gray-600 hover:text-gray-900 focus:outline-none focus:ring-2 focus:ring-gray-400" aria-label="Close modal">x</button> <h2 class="text-lg font-semibold mb-4">Modal Title</h2> <p>Modal content goes here.</p> </div> </div>
This example shows a button that opens a modal with an overlay. The modal can be closed by clicking the close button, clicking outside the modal, or pressing Escape. It uses Tailwind CSS classes for styling and accessibility features like aria-modal and focus management.
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1" /> <title>Modal Example</title> <script src="https://cdn.tailwindcss.com"></script> </head> <body class="bg-gray-100 flex items-center justify-center min-h-screen"> <button id="openModal" class="px-4 py-2 bg-blue-600 text-white rounded hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-blue-400">Open Modal</button> <!-- Modal and overlay hidden by default --> <div id="modal" class="fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center hidden" role="dialog" aria-modal="true" aria-labelledby="modalTitle"> <div class="bg-white p-6 rounded shadow-lg max-w-md w-full relative" tabindex="-1"> <button id="closeModal" class="absolute top-3 right-3 text-gray-600 hover:text-gray-900 focus:outline-none focus:ring-2 focus:ring-gray-400" aria-label="Close modal">x</button> <h2 id="modalTitle" class="text-xl font-semibold mb-4">Welcome to the Modal</h2> <p class="mb-4">This is a simple modal using Tailwind CSS. Click outside or the close button to dismiss.</p> <button id="confirmBtn" class="px-4 py-2 bg-green-600 text-white rounded hover:bg-green-700 focus:outline-none focus:ring-2 focus:ring-green-400">Confirm</button> </div> </div> <script> const openBtn = document.getElementById('openModal'); const closeBtn = document.getElementById('closeModal'); const modal = document.getElementById('modal'); openBtn.addEventListener('click', () => { modal.classList.remove('hidden'); // Focus the modal for accessibility modal.querySelector('div').focus(); }); closeBtn.addEventListener('click', () => { modal.classList.add('hidden'); openBtn.focus(); }); // Close modal when clicking outside the modal content modal.addEventListener('click', (e) => { if (e.target === modal) { modal.classList.add('hidden'); openBtn.focus(); } }); // Optional: Close modal with Escape key document.addEventListener('keydown', (e) => { if (e.key === 'Escape' && !modal.classList.contains('hidden')) { modal.classList.add('hidden'); openBtn.focus(); } }); </script> </body> </html>
Always add aria-modal="true" and role="dialog" to the modal container for screen readers.
Use keyboard controls like Escape to close the modal for better accessibility.
Keep the modal content focused when it opens to help keyboard users.
Modals show important info or choices on top of the page with a dark overlay behind.
Use Tailwind's fixed positioning and background opacity classes to create overlays.
Make modals accessible with ARIA roles and keyboard controls.
Practice
Solution
Step 1: Understand the role of overlays
Overlays are used to cover the page content with a semi-transparent layer, making the modal stand out.Step 2: Connect overlay effect to user focus
The darkened background helps users focus on the modal content by visually separating it from the rest of the page.Final Answer:
To darken the background and focus user attention on the modal -> Option AQuick Check:
Overlay = focus on modal [OK]
- Thinking overlay controls modal size
- Confusing overlay with animation
- Assuming overlay makes modal draggable
Solution
Step 1: Identify fixed full-screen overlay classes
Usefixedandinset-0to cover the entire viewport.Step 2: Apply black background with 50% opacity
bg-blacksets black color,bg-opacity-50sets 50% opacity correctly in Tailwind.Final Answer:
fixed inset-0 bg-black bg-opacity-50 -> Option AQuick Check:
Fixed + inset-0 + bg-black + bg-opacity-50 = overlay [OK]
- Using absolute instead of fixed for overlay
- Using opacity-50 instead of bg-opacity-50
- Missing inset-0 to cover full screen
<div class="fixed inset-0 bg-black bg-opacity-70"> <div class="fixed inset-0 bg-white bg-opacity-30"></div> <div class="relative p-6 bg-gray-100 rounded">Modal Content</div> </div>
Solution
Step 1: Analyze overlay layers
The outer div has black with 70% opacity, and inside it is another fixed div with white 30% opacity overlay.Step 2: Understand overlay stacking
Both overlays stack, so the visible background is a mix of black 70% and white 30% overlays combined behind the modal content.Final Answer:
A combined effect of black 70% and white 30% overlays -> Option CQuick Check:
Multiple overlays stack visually [OK]
- Ignoring inner overlay effect
- Assuming only outer overlay shows
- Thinking overlays cancel each other
<div class="absolute inset-0 bg-black bg-opacity-60"> <div class="fixed inset-0 bg-white bg-opacity-20"></div> <div class="relative p-4 bg-white rounded">Modal</div> </div>
Solution
Step 1: Check overlay positioning
The main overlay usesabsolute, which positions relative to nearest ancestor, not viewport.Step 2: Fix overlay to cover viewport
Usingfixedensures the overlay covers the entire screen regardless of scroll or parent elements.Final Answer:
Using absolute instead of fixed for the main overlay -> Option DQuick Check:
Main overlay must be fixed for full screen [OK]
- Confusing absolute and fixed positioning
- Ignoring overlay coverage on scroll
- Assuming padding affects overlay behavior
Solution
Step 1: Use correct overlay and ARIA roles
Fixed overlay with semi-transparent black background is standard. Addingrole="dialog"andaria-modal="true"makes the modal accessible.Step 2: Implement keyboard focus trap and Escape key handling
JavaScript is needed to keep keyboard focus inside the modal and close it on Escape key press for accessibility.Final Answer:
Use fixed inset-0 bg-black bg-opacity-50 for overlay, add role="dialog" aria-modal="true", and add JavaScript to trap focus and listen for Escape key -> Option BQuick Check:
Accessible modal = ARIA roles + focus trap + Escape key [OK]
- Skipping ARIA roles for accessibility
- Not trapping keyboard focus inside modal
- Using relative instead of fixed overlay
Ready to prove it?
Pass the test and this pattern moves unknown
