.class List
Динамически читаем, добавляем и удаляем классы у элементов.
Время чтения: меньше 5 мин
- Кратко
- Пример
- Как понять
- Как пишется
- classList.add()
- classList.remove()
- classList.replace()
- classList.toggle()
- classList.contains()
- Имена классов
- Егор Огарков советует
Кратко
Скопировать ссылку «Кратко» Скопировано
Свойство class List даёт возможность просматривать и манипулировать классами элемента.
Пример
Скопировать ссылку «Пример» Скопировано
const button = document.querySelector('button') // добавили классbutton.classList.add('active')// удалили классbutton.classList.remove('active')// вернет false, так как такого класса у элемента нетbutton.classList.contains('active')
const button = document.querySelector('button') // добавили класс button.classList.add('active') // удалили класс button.classList.remove('active') // вернет false, так как такого класса у элемента нет button.classList.contains('active')
Как понять
Скопировать ссылку «Как понять» Скопировано
Управлять классами элемента — одна из распространённых задач, потому браузеры предоставляют встроенные средства для решения такой задачи. В свойстве class List элемента содержится специальный объект, который хранит информацию о текущих классах элемента и содержит методы для работы с ними.
const button = document.querySelector('button') button.classList.add('active')console.log(button.classList[0])// 'active'
const button = document.querySelector('button') button.classList.add('active') console.log(button.classList[0]) // 'active'
Как пишется
Скопировать ссылку «Как пишется» Скопировано
У class List есть множество методов, но мы рассмотрим только часто используемые.
class List . add ( )
Скопировать ссылку «classList.add()» Скопировано
Этот метод используется для добавления класса к элементу. В качестве аргументов нужно передавать строку с именем класса.
Добавим элементу класс animate :
const element = document.querySelector('div') element.classList.add('animate')
const element = document.querySelector('div') element.classList.add('animate')
Можно так же передать несколько строк-аргументов, тогда добавится несколько классов:
const element = document.querySelector('div') // Добавятся классы black, fade и animateelement.classList.add('black', 'fade', 'animate')
const element = document.querySelector('div') // Добавятся классы black, fade и animate element.classList.add('black', 'fade', 'animate')
Можно не бояться, что один и тот же класс добавится два раза. Если вызвать метод add ( ) и передать уже существующий класс, то он не добавится второй раз.
const element = document.querySelector('div.header') // Добавится только animate, так как header уже есть на элементеelement.classList.add('header', 'animate')
const element = document.querySelector('div.header') // Добавится только animate, так как header уже есть на элементе element.classList.add('header', 'animate')
class List . remove ( )
Скопировать ссылку «classList.remove()» Скопировано
Метод используется для удаления класса у элемента. В качестве аргумента нужно передавать строку с именем класса.
Предположим, что кнопке назначен единственный класс submit :
const button = document.querySelector('button.submit') // Убираем классbutton.classList.remove('submit')console.log(button.classList[0]);// undefined
const button = document.querySelector('button.submit') // Убираем класс button.classList.remove('submit') console.log(button.classList[0]); // undefined
В remove ( ) можно передать несколько аргументов и удалится несколько классов
const elem = document.querySelector('div.banner') // Убираем классы hidden и animatedbutton.classList.remove('hidden', 'animated')
const elem = document.querySelector('div.banner') // Убираем классы hidden и animated button.classList.remove('hidden', 'animated')
class List . replace ( )
Скопировать ссылку «classList.replace()» Скопировано
Метод позволяет заменить одно значение класса другим. Метод принимает 2 параметра:
После выполнения replace ( ) возвращает boolean-значение, которые сообщает нам об успешности операции:
// На кнопке есть класс hiddenconst button = document.querySelector('button.hidden') // Заменяем класс hidden на visibleconst result = button.classList.replace('hidden', 'visible')console.log(result)// true, класс успешно заменился на visible // Попробуем заменить еще разconst resultAgain = button.classList.replace('hidden', 'visible')console.log(result)// false, потому что ничего не изменилось
// На кнопке есть класс hidden const button = document.querySelector('button.hidden') // Заменяем класс hidden на visible const result = button.classList.replace('hidden', 'visible') console.log(result) // true, класс успешно заменился на visible // Попробуем заменить еще раз const resultAgain = button.classList.replace('hidden', 'visible') console.log(result) // false, потому что ничего не изменилось
class List . toggle ( )
Скопировать ссылку «classList.toggle()» Скопировано
Метод можно использовать, чтобы включать или выключать класс. Если при вызове toggle ( ) переданный класс уже есть на элементе, то он будет убран. Если класса не было — то добавлен.
// На кнопке есть класс hiddenconst button = document.querySelector('button.hidden') // так как класс есть, то он будет убранbutton.classList.toggle('hidden')// А при повторном вызове будет снова добавленbutton.classList.toggle('hidden')
// На кнопке есть класс hidden const button = document.querySelector('button.hidden') // так как класс есть, то он будет убран button.classList.toggle('hidden') // А при повторном вызове будет снова добавлен button.classList.toggle('hidden')
Метод toggle ( ) принимает только один класс для переключения. Опционально вторым аргументом можно передать boolean-значение: метод будет работать как add ( ) , если передать true , и как remove ( ) , если передать false .
// На кнопке есть класс submitconst button = document.querySelector('button.submit') // Передаём вторым аргументом false и будет работать как remove()button.classList.toggle('submit', false)console.log(button.classList[0]);// undefined, потому что класса больше нет // Передаём true и теперь класс добавитсяbutton.classList.toggle('submit', true)
// На кнопке есть класс submit const button = document.querySelector('button.submit') // Передаём вторым аргументом false и будет работать как remove() button.classList.toggle('submit', false) console.log(button.classList[0]); // undefined, потому что класса больше нет // Передаём true и теперь класс добавится button.classList.toggle('submit', true)
class List . contains ( )
Скопировать ссылку «classList.contains()» Скопировано
Метод позволяет проверить наличие класса у элемента. Метод принимает один параметр — строку с названием класса, наличие которого нужно проверить.
Метод contains ( ) вернёт true если класс есть и false если класса нет.
// На кнопке есть класс hidden, найдем эту кнопку.const button = document.querySelector('button.hidden') // Проверим, есть ли класс visible на кнопкеconst isVisible = button.classList.contains('visible')console.log(isVisible)// false, класс 'visible' у кнопки отсутствует // Проверим, есть ли класс hidden на кнопкеconst isHidden = button.classList.contains('hidden')console.log(isHidden)// true, класс 'hidden' у кнопки присутствует
// На кнопке есть класс hidden, найдем эту кнопку. const button = document.querySelector('button.hidden') // Проверим, есть ли класс visible на кнопке const isVisible = button.classList.contains('visible') console.log(isVisible) // false, класс 'visible' у кнопки отсутствует // Проверим, есть ли класс hidden на кнопке const isHidden = button.classList.contains('hidden') console.log(isHidden) // true, класс 'hidden' у кнопки присутствует
Имена классов
Скопировать ссылку «Имена классов» Скопировано
Классом не может быть строка содержащая пробелы. При попытке передать в аргументах такую строку, будет выброшена ошибка. Это правило касается любого метода в class List .
const element = document.querySelector('div') element.classList.add('my awesome class')// Ошибка: Uncaught DOMException: String contains an invalid character
const element = document.querySelector('div') element.classList.add('my awesome class') // Ошибка: Uncaught DOMException: String contains an invalid character
На практике
Скопировать ссылку «На практике» Скопировано
Егор Огарков советует
Скопировать ссылку «Егор Огарков советует» Скопировано
🛠 Свойство class List является псевдомассивом, поэтому разработчик может обращаться к классам по индексам, как в массиве. При этом новые классы добавляются в конец, а при удалении все классы (и соответственно их индексы) смещаются. При этом class List легко превращается в обычный массив, по которому можно итерироваться любым привычным способом.
const element = document.querySelector('div') // Через специальный методconst classes = Array.from(element.classList) // Либо через спред-операторconst classes = [. element.classList] // Теперь нам доступны любые операции обычного массиваclasses.map(. )classes.filter(. )classes.reduce(. )
const element = document.querySelector('div') // Через специальный метод const classes = Array.from(element.classList) // Либо через спред-оператор const classes = [. element.classList] // Теперь нам доступны любые операции обычного массива classes.map(. ) classes.filter(. ) classes.reduce(. )
🛠 Вместо использования class List можно попробовать пользоваться свойством class Name . Это поле содержит строку с именами всех классов через пробел.
Предположим у нас есть элемент шапки:
content header class="head theme-light">contentheader>
В поле class Name будет находиться точно такая же строка, что и в атрибуте элемента class (даже если в ней будут лишние пробелы).
const head = document.querySelector('header') console.log(head.className);// head theme-light (то же значение, что и в атрбуте class)
const head = document.querySelector('header') console.log(head.className); // head theme-light (то же значение, что и в атрбуте class)
С помощью этого поля можно легко менять класс элемента — достаточно присвоить ему новое значение. Если добавляете несколько классов, то их нужно обязательно указывать через пробел.
// Используем элемент из предыдущего примераconst head = document.querySelector('div') // Теперь у элемента шапки будет три классаhead.className = 'head theme-dark bordered'
// Используем элемент из предыдущего примера const head = document.querySelector('div') // Теперь у элемента шапки будет три класса head.className = 'head theme-dark bordered'
Однако если с классами приходится работать часто или нужно сделать что-то сложнее, чем просто переопределить класс, то удобнее использовать методы из class List .