DOM
Manipulera en lista med CSS-klasser
Sök…
Lägga till en klass
Moderna webbläsare tillhandahåller ett classList
att underlätta manipulering av elementets klassattribut. Äldre webbläsare kräver direkt manipulation av elementets className
egenskap.
En enkel metod för att lägga till en klass till ett element är att lägga till den i slutet av egenskapen className
. Detta förhindrar inte duplicerade klassnamn, och mellanrum måste ingå mellan klassnamn.
document.getElementById("link1").className += " foo";
document.getElementById("link2").className += " foo bar";
För flera element måste du lägga till klassnamnen inuti en slinga
var els = document.getElementsByClassName("foo"),
indx = els.length;
while (indx--) {
els[indx].className += " bar baz";
}
Ett enda klassnamn kan läggas till som en sträng. För att lägga till flera klassnamn, använd ES6: s spridningsoperatör:
document.querySelector("#link1").classList.add("foo");
document.querySelector("#link2").classList.add(...['foo', 'bar']);
För flera element måste du lägga till klassnamnen inuti en slinga
document.querySelectorAll(".foo").forEach(el => {
el.classList.add(...['bar', 'baz']);
});
Ta bort en klass
Moderna webbläsare tillhandahåller ett classList
att underlätta manipulering av elementets klassattribut. Äldre webbläsare kräver direkt manipulation av elementets className
egenskap.
* Obs klassens namn lagras inte i elementets egendom i någon särskild ordning
Att ta bort en klass från ett element kräver lite manipulering av egenskapen className
.
var toRemove = "bar",
el = document.getElementById("link1");
el.className = el.className.replace(new RegExp("\\b" + toRemove + "\\b", "g"), "").trim();
Att ta bort flera klassnamn kräver en slinga. De återstående exemplen använder en funktion för att isolera arbetet
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");
Flera element med flera klassnamn att ta bort kräver två slingor
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");
Ett enda klassnamn kan tas bort som en sträng. För att ta bort flera klassnamn, använd ES6: s spridningsoperatör:
document.querySelector("#link1").classList.remove("foo");
document.querySelector("#link2").classList.remove(...['foo', 'bar']);
För flera element måste du ta bort klassnamnen inuti en slinga
document.querySelectorAll(".foo").forEach(el => {
el.classList.remove(...['bar', 'baz']);
});
Testar för en klass
Moderna webbläsare tillhandahåller ett classList
att underlätta manipulering av elementets klassattribut. Äldre webbläsare kräver direkt manipulation av elementets className
egenskap.
* Obs klassens namn lagras inte i elementets egendom i någon särskild ordning
Att testa om ett element innehåller en klass kräver lite manipulering av egenskapen className
. Detta exempel använder en matrismetod för att testa för klassen.
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"));
Testning av flera klassnamn kräver en slinga.
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"));
Istället för att använda .indexOf()
kan du också överväga att använda ett vanligt uttryck.
function hasClass(el, name) {
return new RegExp("\\b" + name+ "\\b").test(el.className);
}
var el = document.getElementById("link1");
console.log(hasClass(el, "foo"));
Testning av ett enda klassnamn görs enligt följande:
var hasClass = document.querySelector("#link1").classList.contains("foo");
För flera klassnamn är det lättare att använda matches
. Notera användningen av klassväljaren; Väljaren kan vara valfri strängväljare (id, attribut, pseudoklasser, etc).
var hasClass = document.querySelector("#link1").matches('.foo.bar');
var hasClass = document.querySelector("#link2").matches('a.bar[href]');