classList: add, remove, toggle, contains
classList— объект типаDOMTokenList, предоставляющий удобный API для добавления, удаления, переключения и проверки CSS-классов элемента без ручной работы со строкойclassName.
Зачем нужно
До classList изменение классов требовало разбора строки element.className вручную. classList делает операции с классами атомарными, безопасными (не затрагивает другие классы) и читаемыми. Это ключевой инструмент для реализации интерактивных UI-эффектов.
Где используется
- Переключение активного состояния кнопок, вкладок, меню
- Показ/скрытие элементов (
active,hidden,visible) - Анимации через CSS-классы
- Валидация форм (добавление классов ошибки/успеха)
Методы
const el = document.querySelector('.card');
// Добавить класс (игнорирует, если уже есть)
el.classList.add('active');
el.classList.add('highlighted', 'bordered'); // несколько сразу
// Удалить класс (игнорирует, если нет)
el.classList.remove('active');
// Переключить: добавить если нет, удалить если есть
el.classList.toggle('open');
// toggle с принудительным значением
el.classList.toggle('open', true); // только добавить
el.classList.toggle('open', false); // только удалить
// Проверить наличие класса
el.classList.contains('active'); // true / false
// Заменить один класс другим
el.classList.replace('old-class', 'new-class');
// Все классы
console.log([...el.classList]); // ['card', 'active', ...]
console.log(el.classList.length);
Практические примеры
Аккордеон
document.querySelectorAll('.accordion-header').forEach(header => {
header.addEventListener('click', () => {
const item = header.closest('.accordion-item');
item.classList.toggle('expanded');
});
});
Переключение темы
const btn = document.getElementById('theme-toggle');
btn.addEventListener('click', () => {
document.body.classList.toggle('dark-theme');
const isDark = document.body.classList.contains('dark-theme');
btn.textContent = isDark ? 'Светлая тема' : 'Тёмная тема';
});
Валидация поля
function validateInput(input) {
const isValid = input.value.length >= 3;
input.classList.toggle('input--error', !isValid);
input.classList.toggle('input--success', isValid);
return isValid;
}
Навигация: активная вкладка
const tabs = document.querySelectorAll('.tab');
tabs.forEach(tab => {
tab.addEventListener('click', () => {
tabs.forEach(t => t.classList.remove('tab--active'));
tab.classList.add('tab--active');
});
});
Частые ошибки
- Изменение
classNameстрокой вместоclassList— перезаписывает все классы; легко случайно удалить нужные. toggleсundefinedвместо булева — второй аргумент должен быть явнымtrue/false; передачаundefinedведёт себя как обычныйtoggle.- Предположение, что
containsпринимает несколько классов — метод принимает только один класс за вызов.
Связанные темы
- _MOC DOM
- _MOC JavaScript
- style -- инлайн-стили через JS
- Атрибуты -- getAttribute, setAttribute
- data-атрибуты (dataset)