Odak Göstergeleri ve Klavye Gezintisi
Görünür odak stilleri için halka yardımcılarını uygulayın, tıklamada odağın görünmesini önlemek için focus-visible kullanın ve tüm etkileşimli öğelere klavyeyle erişilebildiğinden emin olun.
Odak Göstergeleri ve Klavye Gezintisi, CoddyKit'te ücretsiz bir Tailwind CSS Academy dersidir. Bu, 4 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Tailwind CSS Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Tailwind CSS Academy kursu toplamda 4 dersten oluşur.
Klavye Gezintisi Neden Önemlidir
Tüm kullanıcılar fareyle gezinti yapmaz. Motor beceri engeli bulunan kullanıcılar klavyelere, anahtar denetimlerine veya sesli gezintiye güvenir. Deneyimli kullanıcılar verimlilik için klavye kısayollarını tercih eder. Ekran okuyucu kullananlar çoğunlukla klavyeyle gezinti yapar. WCAG 2.4.3 Odak Sırası, tüm işlevlerin klavye aracılığıyla kullanılabilmesini gerektirir; WCAG 2.4.7 ise klavyeyle odaklanan öğelerin görünür bir odak göstergesine sahip olmasını gerektirir. Tailwind, her iki gerekliliği uygulamak için yardımcı sınıflar sağlar.
Varsayılan Odak Stilleri ve Sorunları
Tarayıcılar varsayılan odak göstergeleri (genellikle mavi bir çerçeve) sağlar; ancak birçok tasarımcı bunlar fare tıklamalarında da göründüğü için outline: none veya outline: 0 ile bunları genel olarak kaldırır. Bu, erişilebilirlik açısından büyük bir sorundur — çerçevenin kaldırılması, klavye kullanıcılarının hangi öğenin odakta olduğunu gösteren görsel bir ipucuna sahip olmaması anlamına gelir. Tailwind'in modern yaklaşımı, focus-visible sözde sınıfını kullanarak fare odağı ile klavye odağını birbirinden ayırır.
/* NEVER do this globally */
* {
outline: none; /* destroys keyboard accessibility */
}
/* WRONG approach in Tailwind */
<button class='focus:outline-none'>...</button>
/* Removes focus for keyboard users too */
/* BETTER: suppress only for mouse users */
<button class='focus:outline-none focus-visible:ring-2 focus-visible:ring-blue-500'>
This button shows ring for keyboard users only
</button>Tailwind'in focus-visible Varyantı
focus-visible: varyantı, odağın klavye ile gezinme (Tab, ok tuşları) yoluyla alındığında tarayıcının uyguladığı :focus-visible CSS sözde sınıfını hedefler; odak fare tıklamasıyla alındığında ise bunu uygulamaz. Tasarımcıların istediği tam olarak budur — fare tıklamasında odak halkası gösterilmez, sekme ile gezinirken ise belirgin bir halka gösterilir. Etkileşimli öğeler için standart odak stili olarak focus-visible:ring-2 focus-visible:ring-blue-500 kullanın.
<!-- Standard button with focus-visible ring -->
<button
class='
px-4 py-2 bg-blue-600 text-white rounded-lg font-medium
focus:outline-none
focus-visible:ring-2 focus-visible:ring-blue-500 focus-visible:ring-offset-2
'
>
Submit
</button>
<!-- Link with focus-visible style -->
<a
href='/docs'
class='
text-blue-700 underline
focus:outline-none
focus-visible:ring-2 focus-visible:ring-blue-500 focus-visible:ring-offset-1 focus-visible:rounded
'
>
Documentation
</a>Odak Göstergeleri için Halka Yardımcıları
Tailwind'in ring-* yardımcıları, düzeni etkilemeden öğenin kenarlığının dışında görünen ve CSS box-shadow tabanlı bir çerçeve oluşturur. ring-2 2px kalınlığında bir halka ayarlar, ring-blue-500 halkanın rengini belirler ve ring-offset-2 öğenin kenarlığı ile halka arasına 2px boşluk ekler. Bu ayrım, renkli arka planlarda odak göstergesini daha görünür kılar.
<!-- Ring width options -->
<button class='ring-1 ...'>1px ring</button>
<button class='ring-2 ...'>2px ring (recommended)</button>
<button class='ring-4 ...'>4px ring (high visibility)</button>
<!-- Ring with offset (recommended for buttons) -->
<button class='focus-visible:ring-2 focus-visible:ring-blue-500 focus-visible:ring-offset-2'>
With offset gap
</button>
<!-- Ring offset on dark background -->
<div class='bg-gray-900 p-4'>
<button class='
bg-blue-600 text-white px-4 py-2 rounded
focus-visible:ring-2 focus-visible:ring-blue-400
focus-visible:ring-offset-2 focus-visible:ring-offset-gray-900
'>Dark bg button</button>
</div>Sekme Sırası ve tabindex
Klavye sekme sırası, sayfanın görsel okuma sırasını izlemelidir (LTR düzenlerde yukarıdan aşağıya, soldan sağa). Doğru sırada yerel olarak odaklanabilen button, a ve input gibi anlamsal HTML öğelerini kullanın. Doğal olmayan odak sıralarını zorlamak için tabindex kullanmaktan kaçının. Etkileşimli olmayan bir öğeyi (özel bir bileşen gibi) klavyeyle odaklanabilir yapmak için tabindex='0', bir öğeyi sekme dizisinden çıkarırken program aracılığıyla odaklanabilir tutmak için tabindex='-1' kullanın.
<!-- Native elements: in tab order automatically -->
<button>First</button> <!-- tab stop 1 -->
<a href='/'>Second</a> <!-- tab stop 2 -->
<input type='text' /> <!-- tab stop 3 -->
<!-- Custom component: add to tab order with tabindex='0' -->
<div
role='button'
tabindex='0'
class='focus-visible:ring-2 focus-visible:ring-blue-500'
onKeyDown={(e) => e.key === 'Enter' && handleClick()}
>
Custom interactive element
</div>
<!-- Remove from tab order but allow programmatic focus -->
<div tabindex='-1' ref={modalPanelRef}>
Modal content (focused by JS, not Tab)
</div>SPA'lerde Odak Yönetimi
Tek sayfalı uygulamalarda rota değişiklikleri ve dinamik içerik güncellemeleri sayfanın yeniden yüklenmesini tetiklemez; bu nedenle tarayıcı odağı sıfırlamaz. Gezinmeden sonra odağı program aracılığıyla yeni sayfanın ana başlığına veya atlama bağlantısının hedefinə taşıyın. Bir modal açıldıktan sonra odağı modalın içine taşıyın. Modal kapatıldıktan sonra odağı onu açan öğeye geri verin. Bu kalıpları uygulamak için React'in useRef ve element.focus() özelliklerini kullanın.
// Focus management after route change (React/Next.js)
import { useEffect, useRef } from 'react';
import { usePathname } from 'next/navigation';
function MainContent({ children }) {
const mainRef = useRef(null);
const pathname = usePathname();
useEffect(() => {
// Move focus to main content on route change
mainRef.current?.focus();
}, [pathname]);
return (
<main
ref={mainRef}
tabIndex={-1} // focusable but not in tab order
className='focus:outline-none'
>
{children}
</main>
);
}Gezinmeyi Atlama Bağlantıları
Gezinmeyi atlama bağlantısı, sayfanın üst kısmında görsel olarak gizlenen ve odaklandığında görünür olan bir bağlantıdır. Klavye kullanıcılarının tüm gezinme bağlantılarında sekme kullanmak zorunda kalmadan doğrudan ana içerik alanına geçmesini sağlar. Bu, WCAG 2.4.1 (Blokları Atlama) tarafından zorunlu tutulur. Tailwind'in sr-only ve focus:not-sr-only (veya focus:ring) yardımcıları bunu zarif bir şekilde uygular.
<!-- Skip nav: hidden until focused by keyboard -->
<a
href='#main-content'
class='
sr-only
focus:not-sr-only focus:fixed focus:top-4 focus:left-4 focus:z-50
focus:bg-white focus:text-blue-700 focus:font-semibold
focus:px-4 focus:py-2 focus:rounded-lg focus:shadow-lg
focus:ring-2 focus:ring-blue-500
'
>
Skip to main content
</a>
<nav><!-- navigation --></nav>
<main id='main-content' tabIndex={-1} className='focus:outline-none'>
<!-- page content -->
</main>Ok Tuşuyla Gezinme Kalıpları
Bazı etkileşimli bileşenler, Tab tuşuna ek olarak ok tuşlarına da yanıt vermelidir. Araç çubukları ve menü çubukları, öğeler arasında geçmek için sol/sağ oklarını kullanır. Seçim menüleri ve liste kutuları, yukarı/aşağı oklarını kullanır. Sekme panelleri, sekmeler arasında geçiş yapmak için ok tuşlarını kullanır. Özel bileşenlerde ok tuşuyla gezinmeyi uygulamak, odağı ilgili etkileşimli öğeler arasında taşıyan JavaScript klavye olay işleyicileri gerektirir.
// Arrow key navigation for a custom tab list
function TabList({ tabs }) {
const tabRefs = useRef([]);
const handleKeyDown = (e, index) => {
let newIndex;
if (e.key === 'ArrowRight') newIndex = (index + 1) % tabs.length;
if (e.key === 'ArrowLeft') newIndex = (index - 1 + tabs.length) % tabs.length;
if (e.key === 'Home') newIndex = 0;
if (e.key === 'End') newIndex = tabs.length - 1;
if (newIndex !== undefined) {
e.preventDefault();
tabRefs.current[newIndex]?.focus();
}
};
return (
<div role='tablist'>
{tabs.map((tab, i) => (
<button
key={tab.id}
ref={el => tabRefs.current[i] = el}
role='tab'
onKeyDown={e => handleKeyDown(e, i)}
className='focus-visible:ring-2 focus-visible:ring-blue-500'
>
{tab.label}
</button>
))}
</div>
);
}Erişilebilirlik için Yüksek Görünürlüklü Odak Stilleri
WCAG 2.4.11 (Odak Görünümü, WCAG 2.2), odak göstergelerinin asgari boyut ve kontrast gereksinimlerini karşılamasını zorunlu kılar. Bir odak halkası en az 2px kalınlığında olmalı ve hem odaklanılan öğeye hem de bitişik arka plana karşı en az 3:1 kontrast oranına sahip olmalıdır. Uygun kontrasta sahip bir renkle kullanılan Tailwind ring-2 bu gereksinimi karşılar. Yüksek kontrast modu desteği için Windows Yüksek Kontrast Modu'nun dikkate aldığı outline özelliğini box-shadow yerine kullanmayı değerlendirin.
/* High contrast mode compatible focus style */
@media (forced-colors: active) {
button:focus-visible,
a:focus-visible,
input:focus-visible {
outline: 3px solid ButtonText;
outline-offset: 2px;
}
}
/* Tailwind equivalent for standard mode */
<button
class='
focus:outline-none
focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-blue-600
/* Fallback for High Contrast Mode uses CSS above */
'
>
Accessible button
</button>Klavye Gezinmesini Test Etme
Klavye gezinmesini el ile test edin: fareyi tamamen bırakın ve uygulamanızın tamamında yalnızca Tab, Shift+Tab, Enter, Space ve ok tuşlarını kullanarak gezinin. Her etkileşimli öğeye ulaşılabilmeli, her eylem gerçekleştirilebilmeli ve odaklanılan her öğenin görünür bir göstergesi olmalıdır. axe DevTools gibi araçlar eksik odak göstergelerini otomatik olarak yakalayabilir; ancak el ile yapılan testler, otomatik araçların gözden kaçırdığı mantıksal akış sorunlarını ortaya çıkarır.
/*
Keyboard navigation test checklist:
Tab through entire page:
[ ] Every interactive element is reachable
[ ] Every focused element shows a visible indicator
[ ] Tab order follows visual reading order
[ ] No focus traps outside intentional ones (modals)
Activate elements:
[ ] Enter activates buttons and links
[ ] Space activates checkboxes and toggles
[ ] Arrow keys navigate menus, tabs, selects
Modal behavior:
[ ] Focus enters modal on open
[ ] Tab stays inside modal while open
[ ] Escape closes modal
[ ] Focus returns to trigger on close
Automated:
axe-core, Lighthouse accessibility audit
*/Genel Odak Stili Temeli Oluşturma
Odak stilini her öğede tekrarlamak yerine CSS'te genel bir temel olarak tutarlı biçimde tanımlayın. Bir Tailwind eklentisinde addBase kullanın veya bunu genel CSS dosyanızın @layer base bloğuna ekleyin. Böylece yerel olarak odaklanabilen tüm öğeler varsayılan olarak tutarlı ve erişilebilir bir odak göstergesine sahip olur; özel bileşenlerin ise yalnızca aynı kalıbı etkinleştirmesi gerekir.
/* globals.css — consistent focus baseline */
@layer base {
:focus-visible {
outline: 2px solid #3b82f6; /* blue-500 */
outline-offset: 2px;
border-radius: 0.25rem;
}
/* Remove outline only for mouse users */
:focus:not(:focus-visible) {
outline: none;
}
}
/* Components that need ring instead of outline: */
/* Still override per-element with focus-visible:ring-2 etc. */
<button class='focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-blue-500'>Kısa Kontrol
Bu dersteki Tailwind CSS Mastery kavramlarını anlayıp anlamadığınızı test edin.
Ders Özeti
Bu derste şunları öğrendiniz: focus-visible: odak halkalarını yalnızca klavye kullanıcıları için gösterir, ring-2 ile ring-offset-2 erişilebilir ve görsel olarak belirgin odak göstergeleri oluşturur ve gezinmeyi atlama bağlantıları ile sr-only, klavye kullanıcılarının tekrarlanan gezinmeyi atlamasını sağlar. Sırada ARIA özniteliklerini ve ekran okuyucu desteği için Tailwind'in sr-only yardımcısını nasıl kullanacağınızı ele alacağız.
Yapay zeka eğitmeniyle HTML öğren — ücretsiz
Tarayıcında gerçek kod yaz ve çalıştır, 7/24 yapay zeka eğitmeninden anında yardım al; web'de ya da uygulamada kaldığın yerden devam et.
- Kurslar
- 30
- Dersler
- 120
Sıkça Sorulan Sorular
“Odak Göstergeleri ve Klavye Gezintisi” dersi ücretsiz mi?
Evet — “Odak Göstergeleri ve Klavye Gezintisi” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Tailwind CSS Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Tailwind CSS Academy kursu toplamda 4 dersten oluşur.
“Odak Göstergeleri ve Klavye Gezintisi” dersinde ne öğreneceğim?
Görünür odak stilleri için halka yardımcılarını uygulayın, tıklamada odağın görünmesini önlemek için focus-visible kullanın ve tüm etkileşimli öğelere klavyeyle erişilebildiğinden emin olun. Tailwind CSS Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
Tailwind CSS Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Tailwind CSS Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 2. dersidir.
“Odak Göstergeleri ve Klavye Gezintisi” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu Tailwind CSS Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Tailwind CSS Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Renk Karşıtlığı ve Okunabilir Metin
- Odak Göstergeleri ve Klavye Gezintisi
- ARIA Öznitelikleri ve Ekran Okuyucular
- Erişilebilir Form Bileşenleri