DOM
Manipulando una lista de clases de CSS
Buscar..
Añadiendo una clase
Los navegadores modernos proporcionan un objeto classList
para facilitar la manipulación del atributo de clase del elemento. Los navegadores más antiguos requieren la manipulación directa de la propiedad className
del elemento.
Un método simple para agregar una clase a un elemento es agregarlo al final de la propiedad className
. Esto no evitará nombres de clase duplicados, y los espacios deben incluirse entre los nombres de clase.
document.getElementById("link1").className += " foo";
document.getElementById("link2").className += " foo bar";
Para elementos múltiples, deberá agregar los nombres de clase dentro de un bucle
var els = document.getElementsByClassName("foo"),
indx = els.length;
while (indx--) {
els[indx].className += " bar baz";
}
Se puede agregar un solo nombre de clase como una cadena. Para agregar varios nombres de clase, use el operador de propagación de ES6:
document.querySelector("#link1").classList.add("foo");
document.querySelector("#link2").classList.add(...['foo', 'bar']);
Para elementos múltiples, deberá agregar los nombres de clase dentro de un bucle
document.querySelectorAll(".foo").forEach(el => {
el.classList.add(...['bar', 'baz']);
});
Eliminando una clase
Los navegadores modernos proporcionan un objeto classList
para facilitar la manipulación del atributo de clase del elemento. Los navegadores más antiguos requieren la manipulación directa de la propiedad className
del elemento.
* Los nombres de clase de nota no se almacenan en la propiedad del elemento en ningún orden particular
Eliminar una clase de un elemento requiere un poco de manipulación de la propiedad className
.
var toRemove = "bar",
el = document.getElementById("link1");
el.className = el.className.replace(new RegExp("\\b" + toRemove + "\\b", "g"), "").trim();
Eliminar varios nombres de clase requeriría un bucle. Los ejemplos restantes utilizarán una función para aislar el trabajo.
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");
Múltiples elementos con múltiples nombres de clase para eliminar requerirían dos bucles
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 solo nombre de clase puede ser eliminado como una cadena. Para eliminar varios nombres de clase, use el operador de propagación de ES6:
document.querySelector("#link1").classList.remove("foo");
document.querySelector("#link2").classList.remove(...['foo', 'bar']);
Para varios elementos, deberá eliminar los nombres de clase dentro de un bucle
document.querySelectorAll(".foo").forEach(el => {
el.classList.remove(...['bar', 'baz']);
});
Pruebas para una clase
Los navegadores modernos proporcionan un objeto classList
para facilitar la manipulación del atributo de clase del elemento. Los navegadores más antiguos requieren la manipulación directa de la propiedad className
del elemento.
* Los nombres de clase de nota no se almacenan en la propiedad del elemento en ningún orden particular
Probar si un elemento contiene una clase requiere un poco de manipulación de la propiedad className
. Este ejemplo utiliza un método de matriz para probar la clase.
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"));
La prueba de varios nombres de clase requeriría un bucle.
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"));
En lugar de usar .indexOf()
, también puede considerar usar una expresión regular.
function hasClass(el, name) {
return new RegExp("\\b" + name+ "\\b").test(el.className);
}
var el = document.getElementById("link1");
console.log(hasClass(el, "foo"));
La prueba de un solo nombre de clase se realiza de la siguiente manera:
var hasClass = document.querySelector("#link1").classList.contains("foo");
Para múltiples nombres de clase, es más fácil usar matches
. Tenga en cuenta el uso del selector de clase; El selector puede ser cualquier selector de cadena válido (id, atributo, pseudo-clases, etc.).
var hasClass = document.querySelector("#link1").matches('.foo.bar');
var hasClass = document.querySelector("#link2").matches('a.bar[href]');