[英]How to use JavaScript to Alter CSS for Multiple Elements
我试图在选择后使用JavaScript来更改元素的背景颜色,并确保一次只有一个元素具有特定的背景颜色。 一旦用户选择了不同的元素,我希望选择的前一个元素被不同的背景颜色替换。 目前,我只能通过选择EACH元素来切换单个元素。 我需要能够选择一个元素并应用新的背景颜色,然后让JavaScript将以前活动元素的背景颜色更改为不同的颜色(少一点击)。
我想要做的是非常类似于现代导航栏或列表项目,其中一次只有一个元素是“活动的”并且具有与同一div,行等中的其他元素不同的背景颜色。
关于我的工作的注意事项我正在使用bootstrap,并且不希望在这个特定的项目中使用jQuery。
CSS:
<!DOCTYPE html>
<html lang="en">
<head>
<style>
h4 {
border: 1px solid black;
border-radius: 8px;
padding: 10px 2px 10px 2px;
margin: 20px 20px 0px 20px;
background-color: #F0F0F0;
border-color: #F8F8F8;
color: #505050;
cursor: pointer;
}
.active {
background-color: #99E6FF;
}
</style>
</head>
</html>
HTML:
<div id="pTwoRowOne">
<div class="row">
<div class="col-md-4 row row-centered">
<h4 id="techBio" class="test">Biology</h4>
</div>
<div class="col-md-4 row row-centered">
<h4 id="techCart" class="test">Cartography</h4>
</div>
<div class="col-md-4 row row-centered">
<h4 id="techChem" class="test">Chemistry</h4>
</div>
</div>
</div>
JavaScript的:
document.getElementById("techBio").onclick=function() {
document.getElementById("techBio").classList.toggle('active');
}
document.getElementById("techCart").onclick=function() {
document.getElementById("techCart").classList.toggle('active');
}
document.getElementById("techChem").onclick=function() {
document.getElementById("techChem").classList.toggle('active');
}
这里可以看到一个例子: http : //jsbin.com/fugogarove/1/edit?html,css,js,output
如果需要澄清,请告诉我。
是的,非常直截了当。
假设
classList
例
码
我重写了你的JavaScript,使它更干净一点,干了一点:
var techs = [].slice.call(document.querySelectorAll('#pTwoRowOne h4'));
function set_active(event) {
techs.forEach(function(tech){
if (event.target == tech) { return; }
tech.classList.remove('active');
});
event.target.classList.toggle('active');
}
techs.forEach(function(item) {
item.addEventListener('click', set_active);
});
一些解释
[].slice.call(document.querySelectorAll('#pTwoRowOne h4'));
- 我们使用它来将NodeList
的输出更改为Array
。 这允许我们以后使用forEach
。 querySelectorAll
返回一个NodeList
,其中包含与CSS选择器匹配的所有元素。 您可以使用更好的CSS选择器替换它,具体取决于您的环境。
addEventListener
是一种比迭代添加通过onclick +=
更好的方式来绑定事件监听器。 这也是ECMA5及更高版本中推荐的方式(据我所知)。
通过将元素查询设置为变量,您将能够将引用保留在内存中,而不是每次轮询DOM以更改元素。 这将使你的JavaScript略微加快,它再次只是它产生的更好,更清晰的代码版本。
更新
我重新设计了JS以使其更有意义。
假设你只有一个活动元素,你可以使用document.querySelector()
找到它 - 如果你可以有多个,你可以使用document.querySelectorAll()
并迭代它们。
简单案例:
function activate(event) { var active=document.querySelector('.active'); // activate the clicked element (even if it was already active) event.target.classList.add('active'); // deactivate the previously-active element (even if it was the clicked one => toggle) if (active) active.classList.remove('active'); } document.getElementById("techBio").addEventListener("click",activate); document.getElementById("techCart").addEventListener("click",activate); document.getElementById("techChem").addEventListener("click",activate);
h4 { border: 1px solid black; border-radius: 8px; padding: 10px 2px 10px 2px; margin: 20px 20px 0px 20px; background-color: #F0F0F0; border-color: #F8F8F8; color: #505050; cursor: pointer; } .active { background-color: #99E6FF; }
<div id="pTwoRowOne"> <div class="row"> <div class="col-md-4 row row-centered"> <h4 id="techBio" class="test">Biology</h4> </div> <div class="col-md-4 row row-centered"> <h4 id="techCart" class="test">Cartography</h4> </div> <div class="col-md-4 row row-centered"> <h4 id="techChem" class="test">Chemistry</h4> </div> </div> </div>
你可以这样做:
[].slice.call(document.querySelectorAll(".test")).forEach(function(element) {
element.addEventListener('click', function(event) {
if (activeElement = document.querySelector(".test.active")) {
activeElement.classList.remove("active");
};
event.target.classList.add('active');
});
});
基本上,首先我们从活动元素中删除active
类,然后将它添加到目标。
另一种类似但更简单的方法: jsBin ;)
var H4 = document.getElementsByClassName("test"), act;
[].forEach.call(H4, function(el){
el.addEventListener("click", function(){
if(act) act.classList.remove("active");
return (this.classList.toggle("active"), act=this);
});
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.