Как создать FAQ-аккордеон: пошаговая инструкция с примерами
Для кого эта статья:
- Веб-разработчики и дизайнеры
- Владельцы бизнесов и интернет-магазинов
Студенты и обучающиеся веб-разработке
Раздел FAQ с раскрывающимися ответами — это не просто элемент дизайна, а мощный инструмент конверсии, снижающий нагрузку на службу поддержки до 70%. Каждый профессиональный сайт должен иметь хорошо структурированный FAQ-раздел, но многие разработчики тратят часы на поиск оптимального решения. Пора положить этому конец! В этой пошаговой инструкции я расскажу, как создать элегантный и функциональный FAQ-аккордеон, который легко интегрируется в любой проект и работает безупречно на всех устройствах. 🚀
Хотите не просто копировать готовые решения, а понимать принципы современной веб-разработки? Курс Обучение веб-разработке от Skypro даст вам глубокое понимание HTML, CSS и JavaScript. Вы научитесь создавать не только продвинутые FAQ-аккордеоны, но и полноценные интерактивные веб-приложения. Более 87% выпускников успешно трудоустраиваются уже в течение первых 3-х месяцев после окончания курса!
Создаем FAQ с раскрывающимися ответами: основы и преимущества
Прежде чем погрузиться в код, давайте разберемся, почему раскрывающиеся FAQ так популярны. Аккордеон-интерфейс экономит пространство на странице, позволяя пользователям видеть все доступные вопросы и открывать только те ответы, которые им действительно интересны. Это значительно улучшает UX и снижает когнитивную нагрузку при работе с большим объемом информации. 📊
Алексей Петров, UX-директор: Когда мы запустили новый e-commerce проект, страница FAQ занимала почти 6 экранов сплошного текста. Пользователи просто не находили нужную информацию и засыпали поддержку однотипными вопросами. После внедрения аккордеон-системы с раскрывающимися блоками количество обращений в поддержку снизилось на 43% в первую же неделю. Кроме того, мы заметили, что пользователи стали проводить на 2 минуты больше времени в разделе FAQ, но при этом конверсия в покупку выросла на 12%. Это наглядно показывает, что люди действительно находят ответы, а не просто путаются в длинных текстах.
Основные преимущества FAQ-аккордеона:
- Экономия пространства на странице
- Улучшение навигации по вопросам
- Снижение нагрузки на службу поддержки
- Повышение SEO-эффективности страницы
- Возможность группировки вопросов по тематикам
Важно понимать, что хороший FAQ-раздел решает сразу две задачи: помогает пользователям быстро получить ответы и увеличивает конверсию. По данным исследований, сайты с хорошо структурированным разделом FAQ показывают на 15-20% больше конверсий, чем аналогичные сайты без него. 📈
| Тип FAQ-решения | Скорость загрузки | SEO-эффективность | Удобство для пользователя |
|---|---|---|---|
| Статический список (без раскрытия) | Высокая | Средняя | Низкая |
| Аккордеон на CSS | Высокая | Высокая | Средняя |
| Аккордеон на JavaScript | Средняя | Высокая | Высокая |
| AJAX-загрузка ответов | Низкая | Низкая | Средняя |

HTML-структура FAQ-раздела: организация вопросов и ответов
Правильная HTML-структура — фундамент хорошего FAQ-раздела. Ключевой момент — семантическая разметка, которая не только улучшает SEO, но и делает код более понятным для поддержки. Для аккордеона мы используем список определений <dl>, где <dt> содержит вопрос, а <dd> — ответ. 🧱
Базовая структура FAQ-аккордеона выглядит так:
<div class="faq-container">
<dl class="faq-list">
<dt class="faq-question">Как оформить возврат товара?</dt>
<dd class="faq-answer">
<p>Для возврата товара необходимо заполнить форму на сайте в личном кабинете и отправить товар почтой в течение 14 дней с момента получения.</p>
</dd>
<dt class="faq-question">Сколько стоит доставка?</dt>
<dd class="faq-answer">
<p>Стоимость доставки зависит от региона и выбранного способа доставки. В среднем цена варьируется от 200 до 600 рублей.</p>
</dd>
</dl>
</div>
Для более сложных FAQ-разделов можно организовать вопросы по категориям:
<div class="faq-container">
<h3 class="faq-category">Оплата и доставка</h3>
<dl class="faq-list">
<!-- Вопросы и ответы по оплате и доставке -->
</dl>
<h3 class="faq-category">Возврат и обмен</h3>
<dl class="faq-list">
<!-- Вопросы и ответы по возврату и обмену -->
</dl>
</div>
Обратите внимание на несколько важных аспектов при создании HTML-структуры:
- Используйте семантические теги для лучшего SEO
- Добавляйте уникальные id для каждого вопроса (удобно для прямых ссылок)
- Включайте микроразметку FAQ schema.org для лучшего отображения в поисковой выдаче
- Группируйте вопросы логически по категориям для удобной навигации
Пример микроразметки schema.org для FAQ:
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [{
"@type": "Question",
"name": "Как оформить возврат товара?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Для возврата товара необходимо заполнить форму на сайте..."
}
}]
}
</script>
CSS и JavaScript для интерактивных раскрывающихся блоков FAQ
После создания базовой HTML-структуры необходимо добавить стили и интерактивность. Существует два подхода: чистый CSS-аккордеон (без JavaScript) и вариант с использованием JavaScript для более продвинутой функциональности. 🎨
Начнем с базовых CSS-стилей для аккордеона:
.faq-container {
max-width: 800px;
margin: 0 auto;
font-family: Arial, sans-serif;
}
.faq-question {
background: #f7f7f7;
padding: 15px;
margin-bottom: 0;
border-radius: 4px 4px 0 0;
font-weight: bold;
cursor: pointer;
position: relative;
}
.faq-question::after {
content: '+';
position: absolute;
right: 15px;
transition: transform 0.3s ease;
}
.faq-question.active::after {
content: '-';
}
.faq-answer {
background: #ffffff;
padding: 0;
max-height: 0;
overflow: hidden;
transition: max-height 0.3s ease, padding 0.3s ease;
margin: 0;
border-radius: 0 0 4px 4px;
border: 1px solid #f7f7f7;
border-top: none;
}
.faq-answer.active {
max-height: 500px; /* Примерная высота, может меняться */
padding: 15px;
}
Теперь добавим JavaScript для переключения состояний:
document.addEventListener('DOMContentLoaded', function() {
const questions = document.querySelectorAll('.faq-question');
questions.forEach(question => {
question.addEventListener('click', function() {
// Закрываем все открытые ответы
const currentlyActive = document.querySelector('.faq-question.active');
if(currentlyActive && currentlyActive !== question) {
currentlyActive.classList.remove('active');
currentlyActive.nextElementSibling.classList.remove('active');
}
// Переключаем состояние текущего вопроса
this.classList.toggle('active');
this.nextElementSibling.classList.toggle('active');
});
});
});
Максим Сергеев, Front-end разработчик: На одном из проектов мы столкнулись с проблемой: FAQ-аккордеон работал некорректно на iOS-устройствах — анимация подтормаживала, а иногда блоки не раскрывались вовсе. После серии тестов выяснилось, что проблема в использовании свойства height: auto вместе с CSS-транзициями. iOS обрабатывал это специфически. Мы переписали логику, заменив height на max-height с конкретными значениями и добавили requestAnimationFrame для более плавной анимации. Эти изменения увеличили вовлеченность мобильных пользователей на 27%, а время, проведённое в разделе FAQ, выросло почти в 2 раза. Теперь я всегда использую этот подход в своих проектах.
Для более продвинутых случаев можно использовать возможности CSS-анимаций и трансформаций:
| Анимация | Преимущества | Недостатки | Совместимость |
|---|---|---|---|
| max-height + transition | Простота реализации | Неточная анимация | Высокая |
| height + JS-расчет | Точная анимация | Сложнее в реализации | Высокая |
| transform: scaleY() | Аппаратное ускорение | Проблемы с внутренним контентом | Средняя |
| GSAP-анимация | Высокая производительность | Дополнительная библиотека | Очень высокая |
Продвинутый JavaScript для более плавной анимации с расчетом точной высоты:
function toggleFaq(question) {
const answer = question.nextElementSibling;
const isActive = question.classList.contains('active');
// Получаем реальную высоту элемента
answer.style.height = 'auto';
const realHeight = answer.scrollHeight;
answer.style.height = '0';
// Форсируем перерасчет
void answer.offsetWidth;
if (isActive) {
// Закрываем
answer.style.height = realHeight + 'px';
requestAnimationFrame(() => {
answer.style.height = '0';
setTimeout(() => {
question.classList.remove('active');
answer.classList.remove('active');
}, 300);
});
} else {
// Открываем
question.classList.add('active');
answer.classList.add('active');
answer.style.height = realHeight + 'px';
setTimeout(() => {
answer.style.height = 'auto';
}, 300);
}
}
Интеграция аккордеона FAQ в популярные CMS-платформы
После освоения базовых принципов создания FAQ-аккордеона, давайте рассмотрим, как интегрировать его в популярные CMS-платформы. Это значительно упрощает процесс для тех, кто не хочет писать код с нуля. 🔌
Каждая CMS предлагает свои методы интеграции, от встроенных инструментов до специализированных плагинов:
- WordPress: плагины, шорткоды и Gutenberg-блоки
- Joomla: модули и плагины для FAQ
- Drupal: специальные модули и Views
- 1C-Bitrix: компоненты и модули
- Shopify: приложения и кастомные секции
Для WordPress интеграция особенно проста благодаря множеству доступных плагинов. Вот наиболее функциональные решения:
- Easy Accordion
- Ultimate FAQ
- Accordion FAQ
- FAQ WD
- WP Responsive FAQ with Category Plugin
Пример интеграции с помощью шорткодов в WordPress (при использовании плагина Easy Accordion):
[ea_accordion]
[ea_item title="Как оформить возврат товара?"]
Для возврата товара необходимо заполнить форму на сайте...
[/ea_item]
[ea_item title="Сколько стоит доставка?"]
Стоимость доставки зависит от региона...
[/ea_item]
[/ea_accordion]
Для тех, кто предпочитает кастомные решения, можно создать собственный шорткод в WordPress:
// Добавляем в functions.php
function custom_faq_shortcode($atts, $content = null) {
// Извлекаем атрибуты
$atts = shortcode_atts(array(
'title' => 'FAQ',
), $atts);
// Генерируем уникальный ID
$id = 'faq-' . uniqid();
// Возвращаем HTML
return '
<div class="faq-container">
<h3>' . esc_html($atts['title']) . '</h3>
<dl class="faq-list" id="' . $id . '">
' . do_shortcode($content) . '
</dl>
</div>
';
}
add_shortcode('faq', 'custom_faq_shortcode');
// Шорткод для элементов FAQ
function custom_faq_item_shortcode($atts, $content = null) {
// Извлекаем атрибуты
$atts = shortcode_atts(array(
'question' => 'Вопрос не указан',
), $atts);
return '
<dt class="faq-question">' . esc_html($atts['question']) . '</dt>
<dd class="faq-answer">' . wpautop(do_shortcode($content)) . '</dd>
';
}
add_shortcode('faq_item', 'custom_faq_item_shortcode');
Для интеграции в Joomla также существуют специализированные расширения:
- JoomShaper FAQ
- DJ-Faq
- ITPrism FAQ
Важное замечание по интеграции в различные CMS: всегда проверяйте совместимость выбранного решения с вашей темой и другими плагинами. Иногда требуется дополнительная настройка CSS для корректного отображения. 🔧
Оптимизация и адаптация FAQ-раздела для мобильных устройств
Мобильная оптимизация FAQ-раздела критически важна, учитывая, что более 60% трафика сегодня приходится на мобильные устройства. Неадаптивный FAQ может отпугнуть пользователей и снизить конверсию. 📱
Основные принципы адаптации FAQ для мобильных устройств:
@media screen and (max-width: 768px) {
.faq-question {
padding: 12px 40px 12px 15px; /* Увеличиваем область для тапа */
font-size: 16px; /* Оптимальный размер шрифта для мобильных */
}
.faq-answer {
font-size: 14px;
line-height: 1.6;
}
.faq-question::after {
font-size: 24px; /* Увеличиваем размер индикатора для удобства тапа */
right: 15px;
}
}
Дополнительные рекомендации для мобильной оптимизации:
- Увеличьте отступы между вопросами для удобства тапа (рекомендуется минимум 44x44px по стандартам WCAG)
- Используйте крупные и заметные индикаторы раскрытия
- Оптимизируйте скорость загрузки, минифицируя CSS и JavaScript
- Добавьте возможность поиска по FAQ для быстрого нахождения нужной информации
- Тестируйте на реальных устройствах, а не только в эмуляторах браузера
Пример продвинутой мобильной адаптации с поиском по FAQ:
<div class="faq-search-container">
<input type="text" class="faq-search" placeholder="Поиск по вопросам..." />
</div>
<script>
document.addEventListener('DOMContentLoaded', function() {
const searchInput = document.querySelector('.faq-search');
const questions = document.querySelectorAll('.faq-question');
searchInput.addEventListener('input', function() {
const searchTerm = this.value.toLowerCase();
questions.forEach(question => {
const questionText = question.textContent.toLowerCase();
const answerText = question.nextElementSibling.textContent.toLowerCase();
const faqItem = question.parentElement;
if (questionText.includes(searchTerm) || answerText.includes(searchTerm)) {
question.parentElement.style.display = '';
} else {
question.parentElement.style.display = 'none';
}
});
});
});
</script>
Оптимизация производительности имеет решающее значение, особенно на мобильных устройствах с ограниченными ресурсами:
| Аспект оптимизации | Техника | Влияние на производительность |
|---|---|---|
| Загрузка DOM | Ленивая инициализация | Уменьшение времени первой отрисовки на 20-30% |
| CSS-анимации | Использование transform и opacity | Плавность на слабых устройствах |
| JavaScript | Делегирование событий | Снижение использования памяти |
| Размер кода | Минификация | Сокращение загрузки на 40-60% |
Пример оптимизированного JavaScript с делегированием событий:
document.addEventListener('DOMContentLoaded', function() {
// Используем делегирование событий
document.querySelector('.faq-list').addEventListener('click', function(event) {
const target = event.target;
// Проверяем, был ли клик по вопросу
if (target.classList.contains('faq-question')) {
// Переключаем состояние
const isActive = target.classList.contains('active');
const answer = target.nextElementSibling;
// Закрываем все открытые ответы
document.querySelectorAll('.faq-question.active').forEach(question => {
if (question !== target) {
question.classList.remove('active');
question.nextElementSibling.classList.remove('active');
}
});
// Переключаем состояние текущего вопроса
target.classList.toggle('active');
answer.classList.toggle('active');
}
});
});
Не забывайте также об accessibility (a11y) – ваш FAQ должен быть доступен для людей с ограниченными возможностями. Добавьте атрибуты aria для скринридеров и убедитесь, что навигация возможна с клавиатуры. 👍
FAQ с раскрывающимися ответами — не просто красивый элемент сайта, а полноценный инструмент коммуникации с пользователями. Правильно реализованный аккордеон повышает конверсию, снижает нагрузку на службу поддержки и улучшает SEO. Следуйте принципам семантической верстки, уделяйте внимание мобильной оптимизации и не забывайте о доступности. Такой подход гарантирует, что ваш FAQ-раздел будет не только функциональным, но и станет важным элементом пользовательского опыта на сайте. Начните внедрение прямо сейчас — и вы быстро заметите положительные изменения в поведении посетителей.