Кратко
СкопированоСвойство class
даёт возможность просматривать и манипулировать классами элемента.
Пример
Скопировано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
элемента содержится специальный объект, который хранит информацию о текущих классах элемента и содержит методы для работы с ними.
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
есть множество методов, но мы рассмотрим только часто используемые.
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')
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')
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
можно передать несколько аргументов и удалится несколько классов
Предположим что в HTML есть элемент <div class
:
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')
classList.replace()
СкопированоМетод позволяет заменить одно значение класса другим. Метод принимает 2 параметра:
- название класса, который нужно заменить;
- название класса, на что нужно заменить.
После выполнения replace
возвращает boolean-значение, которые сообщает нам об успешности операции:
true
если класс был заменён;false
если ничего не изменилось.
// На кнопке есть класс 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, потому что ничего не изменилось
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)
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' у кнопки присутствует
Имена классов
Скопировано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
является псевдомассивом, поэтому разработчик может обращаться к классам по индексам, как в массиве. При этом новые классы добавляются в конец, а при удалении все классы (и соответственно их индексы) смещаются. При этом class
легко превращается в обычный массив, по которому можно итерироваться любым привычным способом.
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
можно попробовать пользоваться свойством class
. Это поле содержит строку с именами всех классов через пробел.
Предположим у нас есть элемент шапки:
<header class="head theme-light">content</header>
<header class="head theme-light">content</header>
В поле class
будет находиться точно такая же строка, что и в атрибуте элемента 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
.