Comment attribuer plusieurs classes css à un élément html via javascript sans utiliser de bibliothèques?
Essayez de faire ça ...
document.getElementById("MyElement").className += " MyClass";
Vous avez ceci ici ...
Cela marche:
myElement.className = 'foo bar baz';
var el = document.getElementsByClassName('myclass')
el[0].classList.add('newclass');
el[0].classList.remove('newclass');
Pour savoir si la classe existe ou non, utilisez:
el[0].classList.contains('newclass'); // this will return true or false
Support du navigateur IE8 +
garanti de fonctionner sur de nouveaux navigateurs. l'ancienne méthode className peut ne pas l'être, car elle est obsolète.
<element class="oneclass" />
element.setAttribute('class', element.getAttribute('class') + ' another');
alert(element.getAttribute('class')); // oneclass another
Depuis que je ne pouvais pas trouver cette réponse nulle part:
Manière ES6 (navigateurs modernes)
el.classList.add("foo", "bar", "baz");
juste utiliser ceci
element.getAttributeNode("class").value += " antherClass";
prendre soin de Space pour éviter de mélanger l'ancienne classe avec la nouvelle
Peut-être:
document.getElementById("myEle").className = "class1 class2";
Non testé, mais devrait fonctionner.
Dans les navigateurs modernes, l’API classList est supporté .
Cela permet une fonction JavaScript (Vanilla) comme ceci:
var addClasses;
addClasses = function (selector, classArray) {
'use strict';
var className, element, elements, i, j, lengthI, lengthJ;
elements = document.querySelectorAll(selector);
// Loop through the elements
for (i = 0, lengthI = elements.length; i < lengthI; i += 1) {
element = elements[i];
// Loop through the array of classes to add one class at a time
for (j = 0, lengthJ = classArray.length; j < lengthJ; j += 1) {
className = classArray[j];
element.classList.add(className);
}
}
};
Les navigateurs modernes (et non IE) prennent en charge la transmission de plusieurs arguments à la fonction classList::add
, ce qui supprimerait la nécessité de la boucle imbriquée, ce qui simplifierait un peu la fonction:
var addClasses;
addClasses = function (selector, classArray) {
'use strict';
var classList, className, element, elements, i, j, lengthI, lengthJ;
elements = document.querySelectorAll(selector);
// Loop through the elements
for (i = 0, lengthI = elements.length; i < lengthI; i += 1) {
element = elements[i];
classList = element.classList;
// Pass the array of classes as multiple arguments to classList::add
classList.add.apply(classList, classArray);
}
};
Utilisation
addClasses('.button', ['large', 'primary']);
Version fonctionnelle
var addClassesToElement, addClassesToSelection;
addClassesToElement = function (element, classArray) {
'use strict';
classArray.forEach(function (className) {
element.classList.add(className);
});
};
addClassesToSelection = function (selector, classArray) {
'use strict';
// Use Array::forEach on NodeList to iterate over results.
// Okay, since we’re not trying to modify the NodeList.
Array.prototype.forEach.call(document.querySelectorAll(selector), function (element) {
addClassesToElement(element, classArray)
});
};
// Usage
addClassesToSelection('.button', ['button', 'button--primary', 'button--large'])
La fonction classList::add
empêchera plusieurs instances de la même classe CSS, contrairement à certaines réponses précédentes.
Ressources sur l'API classList:
Essaye ça:
function addClass(element, value) {
if(!element.className) {
element.className = value;
} else {
newClassName = element.className;
newClassName+= " ";
newClassName+= value;
element.className = newClassName;
}
}
Une logique similaire pourrait être utilisée pour créer une fonction removeClass.
Peut-être que cela vous aidera à apprendre:
//<![CDATA[
/* external.js */
var doc, bod, htm, C, E, addClassName, removeClassName; // for use onload elsewhere
addEventListener('load', function(){
doc = document; bod = doc.body; htm = doc.documentElement;
C = function(tag){
return doc.createElement(tag);
}
E = function(id){
return doc.getElementById(id);
}
addClassName = function(element, className){
var rx = new RegExp('^(.+\s)*'+className+'(\s.+)*$');
if(!element.className.match(rx)){
element.className += ' '+className;
}
return element.className;
}
removeClassName = function(element, className){
element.className = element.className.replace(new RegExp('\s?'+className), '');
return element.className;
}
var out = E('output'), mn = doc.getElementsByClassName('main')[0];
out.innerHTML = addClassName(mn, 'wow');
out.innerHTML = addClassName(mn, 'cool');
out.innerHTML = addClassName(mn, 'it works');
out.innerHTML = removeClassName(mn, 'wow');
out.innerHTML = removeClassName(mn, 'main');
}); // close load
//]]>
/* external.css */
html,body{
padding:0; margin:0;
}
.main{
width:980px; margin:0 auto;
}
<!DOCTYPE html>
<html xmlns='http://www.w3.org/1999/xhtml' xml:lang='en' lang='en'>
<head>
<meta http-equiv='content-type' content='text/html;charset=utf-8' />
<link type='text/css' rel='stylesheet' href='external.css' />
<script type='text/javascript' src='external.js'></script>
</head>
<body>
<div class='main'>
<div id='output'></div>
</div>
</body>
</html>
Vous pouvez ajouter et supprimer plusieurs classes de la même manière avec différentes méthodes intégrées:
const myElem = document.getElementById('element-id');
//add multiple classes
myElem.classList.add('class-one', 'class-two', 'class-three');
//remove multiple classes
myElem.classList.remove('class-one', 'class-two', 'class-three');