CSS Tab Generatörü

Sonraki

Sekmeler her yerde karşımıza çıkar: ayar panelleri, belge siteleri, ürün galerileri. Yerel HTML’de özel bir sekme öğesi yoktur; bu yüzden geliştiriciler kendi çözümlerini yazar. Bu araç, HTML + CSS ile basit bir sekme çubuğu oluşturur: aktif sekme için bir vurgu rengi, düğmeler için bir köşe yarıçapı ve bir üzerine gelme durumu. İşaretlemeyi projenize yapıştırın ve sekme değiştirmeyi kendi JavaScript kodunuzla bağlayın.

Sekmeler nasıl oluşturulur

  1. 1

    Bir vurgu rengi seçin

    Aktif sekmeye ait arka plan ve metin rengi. Markanıza uygun bir renk seçin.

  2. 2

    Köşe yarıçapını ayarlayın

    Sekme düğmelerinin üst köşelerini yuvarlar. Daha yüksek değerler daha yumuşak bir görünüm sağlar.

  3. 3

    Etiketleri düzenleyin

    Çıktı, "Overview", "Details" ve "Settings" olmak üzere üç düğme içerir: içeriğinize göre yeniden adlandırın.

  4. 4

    Kodu kopyalayın

    Sekme işaretlemesi, kendi <style> bloğuyla birlikte gelir. İkisini de sayfanıza yapıştırın.

  5. 5

    Sekme değiştirmeyi ekleyin

    Oluşturucu yalnızca görsel kısmı üretir. Panelleri gösterip gizlemek için düğmeleri kendi JavaScript kodunuza veya UI kitaplığınıza bağlayın.

Doğru erişilebilir işaretleme

<div class="tabs">
  <div role="tablist" aria-label="Product info">
    <button role="tab" id="tab-1" aria-selected="true"  aria-controls="panel-1" tabindex="0">Overview</button>
    <button role="tab" id="tab-2" aria-selected="false" aria-controls="panel-2" tabindex="-1">Specs</button>
    <button role="tab" id="tab-3" aria-selected="false" aria-controls="panel-3" tabindex="-1">Reviews</button>
  </div>
  <section role="tabpanel" id="panel-1" aria-labelledby="tab-1">...</section>
  <section role="tabpanel" id="panel-2" aria-labelledby="tab-2" hidden>...</section>
  <section role="tabpanel" id="panel-3" aria-labelledby="tab-3" hidden>...</section>
</div>

Kritik nitelikler:

  • role="tablist" düğmeleri sarar.
  • Her düğmede role="tab" bulunur; ayrıca aria-selected ve aria-controls yer alır.
  • tabindex, roving tabindex desenini kullanır: yalnızca aktif sekme 0, diğerleri -1'dir. Ok tuşları odağı bu sekmeler arasında taşır.
  • Her panelde role="tabpanel" bulunur ve aria-labelledby kendi sekmesini işaret eder.
  • Aktif olmayan panellerde hidden kullanılır (yalnızca display: none değil; yardımcı teknolojilerin kullandığı nitelik budur).

Klavye sözleşmesi

Tuş Eylem
Tab Sekme listesine girme / çıkma
ArrowLeft Önceki sekme (sonuncuya döner)
ArrowRight Sonraki sekme (ilkine döner)
Home İlk sekme
End Son sekme
Enter / Space Odaktaki sekmeyi etkinleştir (manuel etkinleştirmede)

Otomatik etkinleştirme (odak hareket ettikçe sekme etkinleşir) ile manuel etkinleştirme (odak hareket eder, sekme Enter'a basıldığında etkinleşir) karşılaştırıldığında, WAI-ARIA her ikisine de izin verir. Otomatik yöntem gören kullanıcılar için daha kolaydır; sekme içeriğinin işlenmesi ağır olduğunda manuel yöntem daha iyidir.

Alt çizgili stil

[role="tablist"] {
  display: flex;
  border-bottom: 1px solid #e5e7eb;
}
[role="tab"] {
  padding: 0.75rem 1rem;
  background: transparent;
  border: 0;
  color: #6b7280;
  position: relative;
  cursor: pointer;
}
[role="tab"][aria-selected="true"] {
  color: #111827;
}
[role="tab"][aria-selected="true"]::after {
  content: "";
  position: absolute;
  left: 1rem; right: 1rem; bottom: -1px;
  height: 2px;
  background: #2563eb;
}

Hap stili

[role="tab"] {
  padding: 0.5rem 0.9rem;
  border-radius: 9999px;
  border: 0;
  background: transparent;
}
[role="tab"][aria-selected="true"] {
  background: #2563eb;
  color: #fff;
}

Görünür odak

Odak klavye üzerinden geldiğinde her zaman bir odak halkası çizin:

[role="tab"]:focus-visible {
  outline: 2px solid #60a5fa;
  outline-offset: 2px;
}

JavaScript

Yaklaşık olarak:

const tabs = document.querySelectorAll('[role="tab"]');
tabs.forEach(tab => {
  tab.addEventListener('click', () => activate(tab));
  tab.addEventListener('keydown', e => {
    const i = [...tabs].indexOf(tab);
    if (e.key === 'ArrowRight') tabs[(i + 1) % tabs.length].focus();
    if (e.key === 'ArrowLeft')  tabs[(i - 1 + tabs.length) % tabs.length].focus();
    if (e.key === 'Home') tabs[0].focus();
    if (e.key === 'End')  tabs[tabs.length - 1].focus();
  });
});

function activate(tab) {
  tabs.forEach(t => {
    const panel = document.getElementById(t.getAttribute('aria-controls'));
    const active = t === tab;
    t.setAttribute('aria-selected', active);
    t.setAttribute('tabindex', active ? '0' : '-1');
    panel.hidden = !active;
  });
  tab.focus();
}

Toplam otuz satır, sıfır bağımlılık.

Sekmeler mi, akordeon mu?

Dar ekranlarda sekme satırları sıkışır. Yaygın desen: masaüstünde sekmeler, mobilde akordeon. ARIA rollerini değiştirmeden görsel sunumu değiştirmek için bir konteyner sorgusu (container query) veya medya sorgusu (media query) kullanın.

Sık Sorulan Sorular

Erişilebilir sekmeler için evet. role="tablist" ve role="tab" olmadan ekran okuyucular bu düğmeleri sıradan düğmeler gibi görür ve kullanıcılar sekme navigasyonu alışkanlığını kaybeder. Alternatif, yerleşik anlambilime sahip basit bir <details> / <summary> akordeonudur.

Otomatik mod (odak hareket ettikçe sekme etkinleşir), her sekmenin içeriğinin işlenmesi kolay olduğunda uygundur. Manuel mod (odak hareket eder, Enter etkinleştirir) ise sekme değiştirmek büyük bir formun getirilmesi veya işlenmesi gibi ağır işleri tetiklediğinde daha iyidir.

İçerik taşıyan sekmeler (belgeler, ürün sekmeleri) için: Evet – bağlantıların belirli bir sekmeye doğrudan gidebilmesi ve aktif sekmenin sayfa yeniden yüklendiğinde korunması için bir hash (#specs) veya sorgu parametresi kullanın. Arayüz sekmeleri (ayar panelleri) için URL isteğe bağlıdır.

Yalnızca ok tuşu navigasyonu ve ARIA durumları bulunmayan onay kutusu/radyo düğmesi hilesiyle. Gerçekten erişilebilir bir uygulama için bu küçük JS parçası buna değer. Sunucuda işlenen yedek çözümlere ihtiyaç duyarsanız, her sekmeyi benzersiz bir URL'e bağlayın ve ilgili paneli sunucu tarafında işleyin.

İlgili Araçlar

Araç diğer dillerde mevcuttur