DOM
Manipulation d'une liste de classes CSS
Recherche…
Ajouter une classe
Les navigateurs modernes fournissent un objet classList
pour faciliter la manipulation de l'attribut de classe de l'élément. Les anciens navigateurs nécessitent une manipulation directe de la propriété className
de l'élément.
Une méthode simple pour ajouter une classe à un élément consiste à l'ajouter à la fin de la propriété className
. Cela n'empêche pas les noms de classes en double, et les espaces doivent être inclus entre les noms de classes.
document.getElementById("link1").className += " foo";
document.getElementById("link2").className += " foo bar";
Pour plusieurs éléments, vous devrez ajouter les noms de classe à l'intérieur d'une boucle
var els = document.getElementsByClassName("foo"),
indx = els.length;
while (indx--) {
els[indx].className += " bar baz";
}
Un nom de classe unique peut être ajouté sous forme de chaîne. Pour ajouter plusieurs noms de classe, utilisez l’opérateur de propagation de ES6:
document.querySelector("#link1").classList.add("foo");
document.querySelector("#link2").classList.add(...['foo', 'bar']);
Pour plusieurs éléments, vous devrez ajouter les noms de classe à l'intérieur d'une boucle
document.querySelectorAll(".foo").forEach(el => {
el.classList.add(...['bar', 'baz']);
});
Supprimer une classe
Les navigateurs modernes fournissent un objet classList
pour faciliter la manipulation de l'attribut de classe de l'élément. Les anciens navigateurs nécessitent une manipulation directe de la propriété className
de l'élément.
* Les noms de classes de notes ne sont pas stockés dans la propriété de l'élément dans un ordre particulier
La suppression d'une classe d'un élément nécessite un peu de manipulation de la propriété className
.
var toRemove = "bar",
el = document.getElementById("link1");
el.className = el.className.replace(new RegExp("\\b" + toRemove + "\\b", "g"), "").trim();
La suppression de plusieurs noms de classe nécessiterait une boucle. Les exemples restants utiliseront une fonction pour isoler le travail
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");
Plusieurs éléments avec plusieurs noms de classe à supprimer nécessiteraient deux boucles
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");
Un nom de classe unique peut être supprimé sous forme de chaîne. Pour supprimer plusieurs noms de classes, utilisez l’opérateur de diffusion de ES6:
document.querySelector("#link1").classList.remove("foo");
document.querySelector("#link2").classList.remove(...['foo', 'bar']);
Pour plusieurs éléments, vous devrez supprimer les noms de classe dans une boucle
document.querySelectorAll(".foo").forEach(el => {
el.classList.remove(...['bar', 'baz']);
});
Test pour une classe
Les navigateurs modernes fournissent un objet classList
pour faciliter la manipulation de l'attribut de classe de l'élément. Les anciens navigateurs nécessitent une manipulation directe de la propriété className
de l'élément.
* Les noms de classes de notes ne sont pas stockés dans la propriété de l'élément dans un ordre particulier
Tester si un élément contient une classe nécessite un peu de manipulation de la propriété className
. Cet exemple utilise une méthode de tableau pour tester la classe.
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"));
Le test de plusieurs noms de classe nécessiterait une boucle.
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"));
Au lieu d'utiliser .indexOf()
, vous pouvez également envisager d'utiliser une expression régulière.
function hasClass(el, name) {
return new RegExp("\\b" + name+ "\\b").test(el.className);
}
var el = document.getElementById("link1");
console.log(hasClass(el, "foo"));
Le test d'un nom de classe unique s'effectue comme suit:
var hasClass = document.querySelector("#link1").classList.contains("foo");
Pour plusieurs noms de classe, il est plus facile d'utiliser des matches
. Notez l'utilisation du sélecteur de classe; Le sélecteur peut être n'importe quel sélecteur de chaîne valide (id, attribut, pseudo-classes, etc.).
var hasClass = document.querySelector("#link1").matches('.foo.bar');
var hasClass = document.querySelector("#link2").matches('a.bar[href]');