Acordeón de Preguntas Frecuentes
Implementado solo con elementos de resumen/detalles HTML5 y CSS, no se requiere JavaScript. Un acordeón accesible para preguntas frecuentes con animaciones de apertura y cierre suaves.
HTMLCSS
Un acordeón de preguntas frecuentes semántico y accesible que utiliza elementos nativos de “detalles” y “resumen”. Está construido sólo con HTML/CSS sin utilizar JavaScript, por lo que es compatible con SEO y extremadamente liviano. También usamos CSS para agregar estilos personalizados, estados de desplazamiento y animaciones de rotación suave de íconos.
FAQアコーディオンとは何ですか?
FAQアコーディオンは、ユーザーがContentの表示・非表示を切り替えられるUIパターンです。よくある質問などで、ページのスペースを節約するためによく使用されます。
どのような仕組みですか?
ネイティブのHTML5 detailsおよびsummary要素を使用しています。summaryがクリックされると、ブラウザが自動的に関連するContentを展開または折りたたみます。
<div class="faq-container">
<details class="faq-item">
<summary class="faq-summary">
<span class="faq-question">FAQアコーディオンとは何ですか?</span>
<svg class="faq-icon" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="m6 9 6 6 6-6"/>
</svg>
</summary>
<div class="faq-content">
<p>FAQアコーディオンは、ユーザーがContentの表示・非表示を切り替えられるUIパターンです。よくある質問などで、ページのスペースを節約するためによく使用されます。</p>
</div>
</details>
<details class="faq-item">
<summary class="faq-summary">
<span class="faq-question">どのような仕組みですか?</span>
<svg class="faq-icon" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="m6 9 6 6 6-6"/>
</svg>
</summary>
<div class="faq-content">
<p>ネイティブのHTML5 detailsおよびsummary要素を使用しています。summaryがクリックされると、ブラウザが自動的に関連するContentを展開または折りたたみます。</p>
</div>
</details>
</div>
.faq-container {
width: 100%;
max-width: 600px;
margin: 0 auto;
display: flex;
flex-direction: column;
gap: 16px;
font-family: system-ui, -apple-system, sans-serif;
}
.faq-item {
background-color: #ffffff;
border: 1px solid #e5e7eb;
border-radius: 8px;
overflow: hidden;
transition: all 0.3s ease;
box-shadow: 0 2px 4px rgba(0,0,0,0.05);
}
.faq-item:hover {
box-shadow: 0 4px 6px rgba(0,0,0,0.1);
border-color: #d1d5db;
}
.faq-item[open] {
border-color: #3b82f6;
}
.faq-summary {
display: flex;
justify-content: space-between;
align-items: center;
padding: 16px 20px;
cursor: pointer;
list-style: none; /* デフォルトの三角形を非表示 */
font-weight: 600;
color: #1f2937;
}
/* Webkit向けにデフォルトの三角形を非表示 */
.faq-summary::-webkit-details-marker {
display: none;
}
.faq-question {
padding-right: 16px;
}
.faq-icon {
flex-shrink: 0;
color: #6b7280;
transition: transform 0.3s ease;
}
/* detailsが開いているときにアイコンを回転 */
.faq-item[open] .faq-icon {
transform: rotate(180deg);
color: #3b82f6;
}
.faq-content {
padding: 0 20px 20px;
color: #4b5563;
line-height: 1.6;
}
.faq-item[open] .faq-content {
animation: fadeIn 0.4s ease-in-out;
}
@keyframes fadeIn {
from {
opacity: 0;
transform: translateY(-10px);
}
to {
opacity: 1;
transform: translateY(0);
}
}