javascript - 为什么 CSS 自定义属性的级联不起作用?
问题描述
我在这里有一个完整的工作 CodePen显示问题。我正在使用这样的 CSS 自定义属性:
:root {
--global-primary-colour-hue: 211;
--global-primary-colour-saturation: 100%;
--global-primary-colour-lightness: 50%;
--global-primary-colour-opacity: 1;
--global-primary-colour: hsla(
var(--global-primary-colour-hue),
var(--global-primary-colour-saturation),
var(--global-primary-colour-lightness),
var(--global-primary-colour-opacity));
}
.box {
background-color: var(--global-primary-colour);
height: 100px;
width: 100px;
}
然后我设置了一个范围滑块和框来在我的 HTML 中显示颜色:
<input id="hue-range" value="0" type="range" min="0" max="360">
<div class="box"></div>
最后我想使用范围滑块来驱动--global-primary-colour-hue
属性。我可以让它像这样工作:
var element = document.getElementById("hue-range");
element.onchange = function(){
document.body.style.setProperty(
"--global-primary-colour-hue",
this.value.toString());
// Why does the box stop changing colour when I comment out this line?
document.body.style.setProperty(
"--global-primary-colour",
"hsla(var(--global-primary-colour-hue),var(--global-primary-colour-saturation),var(--global-primary-colour-lightness),var(--global-primary-colour-opacity))");
}
我的问题是,为什么我必须设置--global-primary-colour
属性?当我取消注释最后一行时,框中的颜色不再改变。
解决方案
在您的脚本中,您正在为body
元素设置自定义属性。但是,在您的样式表中,您的自定义属性都(像往常一样)为:root
元素html
指定。所以 的值--global-primary-colour-hue
不变:root
,而 的值--global-primary-colour
又保持不变。然后这个不变的值被body
and继承.box
——新的值--global-primary-colour-hue
最终永远不会被使用。
document.documentElement
在脚本中设置属性 for ,或者将 CSS 规则更改为 target body
,可以让您的代码正常工作,而无需最后一行:
var element = document.getElementById("hue-range");
element.onchange = function(){
document.documentElement.style.setProperty(
"--global-primary-colour-hue",
this.value);
}
:root {
--global-primary-colour-hue: 211;
--global-primary-colour-saturation: 100%;
--global-primary-colour-lightness: 50%;
--global-primary-colour-opacity: 1;
--global-primary-colour: hsla(
var(--global-primary-colour-hue),
var(--global-primary-colour-saturation),
var(--global-primary-colour-lightness),
var(--global-primary-colour-opacity));
}
.box {
background-color: var(--global-primary-colour);
height: 100px;
width: 100px;
}
<input id="hue-range" value="0" type="range" min="0" max="360">
<div class="box"></div>
推荐阅读
- python - 使用 peewee ORM 在带有表字段的字符串文字中搜索
- javascript - 如何动态构建有效的 JSON 结构,如以下伪结构?
- java - 在文档中搜索子字符串时读取较低的 Firestore 查询
- sql - 在 django 模型表 postgres 中添加列
- javascript - 按属性值对对象的对象进行排序(通过元组传递)
- javascript - 如何在 NodeJS 中找出流的大小?
- javascript - Javascript填充字典数组并排序以对齐字典键
- networking - Proxmox 虚拟机 OpenVPN 客户端不工作 (KVM)
- python - 写入 netcdf 时重命名 xarray 变量恢复为旧变量
- angular - 检测 Angular 中验证器的变化