是否可以通过JavaScript更改CSS伪元素样式?
例如,我想动态设置滚动条的颜色,如下所示:
document.querySelector("#editor::-webkit-scrollbar-thumb:vertical").style.background = localStorage.getItem("Color");
我也希望能够像这样告诉滚动条隐藏:
document.querySelector("#editor::-webkit-scrollbar").style.visibility = "hidden";
然而,这两个脚本都返回:
未捕获的TypeError:无法读取null的属性'style'
还有其他方法可以解决这个问题吗? 跨浏览器的互操作性并不重要,我只需要它在webkit浏览器中工作。
答案 0 :(得分:27)
编辑: 在技术上是一种通过JavaScript直接更改CSS伪元素样式的方式,如this answer describes,但此处提供的方法更可取。
最接近改变JavaScript中伪元素的样式是添加和删除类,然后使用伪元素和这些类。隐藏滚动条的示例:
<强> CSS 强>
.hidden-scrollbar::-webkit-scrollbar {
visibility: hidden;
}
<强>的JavaScript 强>
document.getElementById("editor").classList.add('hidden-scrollbar');
要稍后删除同一个类,您可以使用:
document.getElementById("editor").classList.remove('hidden-scrollbar');
答案 1 :(得分:18)
要编辑您没有直接引用的现有文件,需要迭代页面上的所有样式表,然后迭代每个样式表中的所有规则,然后匹配选择器的字符串。
这是我发布的用于为伪元素添加新CSS的方法的引用,这是您从js设置的简易版本
Javascript set CSS :after styles
var addRule = (function (style) {
var sheet = document.head.appendChild(style).sheet;
return function (selector, css) {
var propText = typeof css === "string" ? css : Object.keys(css).map(function (p) {
return p + ":" + (p === "content" ? "'" + css[p] + "'" : css[p]);
}).join(";");
sheet.insertRule(selector + "{" + propText + "}", sheet.cssRules.length);
};
})(document.createElement("style"));
addRule("p:before", {
display: "block",
width: "100px",
height: "100px",
background: "red",
"border-radius": "50%",
content: "''"
});
sheet.insertRule
返回新规则的索引,您可以使用该索引获取对它的引用,稍后可以使用它来编辑它。
答案 2 :(得分:9)
如果您对旧浏览器中的某些优雅降级感到满意,则可以使用CSS Vars。绝对是我在这里和其他地方看过的最简单的方法。
所以在你的CSS中你可以写:
#editor {
--scrollbar-background: #ccc;
}
#editor::-webkit-scrollbar-thumb:vertical {
/* Fallback */
background-color: #ccc;
/* Dynamic value */
background-color: var(--scrollbar-background);
}
然后在你的JS中你可以在#editor元素上操作该值:
document.getElementById("#editor").style.setProperty('--scrollbar-background', localStorage.getItem("Color"));
在这里用JS操纵CSS变量的许多其他例子:https://eager.io/blog/communicating-between-javascript-and-css-with-css-variables/
答案 3 :(得分:5)
我通过使用CSS自定义属性来执行以下操作,从而更改了:: selection伪元素的背景:
/*CSS Part*/
:root {
--selection-background: #000000;
}
#editor::selection {
background: var(--selection-background);
}
//JavaScript Part
document.documentElement.style.setProperty("--selection-background", "#A4CDFF");
答案 4 :(得分:4)
您无法在JavaScript中将样式应用于psuedo-elements。
但是,您可以在文档的头部添加<style>
标记(或者拥有一个占位符<style id='mystyles'>
并更改其内容),这会调整样式。 (这比在另一个样式表中加载更好,因为嵌入的<style>
标记的优先级高于<link>
'标记,确保您不会遇到级联问题。
或者,您可以使用不同的类名,并在原始样式表中使用不同的伪元素样式定义它们。
答案 5 :(得分:3)
我发布了一个与此问题相似但不完全相似的问题。
我找到了一种方法来检索和更改伪元素的样式,并询问人们对该方法的看法。
我的问题是Retrieving or changing css rules for pseudo elements
基本上,您可以通过以下语句获取样式:
document.styleSheets[0].cssRules[0].style.backgroundColor
并改为:
document.styleSheets [0] .cssRules [0] .style.backgroundColor = newColor;
当然,您必须更改样式表和cssRules索引。阅读我的问题及其提出的评论。
我发现这适用于伪元素以及“常规”元素/样式。
答案 6 :(得分:0)
看起来querySelector不能用于伪类/伪元素,至少不适用于那些。我唯一能想到的是动态添加样式表(或更改现有样式表)来做你需要的。
这里有很多很好的例子: How do I load css rules dynamically in Webkit (Safari/Chrome)?
答案 7 :(得分:0)
一个古老的问题,但是在尝试动态更改元素:before
选择器内容的颜色时遇到了一个问题。
我能想到的最简单的解决方案是使用CSS变量,这种解决方案在提出问题时不适用:
"#editor::-webkit-scrollbar-thumb:vertical {
background: --editorScrollbarClr
}
更改JavaScript中的值:
document.body.style.setProperty(
'--editorScrollbarClr',
localStorage.getItem("Color")
);
对于其他属性也可以这样做。