SnippetUI

Sadece CSS ile Akordeon (SSS)

JavaScript kullanmadan, HTML details/summary etiketleri ve CSS ile uygulanan, erişilebilirliği yüksek SSS akordeon bileşeni.

HTMLCSS

Doğrudan HTML5’in sunduğu yerleşik <details> ve <summary> etiketlerinden faydalanarak, tek satır bile JavaScript yazmadan tamamen işlevsel bir açılır/kapanır akordeon (Accordion) bileşeni geliştirebilirsiniz. Bu yöntem, varsayılan olarak SEO dostudur ve aynı zamanda tüm klavye odaklanma ve etkileşimleriyle uyumlu olarak üst düzey erişilebilirlik (A11y) standartlarını karşılar.

Demo

Bu akordeonun özellikleri nelerdir?

JavaScript kullanmadan, yalnızca standart HTML özellikleri ve CSS ile oluşturulmuştur. Çok hafiftir; SEO ve erişilebilirlik (klavye desteği vb.) açısından da mükemmeldir.

Birden fazla öğeyi aynı anda açabilir miyim?

name niteliğini aynı değere (bu örnekte name=“faq”) ayarlayarak, birini açtığınızda diğerlerinin otomatik olarak kapandığı dışlayıcı kontrol mümkündür. Aynı anda açılabilmelerini isterseniz name niteliğini kaldırın.

Animasyonlar nasıl uygulanıyor?

Simge döndürme animasyonu ve içerik solma (fade-in) efekti, CSS’in transition ve @keyframes özellikleri kullanılarak uygulanmıştır.

Kod

<div class="accordion-container">
  <details class="accordion" name="faq">
    <summary class="accordion-summary">
      Bu akordeonun özellikleri nelerdir?
      <span class="icon"></span>
    </summary>
    <div class="accordion-content">
      <p>JavaScript kullanmadan, yalnızca standart HTML özellikleri ve CSS ile oluşturulmuştur. Çok hafiftir; SEO ve erişilebilirlik (klavye desteği vb.) açısından da mükemmeldir.</p>
    </div>
  </details>
  
  <details class="accordion" name="faq">
    <summary class="accordion-summary">
      Birden fazla öğeyi aynı anda açabilir miyim?
      <span class="icon"></span>
    </summary>
    <div class="accordion-content">
      <p>name niteliğini aynı değere ayarlayarak dışlayıcı kontrol (birini açtığınızda diğerlerinin kapandığı) mümkündür.</p>
    </div>
  </details>
</div>
/* Kapsayıcı Stili */
.accordion-container {
  display: flex;
  flex-direction: column;
  gap: 1rem;
  width: 100%;
  max-width: 600px;
  margin: 0 auto;
}

/* Akordeon Ana Gövdesi */
.accordion {
  border: 1px solid #e2e8f0;
  border-radius: 8px;
  background-color: #ffffff;
  overflow: hidden;
  box-shadow: 0 1px 3px rgba(0,0,0,0.05);
}

/* Özet (Başlık) Stili */
.accordion-summary {
  padding: 1.25rem 1.5rem;
  font-weight: 600;
  font-size: 1.05rem;
  cursor: pointer;
  display: flex;
  justify-content: space-between;
  align-items: center;
  list-style: none; /* Varsayılan üçgen simgesini gizle */
  color: #1e293b;
  transition: background-color 0.2s ease;
  user-select: none;
}

/* Safari için varsayılan üçgen simgesini gizle */
.accordion-summary::-webkit-details-marker {
  display: none;
}

.accordion-summary:hover {
  background-color: #f8fafc;
}

/* Açık durumdaki özetin alt çizgisi */
.accordion[open] .accordion-summary {
  border-bottom: 1px solid #e2e8f0;
}

/* Aç/Kapat Simgesinin Stili */
.icon {
  position: relative;
  width: 20px;
  height: 20px;
  display: flex;
  align-items: center;
  justify-content: center;
  flex-shrink: 0;
  margin-left: 1rem;
}

/* Simgenin Yatay ve Dikey Çizgisi */
.icon::before,
.icon::after {
  content: '';
  position: absolute;
  background-color: #64748b;
  transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);
  border-radius: 2px;
}

.icon::before {
  width: 16px;
  height: 2px;
}

.icon::after {
  width: 2px;
  height: 16px;
}

/* Akordeon açıldığındaki animasyon (+ işaretinden - işaretine dönüşür) */
.accordion[open] .icon::after {
  transform: rotate(90deg) scaleY(0);
}

.accordion[open] .icon::before {
  background-color: #3b82f6;
}

/* İçerik Kısmının Stili */
.accordion-content {
  padding: 1.5rem;
  color: #475569;
  line-height: 1.6;
  animation: fadeDown 0.3s ease-out forwards;
}

.accordion-content p {
  margin: 0;
}

/* Yavaşça Beliren (Fade-in) Animasyon */
@keyframes fadeDown {
  from {
    opacity: 0;
    transform: translateY(-10px);
  }
  to {
    opacity: 1;
    transform: translateY(0);
  }
}

Uygulama İpuçları

  1. Yerleşik <details> ve <summary> Etiketlerinin Gücü: Sırf bu etiketleri kullanarak, tıklama yakalayıcılar (event listeners) ve değişken bazlı durum (state) yönetimi gibi meşakkatli JavaScript kurgularına ihtiyaç duymadan güvenilir bir açma/kapatma işlevi sağlayabilirsiniz.
  2. Tarayıcıların Varsayılan Ok Simgesini Gizleme: CSS içerisinde list-style: none; kuralını ve WebKit tabanlı tarayıcılar için ::-webkit-details-marker { display: none; } kuralını tanımlayarak varsayılan üçgen (ok) simgesinden kurtulabilir ve yerine markanıza özgü estetik tasarımlara sahip özel ikonlar yerleştirebilirsiniz.
  3. name Niteliği Aracılığıyla Benzersiz Geçiş (Exclusive Accordion): HTML içerisinde birbirine ardışık veya aynı grup içerisindeki birden fazla name etiketine tıpatıp aynı <details> niteliğini (attribute) verdiğinizde; listeden herhangi birini açtığınız an diğer açık olanlar kendiliğinden kapanacaktır. (Nispeten yeni olan bu HTML özelliği ekstra kod yükünü sıfıra indirir.)
  4. Tamamı CSS’ten Oluşan Animasyonlar: Açılış anında hafif bir kayma efektiyle usulca beliren metin geçişleri (@keyframes) veya artı (+) ikonundan eksi (-) formuna bürünerek dönüşen zekice animasyonlar (transition), tamamen CSS mimarisiyle hayata geçirilerek akıcı ve premium bir kullanıcı deneyimi hedeflenmiştir.