javascript - 如何使用 JavaScript 改变多个元素的 CSS

标签 javascript css twitter-bootstrap dom

我正在尝试使用 JavaScript 在被选中后更改元素的背景颜色,并确保一次只有一个元素具有特定的背景颜色。一旦用户选择了不同的元素,我希望之前选择的元素被不同的背景颜色替换。目前我只能通过选择每个元素来切换单个元素。我需要能够选择一个元素并应用新的背景颜色,然后让 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

如果需要澄清,请告诉我。

最佳答案

是的,非常简单。

假设

  1. 您没有尝试支持 IE8,因为您使用的是 classList
  2. 您可以将元素作为变量存放,而不是反复查询 DOM。

示例

JSBin

代码

我重写了您的 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 的输出更改为一个数组。这允许我们稍后使用 forEachquerySelectorAll 返回一个 NodeList,其中包含与 CSS 选择器匹配的所有元素。根据您的环境,您可能可以用更好的 CSS 选择器替换它。

addEventListener 是一种比通过 onclick += 迭代添加绑定(bind)事件监听器更好的方法。这也是 ECMA5 及更高版本中推荐的方式(据我所知)。

通过将元素查询设置为变量,您将能够将引用保存在内存中,而不是每次都轮询 DOM 来更改元素。这将使您的 JavaScript 稍微快一些,并且它再次只是它生成的代码的一个更好、更干净的版本。

更新

我修改了 JS 以使其更有意义。

关于javascript - 如何使用 JavaScript 改变多个元素的 CSS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30605403/

相关文章:

javascript - JS 压缩 - PageSpeed(Google Chrome 报告)

html - IE 8/9 中的下拉列表宽度

javascript - 如何一次打开所有 Bootstrap Accordion 选项卡

javascript - 请问这样创建对象有什么效果吗?

javascript - 正则表达式 - 用点验证字母数字(强制)

css - 垂直对齐无台面

css - 在小型设备中查看时显示额外空间的旋转木马 slider

javascript - 页面加载后如何执行 jquery 动画滚动?

javascript - Zepto 回退到 jQuery

css - 样式化的 unicode 箭头未显示为 Google Fonts 网络字体