【问题标题】:Is it possible to set special styles to checkboxes when all of them are unchecked using only CSS?当仅使用 CSS 未选中所有复选框时,是否可以为复选框设置特殊样式?
【发布时间】:2017-12-19 10:18:27
【问题描述】:

将 CSS 应用于选中/未选中的复选框(使用 :checked)及其标签很简单。但是,当所有复选框都未选中时,我需要对所有复选框应用另一种样式。

这使用 JavaScript 实现起来相对简单,但我有一个小部件,我不想修改它,所以我想知道是否有 CSS 技巧。我怀疑没有,但总有人更聪明:)

PS 好吧,html 位看起来是这样的,没什么特别的:

<div>
    <input type=checkbox id=chkFilterMath>
      <span><label for=chkFilterMath>Math</label></span>
    <input type=checkbox id=chkFilterHist>
      <span><label for=chkFilterHist>History</label></span>
    ...
</div>

当前的 CSS 使用

input:not(:checked) + span label

选择器将样式应用于未选中的复选框/标签。

可以在这里找到一个简化的示例:https://jsfiddle.net/k56hz8va/ 我想在所有复选框都未选中时将color: black 设置为标签。

【问题讨论】:

  • @DavidThomas 我在上面添加了 html 和 css;足够的样式只会使所有未选中的复选框的标签(color:grey)变灰,除非所有复选框都未选中

标签: html css checkbox


【解决方案1】:

Lasciate ogni speranza, voi ch'entrate

没有。没有这样的 CSS 选择器允许根据后续元素的状态选择先前的 DOM 元素。详情请参阅Is there a “previous sibling” CSS selector?Is there a CSS parent selector? 帖子。

【讨论】:

    【解决方案2】:

    我使用了一个 hack: 隐藏输入本身,但保留标签。然后使用伪元素 ::before 插入一些图标来表示选中/未选中。

    这是一个演示:https://codepen.io/anon/pen/WdrdPE

    和代码:

    <input id="option_1" type="checkbox"><label for="option_1">thing 1</label>
    <input id="option_2" type="checkbox"><label for="option_2">thing 2</label>
    <input id="option_3" type="checkbox"><label for="option_3">thing 3</label>
    

    css:

    @import url('https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css');
    
    input {
      display:none;
    }
    label {
      display:block;
    }
    input:checked + label {
      color:red; 
    }
    
    label:before {
      content:"\f1db";
      margin-right:.3em;
      font-family:Fontawesome;
    }
    
    input:checked + label:before {
      content:"\f058";
      margin-right:.3em;
      font-family:Fontawesome;
    }
    

    【讨论】:

    • 恐怕你错过了重点:我知道如何将样式设置为选中/未选中的复选框及其标签,我想问当 all 其中未选中
    • 你说得对——我提出了完全不同的问题。对于您的想法,我会转向 JS
    【解决方案3】:

    @sashaikevich 的想法很棒,但需要一些工作才能解决您的问题。您可以在所有输入之后放置标签。这样您的 CSS 和 HTML 就会很庞大,但您将能够根据所有输入状态控制标签的样式。
    尝试运行下面的 sn-p。最新规则具有最高优先级,因此如果选中任何(至少一个)复选框,则标签为黑色。否则标签是红色的。

    [type=checkbox] {
      display: none;
    }
    
    #check-box-1:checked~[for=check-box-1] .glyphicon-unchecked,
    #check-box-2:checked~[for=check-box-2] .glyphicon-unchecked,
    #check-box-3:checked~[for=check-box-3] .glyphicon-unchecked,
    #check-box-1:not(:checked)~[for=check-box-1] .glyphicon-check,
    #check-box-2:not(:checked)~[for=check-box-2] .glyphicon-check,
    #check-box-3:not(:checked)~[for=check-box-3] .glyphicon-check
    {
      display: none;
    }
    
    [for] {
      color: red;
    }
    
    [type=checkbox]:checked~[for] {
      color: inherit;
    }
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
    <div class="check-box-set">
      <input id="check-box-1" type="checkbox" />
      <input id="check-box-2" type="checkbox" checked="checked" />
      <input id="check-box-3" type="checkbox" />
      <label for="check-box-1">
        <span class="glyphicon glyphicon-unchecked" aira-hidden="true"></span>
        <span class="glyphicon glyphicon-check" aira-hidden="true"></span>
        1
      </label>
      <label for="check-box-2">
        <span class="glyphicon glyphicon-unchecked" aira-hidden="true"></span>
        <span class="glyphicon glyphicon-check" aira-hidden="true"></span>
        2
      </label>
      <label for="check-box-3">
        <span class="glyphicon glyphicon-unchecked" aira-hidden="true"></span>
        <span class="glyphicon glyphicon-check" aira-hidden="true"></span>
        3
      </label>
    </div>

    在示例中,我使用 Bootstrap Glyphicons。但也可以使用其他 glyp、图像或 CSS 形状。

    【讨论】:

    • 啊哈!这就是我所期待的,一些非常聪明的把戏。如果我能适应我的需要,我会考虑这个并重新选择它作为接受(或评论为什么我不能这样做)
    • 好的,@YakovL。虽然我之前的回答被接受了,但我不能删除一个。
    猜你喜欢
    • 2010-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-28
    • 1970-01-01
    • 2014-09-14
    • 1970-01-01
    相关资源
    最近更新 更多