Аккордеон на чистом CSS (без JavaScript)
Аккордеон - это UI-компонент, который позволяет скрывать и показывать контент при клике на заголовок. Обычно для этого используют JavaScript, но мы реализуем функциональность только на CSS, используя чекбоксы и псевдоклассы.
HTML структура
Создадим базовую разметку нашего аккордеона:
<div class="accordion">
<div class="accordion-item">
<input type="checkbox" id="item1" class="accordion-input">
<label for="item1" class="accordion-title">Section 1</label>
<div class="accordion-content">
<p>Content for section 1.</p>
</div>
</div>
<div class="accordion-item">
<input type="checkbox" id="item2" class="accordion-input">
<label for="item2" class="accordion-title">Section 2</label>
<div class="accordion-content">
<p>Content for section 2.</p>
</div>
</div>
</div>
Базовые стили
Добавим основные CSS стили для нашего аккордеона:
.accordion {
width: 100%;
max-width: 600px;
margin: 0 auto;
font-family: Arial, sans-serif;
}
.accordion-item {
margin-bottom: 10px;
border: 1px solid #ddd;
border-radius: 4px;
overflow: hidden;
}
.accordion-input {
display: none;
}
.accordion-title {
display: block;
padding: 15px;
background: #f8f8f8;
cursor: pointer;
font-weight: bold;
transition: background 0.3s;
}
.accordion-title:hover {
background: #e8e8e8;
}
.accordion-content {
max-height: 0;
padding: 0 15px;
overflow: hidden;
transition: max-height 0.3s ease-out;
background: white;
}
Логика работы
Теперь добавим логику раскрытия/закрытия с помощью псевдокласса :checked:
.accordion-input:checked ~ .accordion-content {
max-height: 500px;
padding: 15px;
}
.accordion-input:checked ~ .accordion-title {
background: #e0e0e0;
}
Здесь мы используем:
- свойство
max-heightдля плавной анимации раскрытия - комбинатор
~для выбора соседнего элемента - псевдокласс
:checkedдля отслеживания состояния чекбокса
Добавляем иконки
Улучшим наш аккордеон, добавив иконки плюса/минуса
с помощью псевдоэлемента :after:
.accordion-title::after {
content: '+';
float: right;
font-weight: bold;
}
.accordion-input:checked ~ .accordion-title::after {
content: '-';
}
Итоговый код
Вот полный код нашего CSS-аккордеона:
<div class="accordion">
<div class="accordion-item">
<input type="checkbox" id="item1" class="accordion-input">
<label for="item1" class="accordion-title">Section 1</label>
<div class="accordion-content">
<p>Content for section 1.</p>
</div>
</div>
<div class="accordion-item">
<input type="checkbox" id="item2" class="accordion-input">
<label for="item2" class="accordion-title">Section 2</label>
<div class="accordion-content">
<p>Content for section 2.</p>
</div>
</div>
</div>
.accordion {
width: 100%;
max-width: 600px;
margin: 0 auto;
font-family: Arial, sans-serif;
}
.accordion-item {
margin-bottom: 10px;
border: 1px solid #ddd;
border-radius: 4px;
overflow: hidden;
}
.accordion-input {
display: none;
}
.accordion-title {
display: block;
padding: 15px;
background: #f8f8f8;
cursor: pointer;
font-weight: bold;
transition: background 0.3s;
}
.accordion-title:hover {
background: #e8e8e8;
}
.accordion-title::after {
content: '+';
float: right;
font-weight: bold;
}
.accordion-content {
max-height: 0;
padding: 0 15px;
overflow: hidden;
transition: max-height 0.3s ease-out;
background: white;
}
.accordion-input:checked ~ .accordion-content {
max-height: 500px;
padding: 15px;
}
.accordion-input:checked ~ .accordion-title {
background: #e0e0e0;
}
.accordion-input:checked ~ .accordion-title::after {
content: '-';
}
: