DOM
Manipulowanie listą klas CSS
Szukaj…
Dodawanie klasy
Nowoczesne przeglądarki udostępniają obiekt classList
celu ułatwienia manipulowania atrybutem klasy elementu. Starsze przeglądarki wymagają bezpośredniej manipulacji właściwością className
elementu.
Prostą metodą dodania klasy do elementu jest dołączenie jej na końcu właściwości className
. Nie zapobiegnie to duplikowaniu nazw klas, a między nazwami klas muszą być spacje.
document.getElementById("link1").className += " foo";
document.getElementById("link2").className += " foo bar";
W przypadku wielu elementów musisz dodać nazwy klas w pętli
var els = document.getElementsByClassName("foo"),
indx = els.length;
while (indx--) {
els[indx].className += " bar baz";
}
Nazwę pojedynczej klasy można dodać jako ciąg. Aby dodać wiele nazw klas, użyj operatora rozkładania ES6:
document.querySelector("#link1").classList.add("foo");
document.querySelector("#link2").classList.add(...['foo', 'bar']);
W przypadku wielu elementów musisz dodać nazwy klas w pętli
document.querySelectorAll(".foo").forEach(el => {
el.classList.add(...['bar', 'baz']);
});
Usuwanie klasy
Nowoczesne przeglądarki udostępniają obiekt classList
celu ułatwienia manipulowania atrybutem klasy elementu. Starsze przeglądarki wymagają bezpośredniej manipulacji właściwością className
elementu.
* Uwaga nazwy klas nie są przechowywane we właściwości elementu w określonej kolejności
Usunięcie jednej klasy z elementu wymaga nieco manipulacji właściwością className
.
var toRemove = "bar",
el = document.getElementById("link1");
el.className = el.className.replace(new RegExp("\\b" + toRemove + "\\b", "g"), "").trim();
Usunięcie wielu nazw klas wymagałoby pętli. Pozostałe przykłady wykorzystają funkcję do izolacji pracy
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");
Wiele elementów z wieloma nazwami klas do usunięcia wymagałoby dwóch pętli
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");
Nazwa pojedynczej klasy może zostać usunięta jako ciąg. Aby usunąć wiele nazw klas, użyj operatora rozkładania ES6:
document.querySelector("#link1").classList.remove("foo");
document.querySelector("#link2").classList.remove(...['foo', 'bar']);
W przypadku wielu elementów musisz usunąć nazwy klas wewnątrz pętli
document.querySelectorAll(".foo").forEach(el => {
el.classList.remove(...['bar', 'baz']);
});
Testowanie na zajęcia
Nowoczesne przeglądarki udostępniają obiekt classList
celu ułatwienia manipulowania atrybutem klasy elementu. Starsze przeglądarki wymagają bezpośredniej manipulacji właściwością className
elementu.
* Uwaga nazwy klas nie są przechowywane we właściwości elementu w określonej kolejności
Testowanie, czy element zawiera klasę, wymaga nieco manipulacji właściwością className
. W tym przykładzie użyto metody tablicowej do przetestowania klasy.
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"));
Testowanie wielu nazw klas wymagałoby pętli.
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"));
Zamiast używać .indexOf()
, możesz również rozważyć użycie wyrażenia regularnego.
function hasClass(el, name) {
return new RegExp("\\b" + name+ "\\b").test(el.className);
}
var el = document.getElementById("link1");
console.log(hasClass(el, "foo"));
Testowanie pojedynczej nazwy klasy odbywa się w następujący sposób:
var hasClass = document.querySelector("#link1").classList.contains("foo");
W przypadku wielu nazw klas łatwiej jest używać matches
. Zwróć uwagę na użycie selektora klasy; Selektor może być dowolnym prawidłowym selektorem łańcucha (identyfikator, atrybut, pseudoklasy itp.).
var hasClass = document.querySelector("#link1").matches('.foo.bar');
var hasClass = document.querySelector("#link2").matches('a.bar[href]');