Эта статья была рецензирована Мев-Раэлем и Панайотисом Велисаракосом . Спасибо всем рецензентам SitePoint за то, что сделали контент SitePoint как можно лучше!
Иногда вам нужно добавить или удалить класс CSS с помощью JavaScript, и вы не хотите включать целую библиотеку, такую как jQuery, чтобы сделать это.
Это полезно в ситуациях, когда вы хотите, чтобы элементы вашей страницы изменялись в ответ на действия пользователя.
Примеры использования включают в себя:
- Отображение или скрытие меню
- Выделение ошибки формы
- Отображение диалогового окна
- Отображение различного контента в ответ на выбор
- Анимация элемента в ответ на клик
Есть два свойства JavaScript, которые позволяют вам работать с классами: className
classList
Первый широко совместим , а второй более современный и удобный. Если вам не нужно поддерживать IE 8 и 9, вы можете пропустить className
Сначала мы начнем с совместимой версии.
Примечание. Это руководство предполагает некоторое знакомство с такими понятиями JavaScript, как функции и переменные.
Модификация классов совместимым способом
Свойство JavaScript className
class
Некоторые манипуляции со строками позволят нам добавлять и удалять классы.
Мы будем обращаться к элементам HTML с помощью querySelectorAll()
, который совместим с браузерами IE8 и выше.
Добавить класс
Чтобы добавить класс, мы напишем функцию, которая принимает элементы, которые мы хотим изменить, и добавляет к ним указанный класс.
function addClass(elements, myClass) {
// if there are no elements, we're done
if (!elements) { return; }
// if we have a selector, get the chosen elements
if (typeof(elements) === 'string') {
elements = document.querySelectorAll(elements);
}
// if we have a single DOM element, make it an array to simplify behavior
else if (elements.tagName) { elements=[elements]; }
// add class to all chosen elements
for (var i=0; i<elements.length; i++) {
// if class is not already found
if ( (' '+elements[i].className+' ').indexOf(' '+myClass+' ') < 0 ) {
// add class
elements[i].className += ' ' + myClass;
}
}
}
Вскоре вы увидите, как работает функция, но чтобы увидеть ее в действии, не стесняйтесь использовать этот CSS:
.red {
background: red;
}
.highlight {
background: gold;
}
… и этот HTML:
<div id="iddiv" class="highlight">ID div</div>
<div class="classdiv">Class div</div>
<div class="classdiv">Class div</div>
<div class="classdiv">Class div</div>
Вот несколько примеров использования самой функции:
addClass('#iddiv','highlight');
addClass('.classdiv','highlight');
addClass(document.getElementById('iddiv'),'highlight');
addClass(document.querySelector('.classdiv'),'highlight');
addClass(document.querySelectorAll('.classdiv'),'highlight');
Обратите внимание, что вы можете идентифицировать элементы HTML, которые вы хотите изменить, с помощью селектора или можете напрямую передавать сами элементы.
Как работает наша функция addClass
Наша функция addClass
Наша цель — пройтись по каждому элементу HTML, убедиться, что класс еще не существует, и затем добавить класс.
Во-первых, если список элементов пуст, нашей функции больше нечего делать, поэтому мы можем выйти рано.
// if there are no elements, we're done
if (!elements) { return; }
Далее, если мы решили идентифицировать наши HTML-элементы с помощью селектора, такого как #iddiv
.classdiv
querySelectorAll()
// if we have a selector, get the chosen elements
if (typeof(elements) === 'string') {
elements = document.querySelectorAll(elements);
}
Однако, если элементы DOM вводятся в функцию напрямую, мы можем их просматривать. Если есть один элемент DOM (а не список), мы сделаем его массивом, чтобы мы могли использовать тот же цикл и упростить наш код. Мы можем сказать, есть ли только один элемент, потому что элемент имеет свойство tagName , а список — нет.
// if we have a single DOM element, make it an array to simplify behavior
else if (elements.tagName) { elements=[elements]; }
Теперь, когда у нас есть элементы в формате, который мы можем зациклить, мы пройдемся по каждому из них, проверим, существует ли уже класс, и, если нет, добавим класс.
// add class to all chosen elements
for (var i=0; i<elements.length; i++) {
// if class is not already found
if ( (' '+elements[i].className+' ').indexOf(' '+myClass+' ') < 0 ) {
// add class
elements[i].className += ' ' + myClass;
}
}
Обратите внимание, что мы добавляем пробел в начале и конце, чтобы упростить шаблон, который мы ищем, и избежать необходимости в регулярном выражении.
В любом случае, мы закончили — теперь вы можете добавить класс!
Удалить класс
Чтобы удалить класс, мы можем использовать следующую функцию:
function removeClass(elements, myClass) {
// if there are no elements, we're done
if (!elements) { return; }
// if we have a selector, get the chosen elements
if (typeof(elements) === 'string') {
elements = document.querySelectorAll(elements);
}
// if we have a single DOM element, make it an array to simplify behavior
else if (elements.tagName) { elements=[elements]; }
// create pattern to find class name
var reg = new RegExp('(^| )'+myClass+'($| )','g');
// remove class from all chosen elements
for (var i=0; i<elements.length; i++) {
elements[i].className = elements[i].className.replace(reg,' ');
}
}
Большая часть этой функции removeClass
addClass
собирая нужные элементы HTML и просматривая их. Единственная разница — это часть, где класс удаляется.
Вот удаление класса более подробно:
// create pattern to find class name
var reg = new RegExp('(^| )'+myClass+'($| )','g');
// remove class from all chosen elements
for (var i=0; i<elements.length; i++) {
elements[i].className = elements[i].className.replace(reg,' ');
}
Сначала мы создаем регулярное выражение для поиска всех экземпляров нашего желаемого класса. Выражение '(^| )'+myClass+'($| )'
myClass
'g'
Используя наш шаблон, мы заменяем имя класса пробелом. Таким образом, имена классов в середине списка останутся разделенными, и не будет никакого вреда, если удаленный класс находится на концах.
Модификация классов современным способом
Браузеры из IE10 и выше поддерживают свойство под названием classList , которое значительно облегчает работу с классами элемента.
В предыдущей статье Крейг Баклер предоставил список того, что может сделать classList
Доступны следующие свойства:
длина — количество примененных имен классов
item (index) — имя класса по определенному индексу
Содержит класс
add (class) — применяет новый класс к узлу
удалить (класс) — удаляет класс из узла
toggle (class) — удаляет или добавляет класс, если он применяется или не применяется соответственноМы можем использовать это в предпочтении к свойству clunkier className:
document.getElementById("myelement").classList.add("myclass");
Давайте использовать эту информацию для создания функций, которые добавляют и удаляют классы из всех элементов, которые соответствуют селектору.
Эти функции будут получать все нужные элементы, проходить через них и добавлять или удалять классы для каждого из них.
Добавить класс
function addClass(selector, myClass) {
// get all elements that match our selector
elements = document.querySelectorAll(selector);
// add class to all chosen elements
for (var i=0; i<elements.length; i++) {
elements[i].classList.add(myClass);
}
}
// usage examples:
addClass('.class-selector', 'example-class');
addClass('#id-selector', 'example-class');
Удалить класс
function removeClass(selector, myClass) {
// get all elements that match our selector
elements = document.querySelectorAll(selector);
// remove class from all chosen elements
for (var i=0; i<elements.length; i++) {
elements[i].classList.remove(myClass);
}
}
// usage examples:
removeClass('.class-selector', 'example-class');
removeClass('#id-selector', 'example-class');
Вывод
Мы рассмотрели, как добавлять и удалять классы через className
classList
Когда вы можете управлять классами CSS с помощью JavaScript, вы разблокируете множество функций, включая обновления отображения контента, анимацию, сообщения об ошибках, диалоговые окна, меню и многое другое.
Я надеюсь, что эта статья была полезна, и если у вас есть какие-либо вопросы или мысли, пожалуйста, не стесняйтесь поделиться ими в комментариях.