我有一个CSS自定义属性,我正在try 使用普通的JavaScript动态更改该属性.我已经创建了一个新的CSSStyleSheet对象,并且已经使用下面的代码向其添加了样式.

let sheet = new CSSStyleSheet();
sheet.insertRule(".color3.shade500 {--lightness: 0; --chroma: 0; --hue: 0}");

我遇到的问题是,我想在给定的CSSStyleRule范围内更改单个属性,但我没有任何运气.需要根据页面上输入的值来更改这些值.我可以使用下面的代码访问正确的CSSStyleRule,该代码是for循环的一部分.

console.log(sheet.rules[y].selectorText);

这会导致将以下内容打印到控制台:

CSSStyleRule {selectorText: '.color3.shade500', style: CSSStyleDeclaration, styleMap: StylePropertyMap, cssRules: CSSRuleList, type: 1, ...}
  cssRules: CSSRuleList {length: 0}
  cssText: ".color3.shade500 { --lightness: 0; --chroma: 0; --hue: 0; }"
  parentRule: null
  parentStyleSheet: CSSStyleSheet {ownerRule: null, cssRules: CSSRuleList, rules: CSSRuleList, type: 'text/css', href: null, ...}
  selectorText: ".color3.shade500"
  style: CSSStyleDeclaration {0: '--lightness', 1: '--chroma', 2: '--hue', accentColor: '', additiveSymbols: '', alignContent: '', alignItems: '', alignSelf: '', ...}
  styleMap: StylePropertyMap {size: 3}
  type: 1
  [[Prototype]]: CSSStyleRule

我的问题是,我应该使用什么命令来更新单个属性,而不考虑规则中的其他属性?我在Mozilla开发者网站here上找到了关于CSSStyleSheet函数的文档,但我还没有成功地try 实现replace()函数,我也不知道这是不是应该使用的正确函数.

推荐答案

这可以通过对CSSStyleDeclaration对象使用setProperty()方法来完成.CSSStyleDeclaration接口表示一个作为CSS声明块的对象,并公开样式信息和各种与样式相关的方法和属性.在你的问题中,你分享了

console.log(sheet.rules[y].selectorText)

它包含作为第六个键/值对的CSSStyleDeclaration对象.要访问该对象,我们可以通过使用

document.styleSheets[x].cssRules[y].style

在您的问题中,您已经在sheet变量中包含了CSSStyleSheet,所以我们将其重写为

sheet.cssRules[y].style

然后,我们可以修改现有的css定制属性,或者使用setProperty()方法在声明块中创建一个新的属性(如果它还没有键/值对).CSSStyleDeclaration.setProperty()方法接口为CSS样式声明对象上的属性设置新值.

Syntax

setProperty(propertyName, value)
setProperty(propertyName, value, priority)

参数

propertyName

一个字符串,表示要修改的CSS属性名称(连字符大小写).

value个可选

包含新属性值的字符串.如果未指定,则将其视为空字符串.

priority个可选

允许设置!important css优先级的字符串.如果未指定此项,则将其视为空字符串.接受下列值:

  • 字符串值"important"
  • 关键词undefined
  • 字符串空值""

返回值

无(undefined)

例外情况

NoModificationAllowedError DOMException 如果属性或声明块是只读的,则会引发此错误.

Alternative Usage

如果可以省略priority,则可以使用以下语法:

Style.cssPropertyName="Value";

SOLUTION

根据您的问题、代码样例和 comments ,您正在try 实现的内容听起来与MDN Web文档的setProperty文档页面上列出的示例非常相似.

在您的项目中,有三个可以设置为在调色板生成器中动态更改色样亮度、色度和色相的输入.

我们知道,为了实现这一点需要更改的规则包含在您创建并存储在sheet变量中的CSSStyleSheet中.因此,我们可以遍历该样式表中包含的规则,这些规则位于stylesheet.cssRules数组中.对于每个 Select 器,我们将判断其CSSStyleRule.electorText属性是否等于 Select 器.color3.shade500,这就是我们要寻找的 Select 器.

如果找到匹配项,则需要在变量中存储对此CSSStyleRule对象的引用.然后,我们可以使用新值更新规则.这是使用setProperty()方法完成的.

if (".color3.shade500" === sheet.cssRules[y].selectorText) {
  let styleInstance = sheet.cssRules[y].style;
  styleInstance.setProperty("--lightness", lightness);
}

CSSStyleSheet CSSStyleDeclaration setProperty()

Javascript相关问答推荐

如何在Jest中调用setupFile下列出的文件所需的函数?

为什么函数不使用以前函数返回的参数?

setFinder关闭模式并重定向到url

将音频记录从js发送到activx-web服务器以保存到磁盘

如何解决(不忽略)reaction详尽的linter规则,而不会在获取数据时导致无限的reender循环

如何指定1条记录1个表?

使用CDO时如何将Vue组件存储在html之外?

如何用显示网格平滑地将元素从一个地方移动到另一个地方?

togglePopover()不打开但不关闭原生HTML popover'

使用javascript将Plotly Expandable Sparkline转换为HighCharter Plot在bslib卡中

在JS中拖放:检测文件

PDF工具包阿拉伯字体的反转数字

提交链接到AJAX数据结果的表单

JS:XML insertBefore插入元素

正则表达式,允许我匹配除已定义的子字符串之外的所有内容

在使用位板时,如何在Java脚本中判断Connect 4板中中柱的对称性?

使用Nuxt Apollo在Piniastore 中获取产品细节

如何在箭头函数中引入or子句?

使用NextJS+MongoDB+Prisma ORM获取无效请求正文,无法发布错误

JavaScript:如果字符串不是A或B,则