css 选中复选框时更改父标签背景

hmae6n7t  于 2023-01-18  发布在  其他
关注(0)|答案(1)|浏览(132)

我希望选区(:checked)具有不同的背景颜色。
下面是我的示例代码:

label {
  display: block;
  background: gray;
  border:1px solid black;
  margin-bottom:5px;
  padding:10px;
  cursor: pointer;
}

label + [type="checkbox"]:checked {
  background: yellow;
}
<div class="poll">
  <label class="a"><input type="checkbox" /> Yes</label>
  <label class="a"><input type="checkbox" /> No</label>
</div>

我的问题是关于:设计调查表
还要考虑这样一种情况,即输入在DOM中是预设的,但是隐藏了,所以标签仍然是可点击的,并且可以切换它。

qvk1mo1f

qvk1mo1f1#

您可以使用:has伪选择器执行以下操作:

label {
  display: block;
  background: gray;
  border:1px solid black;
  margin-bottom:5px;
  padding:10px;
  cursor: pointer;
  user-select: none;
}

label:has([type="checkbox"]:checked) {
  background: yellow;
}
<div class="poll">
  <label class="a"><input type="checkbox" /> Yes</label>
  <label class="a"><input type="checkbox" /> No</label>
</div>

如果您需要浏览器向后兼容性支持,这里有一个技巧:

一个二个一个一个

OP在评论中问我一个为隐藏复选框量身定制的解决方案。

所需要做的就是在输入上使用hidden属性。
不要使用CSS display: none来不呈现输入元素。最好使用designated attribute
💡 注意这在Firefox中也有一个bug。下面是一个克服它的Firefox黑客。

label {
  display: block;
  background: gray;
  border:1px solid black;
  margin-bottom:5px;
  padding:10px;
  cursor: pointer;
  user-select: none;
}

label:has([type="checkbox"]:checked) {
  background: yellow;
}
<div class="poll">
  <label><input type="checkbox" hidden /> Yes</label>
  <label><input type="checkbox" hidden /> No</label>
</div>

Firefox支持的解决方案:

将每个input提取到label元素之上,并在每个input元素上使用唯一的id属性,在每个label上使用匹配的for属性:

label {
  display: block;
  background: gray;
  border:1px solid black;
  margin-bottom:5px;
  padding:10px;
  cursor: pointer;
  user-select: none;
}

:checked + label {
  background: yellow;
}
<div class="poll">
  <input type="checkbox" id='poll-1' hidden/>
  <label for='poll-1'>Yes</label>

  <input type="checkbox" id='poll-2' hidden/>
  <label for='poll-2'>No</label>
</div>

相关问题