SnippetUI

Akordeon Murni CSS (FAQ)

Komponen akordeon (FAQ) ramah aksesibilitas, diimplementasikan memanfaatkan elemen details/summary HTML dan CSS tanpa menggunakan JavaScript.

HTMLCSS

Dengan memanfaatkan tag <details> dan <summary> yang diperkenalkan pada HTML5, Anda dapat membuat komponen akordeon (buka-tutup) interaktif tanpa menulis satu baris JavaScript pun. Metode ini tidak hanya ramah SEO, tetapi juga telah mendukung navigasi keyboard (aksesibilitas) secara bawaan.

Pratinjau (Demo)

Apa fitur dari akordeon ini?

Dibangun hanya dengan fitur standar HTML dan CSS, tanpa menggunakan JavaScript. Sangat ringan, serta sangat baik untuk SEO dan aksesibilitas (seperti dukungan operasi keyboard).

Apakah beberapa item bisa dibuka bersamaan?

Dengan mengatur atribut name ke nilai yang sama (dalam contoh ini name=“faq”), kontrol eksklusif dimungkinkan sehingga jika Anda membuka satu, yang lain otomatis tertutup. Hapus atribut name jika Anda ingin mereka dapat dibuka secara bersamaan.

Bagaimana cara implementasi animasinya?

Animasi rotasi ikon dan efek fade-in konten diimplementasikan menggunakan transition dan @keyframes dari CSS.

Kode Implementasi

<div class="accordion-container">
  <details class="accordion" name="faq">
    <summary class="accordion-summary">
      Apa fitur dari akordeon ini?
      <span class="icon"></span>
    </summary>
    <div class="accordion-content">
      <p>Dibangun hanya dengan fitur standar HTML dan CSS, tanpa menggunakan JavaScript. Sangat ringan, serta sangat baik untuk SEO dan aksesibilitas (seperti dukungan operasi keyboard).</p>
    </div>
  </details>
  
  <details class="accordion" name="faq">
    <summary class="accordion-summary">
      Apakah beberapa item bisa dibuka bersamaan?
      <span class="icon"></span>
    </summary>
    <div class="accordion-content">
      <p>Dengan mengatur atribut name ke nilai yang sama, kontrol eksklusif (membuka satu akan menutup yang lain) dimungkinkan.</p>
    </div>
  </details>
</div>
/* Penataan gaya kontainer */
.accordion-container {
  display: flex;
  flex-direction: column;
  gap: 1rem;
  width: 100%;
  max-width: 600px;
  margin: 0 auto;
}

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

/* Penataan gaya ringkasan (judul) */
.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; /* Menyembunyikan tanda segitiga bawaan */
  color: #1e293b;
  transition: background-color 0.2s ease;
  user-select: none;
}

/* Menyembunyikan tanda segitiga bawaan untuk Safari */
.accordion-summary::-webkit-details-marker {
  display: none;
}

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

/* Garis bawah pada ringkasan saat terbuka */
.accordion[open] .accordion-summary {
  border-bottom: 1px solid #e2e8f0;
}

/* Penataan gaya ikon buka/tutup */
.icon {
  position: relative;
  width: 20px;
  height: 20px;
  display: flex;
  align-items: center;
  justify-content: center;
  flex-shrink: 0;
  margin-left: 1rem;
}

/* Garis horizontal dan vertikal ikon */
.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;
}

/* Animasi saat akordeon terbuka (+ menjadi -) */
.accordion[open] .icon::after {
  transform: rotate(90deg) scaleY(0);
}

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

/* Penataan gaya bagian konten */
.accordion-content {
  padding: 1.5rem;
  color: #475569;
  line-height: 1.6;
  animation: fadeDown 0.3s ease-out forwards;
}

.accordion-content p {
  margin: 0;
}

/* Animasi yang ditampilkan dengan lembut */
@keyframes fadeDown {
  from {
    opacity: 0;
    transform: translateY(-10px);
  }
  to {
    opacity: 1;
    transform: translateY(0);
  }
}

Poin Penting Implementasi

  1. Pemanfaatan Tag <details> dan <summary>: Penggunaan kedua elemen ini memungkinkan kita mengimplementasikan fitur buka-tutup tanpa perlu menulis fungsi event click maupun manajemen state pada JavaScript.
  2. Menyembunyikan Ikon Panah Bawaan: Dengan mendeklarasikan list-style: none; beserta ::-webkit-details-marker { display: none; }, kita dapat melenyapkan ikon segitiga default browser dan menukarnya dengan ikon desain kustom.
  3. Mekanisme Kontrol Eksklusif dengan Atribut name: Dengan menyematkan atribut name yang bernilai sama ke beberapa tag <details>, Anda bisa menciptakan sifat asli sebuah “akordeon” hanya bermodalkan HTML. Jika satu bagian dibuka, bagian lainnya akan otomatis menutup (ini merupakan spesifikasi HTML yang relatif baru).
  4. Animasi CSS Interaktif: Pengalaman pengguna menjadi lebih hidup melalui penerapan efek fade-in saat konten terekspos (menggunakan @keyframes), dipadukan dengan animasi ikon yang secara mulus bertransformasi dari tanda plus (+) ke minus (-) (menggunakan transition).