使用 querySelectorAll 改变多个元素的样式属性

IT技术 javascript html css
2021-02-24 01:54:10

我有以下功能,触发时会使 DIV 变为半透明。

function changeOpacity(el) {
    var elem = document.getElementById(el);
    elem.style.transition = "opacity 0.5s linear 0s";
    elem.style.opacity = 0.5;
}

但是,我希望此功能同时应用于多个 DIV。我尝试为每个 DIV 赋予相同的类名,然后使用,getElementsByClassName但无法弄清楚如何实现它。

querySelectorAll更合适,如果是这样,我将如何实施它?

3个回答

我会用 querySelectorAll 选择它们并循环它们。

function changeOpacity(className) {
    var elems = document.querySelectorAll(className);
    var index = 0, length = elems.length;
    for ( ; index < length; index++) {
        elems[index].style.transition = "opacity 0.5s linear 0s";
        elems[index].style.opacity = 0.5;
    }
}

编辑:正如评论所说,如果样式值不是动态的并且使用:

elems[index].classList.add('someclass');
只是为了简化它恕我直言。实际上它像你说的那样工作,但我注意到的一件事(不是反对你的正确解决方案,而是我没有解决的问题)是我忘记在我的函数调用中添加句号到类名(拍脑袋)
2021-04-23 01:54:10
@the12 没问题。乐于回答和帮助。我相信分号是必需的,即使您省略了初始化、条件或最终表达式块。三个块中没有一个是必需的,但两个分号是必需的。
2021-04-23 01:54:10
一项更改 - 需要在 var elems 行的末尾使用逗号而不是分号
2021-05-07 01:54:10
@the12 你指的是索引和长度吗?对于索引,真的没有理由,只是我一直这样做的方式。至于长度,那是出于性能原因。您很可能永远不会看到小长度的问题,但是elems.length当它在 for 语句中时每次循环时都会被调用,这会影响性能。最好在循环外获得长度并存储它。
2021-05-11 01:54:10
我没有发布(再次拍打头)
2021-05-19 01:54:10

另一种方法是使用forEach()ES6+

function changeOpacity(className) {
    document.querySelectorAll(className).forEach(el => {
        el.style.transition = "opacity 0.5s linear 0s";
        el.style.opacity = 0.5;
    });
}

当只需要更新一个样式属性时,我特别喜欢这种语法。例如,如果您只需要更改不透明度,而不需要更改过渡,则可以使用一行:

function setOpacity(className) {
    document.querySelectorAll(className).forEach(el => el.style.opacity = 0.5);
}

然后,您可以使用单独的方法来设置过渡:

function setTransition(className) {
   document.querySelectorAll(className).forEach(
       el => el.style.transition = "opacity 0.5s linear 0s";
   });
}

使用新的 ES6 Array.map() 循环遍历每个项目并更改属性

document.querySelectorAll(selector).map(item => {
item.style.transition = "opacity 0.5s linear 0s";
item.style.opacity = 0.5;
})