CSS 触发单选按钮的选中选择器后是否可以更改变量?
Are CSS Variable changes possible upon a radio button's checked selector being triggered?
我有以下 CodePen:Test LCD with CSS Variables,在其中单击带有特定数字的标签,根据我决定模仿BCD转7段显示译码器,模拟LCD显示...
我目前有 CSS 中提到的第一段方程式。单击 CSS 中的数字理论上应该会导致适当的四个 --input
变量填充一个脉冲(0 或 1),然后该方程式根据该段的方程式确定不透明度。 ..
段 A(顶部段)应更改如下:
- 0:在
- 1: 关闭
- 2:在
- 3:在
- 4: 关闭
- 5:在
- 6: 在
- 7: 在
- 8: 在
- 9: 在
其中 "on" 不透明度为 1,"off" 不透明度为 0.05。
然而,即使我们的初始默认值为 0(打开),点击 1 或 4 也不会改变段不透明度...
代码如下,谁能指出我做错了什么?非常感谢...
HTML:
<div id="led-screen">
<div class="digit">
<div class="segment segment-a"></div>
<div class="segment segment-b"></div>
<div class="segment segment-c"></div>
<div class="segment segment-d"></div>
<div class="segment segment-e"></div>
<div class="segment segment-f"></div>
<div class="segment segment-g"></div>
</div>
</div>
<div id="buttons">
<label class="digit-button" for="digit-7">7</label>
<label class="digit-button" for="digit-8">8</label>
<label class="digit-button" for="digit-9">9</label>
<label class="digit-button" for="digit-4">4</label>
<label class="digit-button" for="digit-5">5</label>
<label class="digit-button" for="digit-6">6</label>
<label class="digit-button" for="digit-1">1</label>
<label class="digit-button" for="digit-2">2</label>
<label class="digit-button" for="digit-3">3</label>
<label class="digit-button" for="digit-0">0</label>
<input type="radio" name="digit-radio" id="digit-0" checked="checked"/>
<input type="radio" name="digit-radio" id="digit-1" />
<input type="radio" name="digit-radio" id="digit-2" />
<input type="radio" name="digit-radio" id="digit-3" />
<input type="radio" name="digit-radio" id="digit-4" />
<input type="radio" name="digit-radio" id="digit-5" />
<input type="radio" name="digit-radio" id="digit-6" />
<input type="radio" name="digit-radio" id="digit-7" />
<input type="radio" name="digit-radio" id="digit-8" />
<input type="radio" name="digit-radio" id="digit-9" />
</div>
CSS:
:root {
--input_0: 0; /* z */
--input_1: 0; /* y */
--input_2: 0; /* x */
--input_3: 0; /* w */
--led_r: 42;
--led_g: 45;
--led_b: 34;
--led_o: 0;
--led_o_base: 0.95;
--led_o_offset: 0.05;
}
#led-screen {
background-color: #b7ac90;
width: 800px;
height: 200px;
display: block;
}
#digit-0:checked {
--input_0: 0;
--input_1: 0;
--input_2: 0;
--input_3: 0;
}
#digit-1:checked {
--input_0: 1;
--input_1: 0;
--input_2: 0;
--input_3: 0;
}
#digit-2:checked {
--input_0: 0;
--input_1: 1;
--input_2: 0;
--input_3: 0;
}
#digit-3:checked {
--input_0: 1;
--input_1: 1;
--input_2: 0;
--input_3: 0;
}
#digit-4:checked {
--input_0: 0;
--input_1: 0;
--input_2: 1;
--input_3: 0;
}
#digit-5:checked {
--input_0: 1;
--input_1: 0;
--input_2: 1;
--input_3: 0;
}
#digit-6:checked {
--input_0: 0;
--input_1: 1;
--input_2: 1;
--input_3: 0;
}
#digit-7:checked {
--input_0: 1;
--input_1: 1;
--input_2: 1;
--input_3: 0;
}
#digit-8:checked {
--input_0: 0;
--input_1: 0;
--input_2: 0;
--input_3: 1;
}
#digit-9:checked {
--input_0: 1;
--input_1: 0;
--input_2: 0;
--input_3: 1;
}
.digit {
width: 75px;
height: 150px;
float: right;
margin-right: 50px;
margin-top: 10px;
transform: skew(-5deg);
}
.segment-a {
position: relative;
left: 0;
top: 0;
--led_o: calc(((2 * var(--input_3) * var(--input_2) * var(--input_1) * var(--input_0)) - (2 * var(--input_3) * var(--input_2) * var(--input_0)) - (var(--input_3) * var(--input_1) * var(--input_0)) - (var(--input_3) * var(--input_1)) + (var(--input_3) * var(--input_0)) - (2 * var(--input_2) * var(--input_1) * var(--input_0)) + (var(--input_2) * var(--input_1)) + (2 * var(--input_2) * var(--input_0)) - var(--input_2) + (var(--input_1) * var(--input_0)) - var(--input_0) + 1) * var(--led_o_base) + var(--led_o_offset));
background-color: rgba(var(--led_r), var(--led_g), var(--led_b), var(--led_o));
/* 2wxyz-2wxz-wyz-wy+wz-2xyz+xy+2xz-x+yz-z+1 */
}
.segment-b {
position: relative;
transform: rotate(90deg);
left: 41px;
top: 21px;
}
.segment-c {
position: relative;
transform: rotate(90deg);
left: 41px;
top: 83px;
}
.segment-d {
position: relative;
left: 0;
top: 104px;
}
.segment-e {
position: relative;
transform: rotate(90deg);
left: -41px;
top: 43px;
}
.segment-f {
position: relative;
transform: rotate(90deg);
left: -41px;
top: -59px;
}
.segment-g {
position: relative;
left: 0;
top: -38px;
}
.segment {
width: 60px;
height: 20px;
}
用你的实际代码这是不可能的。来自 specification:
Custom properties are ordinary properties, so they can be declared on any element, are resolved with the normal inheritance and cascade rules, can be made conditional with @media and other conditional rules, can be used in HTML’s style attribute, can be read or set using the CSSOM, etc.
如您所见,自定义属性(即 CSS 变量)是普通属性,因此如果您没有使用继承的 parent/child 关系,则无法在不同元素之间共享值。
下面是一个基本示例,可以更好地理解该问题:
:root {
--c:red;
}
.box {
/* --c:blue (uncomment this to change the color)*/
}
.element {
background:var(--c);
height:50px;
}
.extra {
--c:green; /* this will do nothing */
}
<div class="box">
<div class="element"></div>
</div>
<div class="extra"></div>
在上面的示例中,更改 extra
中的自定义 属性 不会对 element
进行任何更改(这相当于您的输入元素)。如果您更改 box
中的值,您会影响 element
,因为它是父元素,我们将继承。
获得所需内容的唯一方法是确保您拥有 parent/child 关系,以便能够更改 属性。
这是一个您可以根据需要进行调整的简化示例:
:root {
--a:0;
--b:0;
--c:0;
}
.wrapper > div{
height:50px;
width:50px;
display:inline-block;
margin:10px;
}
.a {
background:rgb(calc(var(--a)*255),0,0);
}
.b {
background:rgb(calc(var(--b)*255),calc(var(--b)*255),0);
}
.c {
background:rgb(calc(var(--c)*255),0,calc(var(--c)*255));
}
#n1:checked ~ .wrapper {
--a:0;
--b:0;
--c:1;
}
#n2:checked ~ .wrapper {
--a:0;
--b:1;
--c:0;
}
#n3:checked ~ .wrapper {
--a:0;
--b:1;
--c:1;
}
#n4:checked ~ .wrapper {
--a:1;
--b:0;
--c:0;
}
#n5:checked ~ .wrapper {
--a:1;
--b:0;
--c:1;
}
<input type="radio" name="change" id="n1" >
<input type="radio" name="change" id="n2" >
<input type="radio" name="change" id="n3" >
<input type="radio" name="change" id="n4" >
<input type="radio" name="change" id="n5" >
<div class="wrapper">
<div class="a"></div>
<div class="b"></div>
<div class="c"></div>
</div>
更新
这是一个带有段着色的完整示例:
:root {
--s1:1;
--s2:1;
--s3:0;
--s4:1;
--s5:1;
--s6:1;
--s7:1;
}
.wrapper{
height:150px;
width:100px;
display:block;
margin:10px;
background:
linear-gradient(red,red) top /100% calc(var(--s1)*20px),
linear-gradient(red,red) bottom /100% calc(var(--s2)*20px),
linear-gradient(red,red) center /100% calc(var(--s3)*20px),
linear-gradient(red,red) top right /calc(var(--s4)*20px) 50%,
linear-gradient(red,red) top left /calc(var(--s5)*20px) 50%,
linear-gradient(red,red) bottom right/calc(var(--s6)*20px) 50%,
linear-gradient(red,red) bottom left /calc(var(--s7)*20px) 50%;
background-color:#000;
background-origin:content-box;
background-repeat:no-repeat;
padding:20px;
}
#n1:checked ~ .wrapper {
--s1:0;
--s2:0;
--s3:0;
--s4:1;
--s5:0;
--s6:1;
--s7:0;
}
#n2:checked ~ .wrapper {
--s1:1;
--s2:1;
--s3:1;
--s4:1;
--s5:0;
--s6:0;
--s7:1;
}
#n3:checked ~ .wrapper {
--s1:1;
--s2:1;
--s3:1;
--s4:1;
--s5:0;
--s6:1;
--s7:0;
}
#n4:checked ~ .wrapper {
--s1:0;
--s2:0;
--s3:1;
--s4:1;
--s5:1;
--s6:1;
--s7:0;
}
#n5:checked ~ .wrapper {
--s1:1;
--s2:1;
--s3:1;
--s4:0;
--s5:1;
--s6:1;
--s7:0;
}
#n6:checked ~ .wrapper {
--s1:1;
--s2:1;
--s3:1;
--s4:0;
--s5:1;
--s6:1;
--s7:1;
}
#n7:checked ~ .wrapper {
--s1:1;
--s2:0;
--s3:0;
--s4:1;
--s5:0;
--s6:1;
--s7:0;
}
#n8:checked ~ .wrapper {
--s1:1;
--s2:1;
--s3:1;
--s4:1;
--s5:1;
--s6:1;
--s7:1;
}
#n9:checked ~ .wrapper {
--s1:1;
--s2:1;
--s3:1;
--s4:1;
--s5:1;
--s6:1;
--s7:0;
}
<input type="radio" name="change" id="n1" >1
<input type="radio" name="change" id="n2" >2
<input type="radio" name="change" id="n3" >3
<input type="radio" name="change" id="n4" >4
<input type="radio" name="change" id="n5" >5
<input type="radio" name="change" id="n6" >6
<input type="radio" name="change" id="n7" >7
<input type="radio" name="change" id="n8" >8
<input type="radio" name="change" id="n9" >9
<div class="wrapper">
</div>
获取有关 CSS 变量范围的更多详细信息的相关问题:CSS scoped custom property ignored when used to calc var in outer scope
我有以下 CodePen:Test LCD with CSS Variables,在其中单击带有特定数字的标签,根据我决定模仿BCD转7段显示译码器,模拟LCD显示...
我目前有 CSS 中提到的第一段方程式。单击 CSS 中的数字理论上应该会导致适当的四个 --input
变量填充一个脉冲(0 或 1),然后该方程式根据该段的方程式确定不透明度。 ..
段 A(顶部段)应更改如下:
- 0:在
- 1: 关闭
- 2:在
- 3:在
- 4: 关闭
- 5:在
- 6: 在
- 7: 在
- 8: 在
- 9: 在
其中 "on" 不透明度为 1,"off" 不透明度为 0.05。
然而,即使我们的初始默认值为 0(打开),点击 1 或 4 也不会改变段不透明度...
代码如下,谁能指出我做错了什么?非常感谢...
HTML:
<div id="led-screen">
<div class="digit">
<div class="segment segment-a"></div>
<div class="segment segment-b"></div>
<div class="segment segment-c"></div>
<div class="segment segment-d"></div>
<div class="segment segment-e"></div>
<div class="segment segment-f"></div>
<div class="segment segment-g"></div>
</div>
</div>
<div id="buttons">
<label class="digit-button" for="digit-7">7</label>
<label class="digit-button" for="digit-8">8</label>
<label class="digit-button" for="digit-9">9</label>
<label class="digit-button" for="digit-4">4</label>
<label class="digit-button" for="digit-5">5</label>
<label class="digit-button" for="digit-6">6</label>
<label class="digit-button" for="digit-1">1</label>
<label class="digit-button" for="digit-2">2</label>
<label class="digit-button" for="digit-3">3</label>
<label class="digit-button" for="digit-0">0</label>
<input type="radio" name="digit-radio" id="digit-0" checked="checked"/>
<input type="radio" name="digit-radio" id="digit-1" />
<input type="radio" name="digit-radio" id="digit-2" />
<input type="radio" name="digit-radio" id="digit-3" />
<input type="radio" name="digit-radio" id="digit-4" />
<input type="radio" name="digit-radio" id="digit-5" />
<input type="radio" name="digit-radio" id="digit-6" />
<input type="radio" name="digit-radio" id="digit-7" />
<input type="radio" name="digit-radio" id="digit-8" />
<input type="radio" name="digit-radio" id="digit-9" />
</div>
CSS:
:root {
--input_0: 0; /* z */
--input_1: 0; /* y */
--input_2: 0; /* x */
--input_3: 0; /* w */
--led_r: 42;
--led_g: 45;
--led_b: 34;
--led_o: 0;
--led_o_base: 0.95;
--led_o_offset: 0.05;
}
#led-screen {
background-color: #b7ac90;
width: 800px;
height: 200px;
display: block;
}
#digit-0:checked {
--input_0: 0;
--input_1: 0;
--input_2: 0;
--input_3: 0;
}
#digit-1:checked {
--input_0: 1;
--input_1: 0;
--input_2: 0;
--input_3: 0;
}
#digit-2:checked {
--input_0: 0;
--input_1: 1;
--input_2: 0;
--input_3: 0;
}
#digit-3:checked {
--input_0: 1;
--input_1: 1;
--input_2: 0;
--input_3: 0;
}
#digit-4:checked {
--input_0: 0;
--input_1: 0;
--input_2: 1;
--input_3: 0;
}
#digit-5:checked {
--input_0: 1;
--input_1: 0;
--input_2: 1;
--input_3: 0;
}
#digit-6:checked {
--input_0: 0;
--input_1: 1;
--input_2: 1;
--input_3: 0;
}
#digit-7:checked {
--input_0: 1;
--input_1: 1;
--input_2: 1;
--input_3: 0;
}
#digit-8:checked {
--input_0: 0;
--input_1: 0;
--input_2: 0;
--input_3: 1;
}
#digit-9:checked {
--input_0: 1;
--input_1: 0;
--input_2: 0;
--input_3: 1;
}
.digit {
width: 75px;
height: 150px;
float: right;
margin-right: 50px;
margin-top: 10px;
transform: skew(-5deg);
}
.segment-a {
position: relative;
left: 0;
top: 0;
--led_o: calc(((2 * var(--input_3) * var(--input_2) * var(--input_1) * var(--input_0)) - (2 * var(--input_3) * var(--input_2) * var(--input_0)) - (var(--input_3) * var(--input_1) * var(--input_0)) - (var(--input_3) * var(--input_1)) + (var(--input_3) * var(--input_0)) - (2 * var(--input_2) * var(--input_1) * var(--input_0)) + (var(--input_2) * var(--input_1)) + (2 * var(--input_2) * var(--input_0)) - var(--input_2) + (var(--input_1) * var(--input_0)) - var(--input_0) + 1) * var(--led_o_base) + var(--led_o_offset));
background-color: rgba(var(--led_r), var(--led_g), var(--led_b), var(--led_o));
/* 2wxyz-2wxz-wyz-wy+wz-2xyz+xy+2xz-x+yz-z+1 */
}
.segment-b {
position: relative;
transform: rotate(90deg);
left: 41px;
top: 21px;
}
.segment-c {
position: relative;
transform: rotate(90deg);
left: 41px;
top: 83px;
}
.segment-d {
position: relative;
left: 0;
top: 104px;
}
.segment-e {
position: relative;
transform: rotate(90deg);
left: -41px;
top: 43px;
}
.segment-f {
position: relative;
transform: rotate(90deg);
left: -41px;
top: -59px;
}
.segment-g {
position: relative;
left: 0;
top: -38px;
}
.segment {
width: 60px;
height: 20px;
}
用你的实际代码这是不可能的。来自 specification:
Custom properties are ordinary properties, so they can be declared on any element, are resolved with the normal inheritance and cascade rules, can be made conditional with @media and other conditional rules, can be used in HTML’s style attribute, can be read or set using the CSSOM, etc.
如您所见,自定义属性(即 CSS 变量)是普通属性,因此如果您没有使用继承的 parent/child 关系,则无法在不同元素之间共享值。
下面是一个基本示例,可以更好地理解该问题:
:root {
--c:red;
}
.box {
/* --c:blue (uncomment this to change the color)*/
}
.element {
background:var(--c);
height:50px;
}
.extra {
--c:green; /* this will do nothing */
}
<div class="box">
<div class="element"></div>
</div>
<div class="extra"></div>
在上面的示例中,更改 extra
中的自定义 属性 不会对 element
进行任何更改(这相当于您的输入元素)。如果您更改 box
中的值,您会影响 element
,因为它是父元素,我们将继承。
获得所需内容的唯一方法是确保您拥有 parent/child 关系,以便能够更改 属性。
这是一个您可以根据需要进行调整的简化示例:
:root {
--a:0;
--b:0;
--c:0;
}
.wrapper > div{
height:50px;
width:50px;
display:inline-block;
margin:10px;
}
.a {
background:rgb(calc(var(--a)*255),0,0);
}
.b {
background:rgb(calc(var(--b)*255),calc(var(--b)*255),0);
}
.c {
background:rgb(calc(var(--c)*255),0,calc(var(--c)*255));
}
#n1:checked ~ .wrapper {
--a:0;
--b:0;
--c:1;
}
#n2:checked ~ .wrapper {
--a:0;
--b:1;
--c:0;
}
#n3:checked ~ .wrapper {
--a:0;
--b:1;
--c:1;
}
#n4:checked ~ .wrapper {
--a:1;
--b:0;
--c:0;
}
#n5:checked ~ .wrapper {
--a:1;
--b:0;
--c:1;
}
<input type="radio" name="change" id="n1" >
<input type="radio" name="change" id="n2" >
<input type="radio" name="change" id="n3" >
<input type="radio" name="change" id="n4" >
<input type="radio" name="change" id="n5" >
<div class="wrapper">
<div class="a"></div>
<div class="b"></div>
<div class="c"></div>
</div>
更新
这是一个带有段着色的完整示例:
:root {
--s1:1;
--s2:1;
--s3:0;
--s4:1;
--s5:1;
--s6:1;
--s7:1;
}
.wrapper{
height:150px;
width:100px;
display:block;
margin:10px;
background:
linear-gradient(red,red) top /100% calc(var(--s1)*20px),
linear-gradient(red,red) bottom /100% calc(var(--s2)*20px),
linear-gradient(red,red) center /100% calc(var(--s3)*20px),
linear-gradient(red,red) top right /calc(var(--s4)*20px) 50%,
linear-gradient(red,red) top left /calc(var(--s5)*20px) 50%,
linear-gradient(red,red) bottom right/calc(var(--s6)*20px) 50%,
linear-gradient(red,red) bottom left /calc(var(--s7)*20px) 50%;
background-color:#000;
background-origin:content-box;
background-repeat:no-repeat;
padding:20px;
}
#n1:checked ~ .wrapper {
--s1:0;
--s2:0;
--s3:0;
--s4:1;
--s5:0;
--s6:1;
--s7:0;
}
#n2:checked ~ .wrapper {
--s1:1;
--s2:1;
--s3:1;
--s4:1;
--s5:0;
--s6:0;
--s7:1;
}
#n3:checked ~ .wrapper {
--s1:1;
--s2:1;
--s3:1;
--s4:1;
--s5:0;
--s6:1;
--s7:0;
}
#n4:checked ~ .wrapper {
--s1:0;
--s2:0;
--s3:1;
--s4:1;
--s5:1;
--s6:1;
--s7:0;
}
#n5:checked ~ .wrapper {
--s1:1;
--s2:1;
--s3:1;
--s4:0;
--s5:1;
--s6:1;
--s7:0;
}
#n6:checked ~ .wrapper {
--s1:1;
--s2:1;
--s3:1;
--s4:0;
--s5:1;
--s6:1;
--s7:1;
}
#n7:checked ~ .wrapper {
--s1:1;
--s2:0;
--s3:0;
--s4:1;
--s5:0;
--s6:1;
--s7:0;
}
#n8:checked ~ .wrapper {
--s1:1;
--s2:1;
--s3:1;
--s4:1;
--s5:1;
--s6:1;
--s7:1;
}
#n9:checked ~ .wrapper {
--s1:1;
--s2:1;
--s3:1;
--s4:1;
--s5:1;
--s6:1;
--s7:0;
}
<input type="radio" name="change" id="n1" >1
<input type="radio" name="change" id="n2" >2
<input type="radio" name="change" id="n3" >3
<input type="radio" name="change" id="n4" >4
<input type="radio" name="change" id="n5" >5
<input type="radio" name="change" id="n6" >6
<input type="radio" name="change" id="n7" >7
<input type="radio" name="change" id="n8" >8
<input type="radio" name="change" id="n9" >9
<div class="wrapper">
</div>
获取有关 CSS 变量范围的更多详细信息的相关问题:CSS scoped custom property ignored when used to calc var in outer scope