Vanilla JavaScript ile açılan bir modal; fare kullanmayan ziyaretçilerin içeriğe ulaşabilmesini, Esc ile kapatabilmesini ve pencere kapandığında odağın açma düğmesine dönmesini sağlamalıdır. Bunun için mümkün olduğunda yerleşik
<dialog>
<button id="openSettings" type="button">Ayarları aç</button>
<dialog id="settingsDialog" aria-labelledby="settingsTitle">
<h2 id="settingsTitle">Ayarlar</h2>
<label>
Tema
<select>
<option>Açık</option>
<option>Koyu</option>
</select>
</label>
<button id="closeSettings" type="button">Kapat</button>
</dialog>
Odak yönetimi ve kapatma
const dialog = document.querySelector('#settingsDialog');
const openButton = document.querySelector('#openSettings');
const closeButton = document.querySelector('#closeSettings');
let previouslyFocused = null;
const focusableSelector = [
'button:not([disabled])',
'input:not([disabled])',
'select:not([disabled])',
'textarea:not([disabled])',
'[href]'
].join(',');
openButton.addEventListener('click', () => {
previouslyFocused = document.activeElement;
dialog.showModal();
dialog.querySelector(focusableSelector)?.focus();
});
function closeDialog() {
if (!dialog.open) return;
dialog.close();
previouslyFocused?.focus();
}
closeButton.addEventListener('click', closeDialog);
dialog.addEventListener('cancel', (event) => {
event.preventDefault();
closeDialog();
});
dialog.addEventListener('keydown', (event) => {
if (event.key !== 'Tab') return;
const elements = [...dialog.querySelectorAll(focusableSelector)];
if (elements.length === 0) return;
const first = elements[0];
const last = elements[elements.length - 1];
if (event.shiftKey && document.activeElement === first) {
event.preventDefault();
last.focus();
} else if (!event.shiftKey && document.activeElement === last) {
event.preventDefault();
first.focus();
}
});
Kontrol listesi
- Açma düğmesine klavyeyle odaklanıp Enter veya Space tuşuna basın.
- Modal açıldığında odağın ilk etkileşimli elemana geçtiğini kontrol edin.
- Tab ve Shift+Tab ile odağın modal dışına kaçmadığını test edin.
- Esc tuşuna ve Kapat düğmesine basarak modalı kapatın; odağın tekrar açma düğmesine döndüğünü doğrulayın.
- Başlık ile pencere arasındaki bağlantısını tarayıcı erişilebilirlik araçlarıyla kontrol edin.
aria-labelledby
showModal()close()
