DOM
Манипулирование списком классов CSS
Поиск…
Добавление класса
Современные браузеры предоставляют объект classList
для облегчения манипулирования атрибутом класса элемента. Старые браузеры требуют прямой обработки свойства className
элемента.
Простым методом добавления класса к элементу является добавление его в конец свойства className
. Это не предотвратит дублирование имен классов, и пробелы должны быть включены между именами классов.
document.getElementById("link1").className += " foo";
document.getElementById("link2").className += " foo bar";
Для нескольких элементов вам необходимо добавить имена классов внутри цикла
var els = document.getElementsByClassName("foo"),
indx = els.length;
while (indx--) {
els[indx].className += " bar baz";
}
В качестве строки может быть добавлено одно имя класса. Чтобы добавить несколько имен классов, используйте оператор распространения ES6:
document.querySelector("#link1").classList.add("foo");
document.querySelector("#link2").classList.add(...['foo', 'bar']);
Для нескольких элементов вам необходимо добавить имена классов внутри цикла
document.querySelectorAll(".foo").forEach(el => {
el.classList.add(...['bar', 'baz']);
});
Удаление класса
Современные браузеры предоставляют объект classList
для облегчения манипулирования атрибутом класса элемента. Старые браузеры требуют прямой обработки свойства className
элемента.
* Названия классов примечаний не хранятся в свойстве элемента в каком-либо конкретном порядке
Удаление одного класса из элемента требует некоторой манипуляции с свойством className
.
var toRemove = "bar",
el = document.getElementById("link1");
el.className = el.className.replace(new RegExp("\\b" + toRemove + "\\b", "g"), "").trim();
Для удаления нескольких имен классов потребуется цикл. В остальных примерах будет использована функция для изоляции работы
function removeClass(el, name) {
name = name.split(/\s+/);
var index = name.length,
classes = el.className;
while (index--) {
classes = classes.replace(new RegExp("\\b" + name[index] + "\\b", "g"), "").trim();
}
el.className = classes;
}
var el = document.getElementById("link1");
removeClass(el, "bar baz");
Для нескольких элементов с несколькими именами классов для удаления потребуется две петли
function removeClass(els, name) {
name = name.split(/\s+/);
var regex, len,
index = name.length;
while (index--) {
regex = new RegExp("\\b" + name[index] + "\\b", "g");
len = els.length;
while (len--) {
els[len].className = els[len].className.replace(regex, "").trim();
}
}
}
var els = document.getElementsByTagName("a");
removeClass(els, "bar baz");
Одно имя класса может быть удалено в виде строки. Чтобы удалить несколько имен классов, используйте оператор распространения ES6:
document.querySelector("#link1").classList.remove("foo");
document.querySelector("#link2").classList.remove(...['foo', 'bar']);
Для нескольких элементов вам необходимо удалить имена классов внутри цикла
document.querySelectorAll(".foo").forEach(el => {
el.classList.remove(...['bar', 'baz']);
});
Тестирование для класса
Современные браузеры предоставляют объект classList
для облегчения манипулирования атрибутом класса элемента. Старые браузеры требуют прямой обработки свойства className
элемента.
* Названия классов примечаний не хранятся в свойстве элемента в каком-либо конкретном порядке
Тестирование, если элемент содержит класс, требует некоторой манипуляции с свойством className
. В этом примере используется метод массива для проверки класса.
function hasClass(el, name) {
var classes = (el && el.className || "").split(/\s+/);
return classes.indexOf(name) > -1;
}
var el = document.getElementById("link1");
console.log(hasClass(el, "foo"));
Тестирование для нескольких имен классов потребует цикла.
function hasClass(el, name) {
name = name.split(/[\s.]+/);
var hasClass = true,
classes = (el && el.className || "").split(/\s+/),
index = name.length;
while (index--) {
hasClass = hasClass && classes.indexOf(name[index]) > -1;
}
return hasClass;
}
var el = document.getElementById("link1");
console.log(hasClass(el, "foo"));
Вместо использования .indexOf()
вы также можете использовать регулярное выражение.
function hasClass(el, name) {
return new RegExp("\\b" + name+ "\\b").test(el.className);
}
var el = document.getElementById("link1");
console.log(hasClass(el, "foo"));
Тестирование для одного имени класса выполняется следующим образом:
var hasClass = document.querySelector("#link1").classList.contains("foo");
Для нескольких имен классов легче использовать matches
. Обратите внимание на использование селектора классов; Селектором может быть любой допустимый селектор строк (id, атрибут, псевдоклассы и т. Д.).
var hasClass = document.querySelector("#link1").matches('.foo.bar');
var hasClass = document.querySelector("#link2").matches('a.bar[href]');