Коротка відповідь
juniorToggle‑компонент можна реалізувати через чекбокс і CSS‑селектори. Вставте `<input type="checkbox" id="toggle" hidden>` і використайте `label[for="toggle"]` як кнопку. За допомогою селектора `#toggle:checked + .content { display:block; }` керуйте видимістю. Для анімації додайте `transition` до властивості `max-height` або `transform`.
Повне пояснення
Що це і навіщо
Toggle‑компонент дозволяє приховувати/показувати контент без JavaScript, що зменшує розмір bundle і покращує доступність.
Принцип роботи / алгоритм
Використовується прихований чекбокс, який змінює стан checked. Сусідні елементи CSS‑селектором реагують на цей стан і змінюють стилі.
Реалізація (JS / TS / CSS)
<input type="checkbox" id="toggle" hidden>
<label for="toggle" class="btn">Toggle</label>
<div class="content">Текст, що приховується.</div>
#toggle:checked + .content { max-height: 1000px; opacity:1; }
.content { max-height:0; overflow:hidden; transition:max-height .3s ease, opacity .3s; }
Тестування
test('toggle shows content when checked', () => {
const input = screen.getByRole('checkbox');
fireEvent.click(input);
expect(screen.getByText(/Текст/)).toBeVisible();
});
Проблеми та edge cases
- Сумісність: старі браузери не підтримують
:checked+ sibling. Використайте polyfill. - Доступність: чекбокс прихований, тому треба додати
aria-checkedі керувати ним через JS при потребі. - Анімація:
max-heightмає бути достатньо великим, інакше контент обрізається. - Фокус: кнопка
labelне отримує фокуса; додайтеtabindex="0"для клавіатурного доступу. - Синхронність: при зміні стану через JS треба оновити атрибут
checkedі відповідноaria-checked.
Оптимізація та продуктивність
Використання чистого CSS мінімізує кількість перерисовок. Переконайтеся, що transition застосовується лише до властивостей, які можна анімувати без перерисовки layout.
Без JS / архітектурні альтернативи
Можна замінити чекбокс на details/summary для простого розгортання, але це не дає повного контролю над стилями.
Cheatsheet + follow-up
:checked+ sibling selector → простий toggle.max-height+overflow:hidden→ анімація без JS.
Потенційне інтерв’ю‑питання: Як забезпечити доступність toggle, що реалізований лише CSS‑ом?