CSS-如何为选定的单选按钮标签设置样式?


139

我想为单选按钮的选定标签添加样式:

HTML:

<div class="radio-toolbar">
 <label><input type="radio" value="all" checked>All</label>
 <label><input type="radio" value="false">Open</label>
 <label><input type="radio" value="true">Archived</label>
</div>

的CSS

.radio-toolbar input[type="radio"] {display:none;}
.radio-toolbar label {
    background:Red;
    border:1px solid green;
    padding:2px 10px;
}
.radio-toolbar label + input[type="radio"]:checked { 
    background:pink !important;
}

有什么想法我做错了吗?

Answers:


295

.radio-toolbar input[type="radio"] {
  display: none;
}

.radio-toolbar label {
  display: inline-block;
  background-color: #ddd;
  padding: 4px 11px;
  font-family: Arial;
  font-size: 16px;
  cursor: pointer;
}

.radio-toolbar input[type="radio"]:checked+label {
  background-color: #bbb;
}
<div class="radio-toolbar">
  <input type="radio" id="radio1" name="radios" value="all" checked>
  <label for="radio1">All</label>

  <input type="radio" id="radio2" name="radios" value="false">
  <label for="radio2">Open</label>

  <input type="radio" id="radio3" name="radios" value="true">
  <label for="radio3">Archived</label>
</div>

首先,您可能想name在单选按钮上添加属性。否则,它们不属于同一组,可以检查多个单选按钮。

另外,由于我将标签放置为(单选按钮的)同级标签,因此必须使用idfor属性将它们关联在一起。


2
@Johncl是的。IE8没有实现:checked选择器。
森达维达斯

如果我不想选择input [type =“ radio”]或input [type =“ checkbox”]。仅在一条规则中执行并避免这样做的正确语法是:input [type =“ radio”],input [type =“ checkbox”]
fabregas88

@ fabregas88你可以添加一个CSS类的元素,然后.foo { ... }
森达维达斯

4
您刚刚杀死了键盘访问权限!希望您所有的用户都能身体健康。...现在,如果您只是将单选按钮保留在那里,而不使用它,display:none;那么浏览器将使其与键盘配合使用就可以了。
gcb 2015年

1
@gcb问题是如何隐藏标准单选按钮。我已经制作了这个原型jsbin.com/miwati/edit?html,css,output。单选按钮绝对位于标签后面。虽然可能不是最好的方法。
森那维达斯

29

如果您确实想将复选框放在标签内,请尝试添加一个额外的span标签,例如。

的HTML

<div class="radio-toolbar">
 <label><input type="radio" value="all" checked><span>All</span></label>
 <label><input type="radio" value="false"><span>Open</span></label>
 <label><input type="radio" value="true"><span>Archived</span></label>
</div>

的CSS

.radio-toolbar input[type="radio"]:checked ~ * { 
    background:pink !important;
}

这将为所选单选按钮的所有同级设置背景。


2
我更喜欢这种方法,尽管我使用了一个不同的选择器(如下所述,在此问题中,因为我想仅对选定项进行样式设置。“ +” 使我不必担心for属性
。– brichins

6

+当元素不是兄弟姐妹时,您正在使用相邻的兄弟姐妹选择器()。标签是输入的父级,而不是同级。

CSS无法根据其后代(也不能跟随其后的任何元素)选择元素。

您需要使用JavaScript来解决此问题。

或者,重新排列标记:

<input id="foo"><label for="foo"></label>

1

您可以将范围添加到html和css。

这是我的代码中的一个示例...

HTML(JSX):

<input type="radio" name="AMPM" id="radiostyle1" value="AM" checked={this.state.AMPM==="AM"} onChange={this.handleChange}/>  
<label for="radiostyle1"><span></span> am  </label>

<input type="radio" name="AMPM" id="radiostyle2" value="PM" checked={this.state.AMPM==="PM"} onChange={this.handleChange}/>
<label for="radiostyle2"><span></span> pm  </label>

使标准单选按钮在屏幕上消失并叠加自定义按钮图像的CSS:

input[type="radio"] {  
    opacity:0;                                      
}

input[type="radio"] + label {
    font-size:1em;
    text-transform: uppercase;
    color: white ;  
    cursor: pointer;
    margin:auto 15px auto auto;                    
}

input[type="radio"] + label span {
    display:inline-block;
    width:30px;
    height:10px;
    margin:1px 0px 0 -30px;                       
    cursor:pointer;
    border-radius: 20%;
}


input[type="radio"] + label span {
    background-color: #FFFFFF 
}


input[type="radio"]:checked + label span{
     background-color: #660006;  
}

0

由于当前尚无CSS解决方案来为父样式设置样式,因此我在这里使用了一个简单的jQuery来向标签中添加了带有已检查输入的类。

$(document).on("change","input", function(){
 $("label").removeClass("checkedlabel");
 if($(this).is(":checked")) $(this).closest("label").addClass("checkedlabel");
});

不要忘了给前检查输入的标签类checkedlabel


0

这是一个可访问的解决方案

label {
  position: relative;
}

label input {
  position: absolute;
  opacity: 0;
}

label:focus-within {
  outline: 1px solid orange;
}
<div class="radio-toolbar">
  <label><input type="radio" value="all" checked>All</label>
  <label><input type="radio" value="false">Open</label>
  <label><input type="radio" value="true">Archived</label>
</div>

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.