如何在不使用任何库的情况下通过javascript将多个CSS类分配给html元素?
Answers:
这是一种通过classList
(通过所有现代浏览器支持的方法,如此处其他答案所述)添加多个类的简单方法:
div.classList.add('foo', 'bar'); // add multiple classes
来自:https : //developer.mozilla.org/zh-CN/docs/Web/API/Element/classList#Examples
如果您有要添加到元素中的类名称数组,则可以使用ES6传播运算符classList.add()
通过以下一种方法将它们全部传递给它们:
let classesToAdd = [ 'foo', 'bar', 'baz' ];
div.classList.add(...classesToAdd);
请注意,并非所有的浏览器都支持ES6本身还,所以与任何其他ES6答案你可能需要使用像transpiler巴别塔,或者只是坚持ES5和使用像@ LayZee的上述解决方案。
至少有几种不同的方式:
var buttonTop = document.getElementById("buttonTop");
buttonTop.className = "myElement myButton myStyle";
buttonTop.className = "myElement";
buttonTop.className += " myButton myStyle";
buttonTop.classList.add("myElement");
buttonTop.classList.add("myButton", "myStyle");
buttonTop.setAttribute("class", "myElement");
buttonTop.setAttribute("class", buttonTop.getAttribute("class") + " myButton myStyle");
buttonTop.classList.remove("myElement", "myButton", "myStyle");
也许:
document.getElementById("myEle").className = "class1 class2";
未经测试,但应该可以。
只是用这个
element.getAttributeNode("class").value += " antherClass";
注意太空,避免将旧班级与新班级混为一谈
在现代浏览器中,classList API是受支持的。
这样就可以使用(原始)JavaScript函数,如下所示:
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);
}
}
};
现代浏览器(非IE)支持将多个参数传递给classList::add
函数,这将消除对嵌套循环的需要,从而简化了函数:
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);
}
};
用法
addClasses('.button', ['large', 'primary']);
功能版本
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'])
该classList::add
函数将防止同一CSS类的多个实例,而与先前的某些答案相反。
关于classList API的资源:
在Element.className += " MyClass";
不推荐的方法,因为它会随时添加这些类他们是否是退出与否。
就我而言,我正在上传图像文件并向其中添加类,现在每次上传图像时,它都会添加这些类,无论它们是否存在,
推荐的方式是 Element.classList.add("class1" , "class2" , "class3");
这种方式将不会添加多余的类(如果已经存在的话)。
也许这可以帮助您学习:
//<![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>