【发布时间】:2016-04-06 23:34:38
【问题描述】:
CSS Tricks 记录了一个叫做'the checkbox hack,' 的东西,其中元素的样式根据复选框是否被选中。通过设置 <label> 元素的样式来使用此功能,以使其显示为链接或按钮,并在单击时切换文档元素的样式。
在提供的demo 中,复选框紧跟在描述它的标签之后,这是我通常在其中看到标签的配置 - 紧随其后,紧随其后或封装它控制的表单元素。
但是,在我的特定用例场景中,我需要复选框的状态来设置跨多个 DOM 节点的多个元素的样式。由于 CSS 没有父选择器,并且复选框的状态与其控制的所有元素的样式密切相关,我认为有必要使用相关的 CSS 选择器,例如 ~ 或 + 来设置元素的样式。这需要将复选框放置在包含其标签的 DOM 节点之外:
/* Checkbox Hack */
input[type=checkbox] {
position: absolute;
top: -9999px;
left: -9999px;
}
label {
cursor: pointer;
}
/* Default State */
div {
background: green;
width: 400px;
height: 100px;
line-height: 100px;
color: white;
text-align: center;
}
/* Toggled State */
input[type=checkbox]:checked ~ div label {
color: red;
}
input[type=checkbox]:checked ~ div div {
background-color: red;
}
<input type="checkbox" id="toggle-1">
<div>
<label for="toggle-1">Toggle!</label>
</div>
<div>
<div>A second element</div>
</div>
虽然这有效(至少在 Chrome、IE、Waterfox 和 Vivaldi 中),但我的问题是关于 有效性。是否可以为远离该元素本身的表单元素放置 <label>,即使在同一个 DOM 节点之外?这样做是否会导致任何可用性问题?
【问题讨论】:
-
就 W3C 而言,除了典型的 label1 与 dom-element1 等问题之外,我没有看到其他问题……就合规性而言,我认为你还可以……只是“不是”正常'..但也不是用刀切纸,但它有效。
标签: html css dom checkbox forms