如何使单选按钮看起来像切换按钮


73

我希望一组单选按钮看起来像一组切换按钮(但仍像单选按钮一样起作用)。它们不必看起来完全像切换按钮。

仅使用CSS和HTML怎么做?

编辑:当按钮被选中/取消选中时,我会很满意地使小圆圈消失并更改样式。


AFAIK样式单选按钮非常有限。您可能必须使用JavaScript才能完成此任务。
Andrew Whitaker

1
如果您愿意走出css / html的要求,请访问:awardwinningfjords.com/2009/06/16/iphone-style-checkboxes.html
机器人伍兹

Answers:


117

根据要支持的浏览器,除了隐藏单选按钮之外,还可以使用:checked伪类选择器。

使用此HTML:

<input type="radio" id="toggle-on" name="toggle" checked
><label for="toggle-on">On</label
><input type="radio" id="toggle-off" name="toggle"
><label for="toggle-off">Off</label>

您可以使用类似以下CSS的内容:

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

input[type="radio"].toggle:checked + label {
  /* Do something special with the selected state */
}

例如,(保持自定义CSS简介)如果你使用引导程序,您可以添加class="btn"到您的<label>元素和风格他们适当地创建切换,看起来像:

自举辅助无线电切换

...仅需要以下附加CSS:

input[type="radio"].toggle:checked + label {
  background-image: linear-gradient(to top,#969696,#727272);
  box-shadow: inset 0 1px 6px rgba(41, 41, 41, 0.2),
                    0 1px 2px rgba(0, 0, 0, 0.05);
  cursor: default;
  color: #E6E6E6;
  border-color: transparent;
  text-shadow: 0 1px 1px rgba(40, 40, 40, 0.75);
}

input[type="radio"].toggle + label {
  width: 3em;
}

input[type="radio"].toggle:checked + label.btn:hover {
  background-color: inherit;
  background-position: 0 0;
  transition: none;
}

input[type="radio"].toggle-left + label {
  border-right: 0;
  border-top-right-radius: 0;
  border-bottom-right-radius: 0;
}

input[type="radio"].toggle-right + label {
  border-top-left-radius: 0;
  border-bottom-left-radius: 0;
}

我已经在单选按钮切换jsFiddle演示中包括了此功能以及其他后备样式。请注意,:checked仅IE 9支持此方法,因此此方法仅限于更新的浏览器。

但是,如果您需要支持IE 8并愿意使用JavaScript *,则可以轻松获得伪支持:checked(尽管此时您可以轻松地直接在标签上设置类)。

使用一些快速且肮脏的jQuery代码作为解决方法的示例

$('.no-checkedselector').on('change', 'input[type="radio"].toggle', function () {
    if (this.checked) {
        $('input[name="' + this.name + '"].checked').removeClass('checked');
        $(this).addClass('checked');
        // Force IE 8 to update the sibling selector immediately by
        // toggling a class on a parent element
        $('.toggle-container').addClass('xyz').removeClass('xyz');
    }
});
$('.no-checkedselector input[type="radio"].toggle:checked').addClass('checked');

然后,您可以对CSS进行一些更改以完成操作:

input[type="radio"].toggle {
  /* IE 8 doesn't seem to like to update radio buttons that are display:none */
  position: absolute;
  left: -99em;
}

input[type="radio"].toggle:checked + label,
input[type="radio"].toggle.checked + label {
  /* Do something special with the selected state */
}

*如果您使用的是Modernizr,则可以使用:selector测试来帮助确定是否需要后备。我在示例代码中将测试称为“ checkedselector”,随后仅在测试失败时才设置jQuery事件处理程序。


优秀的。多谢您的宝贵提示+1
汗·陈

62

这是上面发布的那个不错的CSS解决方案JS Fiddle示例的我的版本。

http://jsfiddle.net/496c9/

的HTML

<div id="donate">
    <label class="blue"><input type="radio" name="toggle"><span>$20</span></label>
    <label class="green"><input type="radio" name="toggle"><span>$50</span></label>
    <label class="yellow"><input type="radio" name="toggle"><span>$100</span></label>
    <label class="pink"><input type="radio" name="toggle"><span>$500</span></label>
    <label class="purple"><input type="radio" name="toggle"><span>$1000</span></label>
</div>

的CSS

body {
    font-family:sans-serif;
}

#donate {
    margin:4px;

    float:left;
}

#donate label {
    float:left;
    width:170px;
    margin:4px;
    background-color:#EFEFEF;
    border-radius:4px;
    border:1px solid #D0D0D0;
    overflow:auto;

}

#donate label span {
    text-align:center;
    font-size: 32px;
    padding:13px 0px;
    display:block;
}

#donate label input {
    position:absolute;
    top:-20px;
}

#donate input:checked + span {
    background-color:#404040;
    color:#F7F7F7;
}

#donate .yellow {
    background-color:#FFCC00;
    color:#333;
}

#donate .blue {
    background-color:#00BFFF;
    color:#333;
}

#donate .pink {
    background-color:#FF99FF;
    color:#333;
}

#donate .green {
    background-color:#A3D900;
    color:#333;
}
#donate .purple {
    background-color:#B399FF;
    color:#333;
}

用彩色按钮样式:)


这正是我想要的。谢谢!
Patrick E. 2014年

我尝试使用您的代码,例如,单击jsfiddle.net/496c9/764上的底部按钮时,窗口滚动将移至顶部,可以对此做些什么?
2014年

普尼特-检查这一个可能的答案... stackoverflow.com/questions/3252730/...
西蒙·达比

为避免滚动问题,将以下内容添加到“ #donate标签”中-显示:块;位置:相对;溢出:隐藏;
Co7e

2
旧的,但似乎visibility:hidden可以代替offscreen hackie代替`top:-20px;`dovisibility:hidden
oak

24

带有动画的纯CSS和HTML(根据要求)!

示例图片(您可以运行以下代码):

纯CSS和HTML中的切换按钮(单选和复选框)

在寻找了真正干净,直接的东西之后,我最终对另一个仅考虑复选框的代码进行了一个简单的更改就构建了该代码,因此我尝试了RADIOS的功能,它也起作用了(!)。

CSS(SCSS)完全来自@mallendeo(根据JS学分建立),我所做的只是将输入的类型更改为RADIO,并为所有无线电开关赋予了相同的名称....和VOILA! !它们会自动彼此停用!!

很干净,而且正如您所问的那样,只有CSS和HTML!

正是在尝试和编辑了十多个选项(大多数情况下需要jQuery,或者不允许使用标签,甚至与当前浏览器真正不兼容的选项)三天后,这正是我一直在寻找的东西。这就是全部!

我有义务在此处包含代码,以使您看到一个有效的示例,因此:

如果您运行该代码段,则会看到我将iOS收音机保持选中状态并处于禁用状态,因此您可以观察一下激活另一个收音机时它也会受到的影响。我还为每个收音机包括2个标签,一个在标签上,一个在标签上。还包括原始代码的副本,以在同一窗口中显示工作复选框。


3
给我留下深刻的印象。专注于你。:)
rmcsharry

17

这是适用于所有浏览器的解决方案(也是IE7和IE8;未检查IE6):

http://jsfiddle.net/RkvAP/230/

的HTML

<div class="toggle">
    <label><input type="radio" name="toggle"><span>On</span></label>    
</div>
<div class="toggle">
    <label><input type="radio" name="toggle"><span>Off</span></label>
</div>

JS

$('label').click(function(){
    $(this).children('span').addClass('input-checked');
    $(this).parent('.toggle').siblings('.toggle').children('label').children('span').removeClass('input-checked');
});

的CSS

body {
    font-family:sans-serif;
}

.toggle {
    margin:4px;
    background-color:#EFEFEF;
    border-radius:4px;
    border:1px solid #D0D0D0;
    overflow:auto;
    float:left;
}

.toggle label {
    float:left;
    width:2.0em;
}

.toggle label span {
    text-align:center;
    padding:3px 0px;
    display:block;
    cursor: pointer;
}

.toggle label input {
    position:absolute;
    top:-20px;
}

.toggle .input-checked /*, .bounds input:checked + span works for firefox and ie9 but breaks js for ie8(ONLY) */ {
    background-color:#404040;
    color:#F7F7F7;
}

利用最小的JS(jQuery,两行)。


减一,因为问题明确规定:仅CSS和HTML
DavidTaubmann

.toggle label input在Chrome中看起来也可以使用 .toggle label input { display:none }
Mobigital '18

该解决方案旨在支持IE8和IE7。我猜现在不需要了:-)
Michal B.18年

2

受Michal B.的启发。如果您使用引导程序。

label.btn {
  padding: 0;
}

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

label.btn span {
  text-align: center;
  padding: 6px 12px;
  display: block;
}

label.btn input:checked+span {
  background-color: rgb(80, 110, 228);
  color: #fff;
}
<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous">
<div>
  <label class="btn btn-outline-primary"><input type="radio" name="toggle"><span>One</span></label>
  <label class="btn btn-outline-primary"><input type="radio" name="toggle"><span>Two</span></label>
  <label class="btn btn-outline-primary"><input type="radio" name="toggle"><span>Three</span></label>
</div>


1

我通常使用CSS隐藏真正的单选按钮(或将它们变成单独的隐藏输入),放入所需的图像中(可以使用无序列表,并将样式应用于li元素),然后使用click事件切换输入。这种方法还意味着您可以使那些不在普通Web浏览器上的用户可以访问它们-默认情况下只需隐藏ul并显示单选按钮即可。


0

我知道这是一个古老的问题,但是由于我只是想这样做,所以我想我将发布最终的内容。因为我使用的是Bootstrap,所以我选择了Bootstrap选项。

的HTML

<div class="col-xs-12">
    <div class="form-group">
        <asp:HiddenField ID="hidType" runat="server" />
        <div class="btn-group" role="group" aria-label="Selection type" id="divType">
            <button type="button" class="btn btn-default BtnType" data-value="1">Food</button>                        
            <button type="button" class="btn btn-default BtnType" data-value="2">Drink</button>
        </div>
    </div>
</div>

jQuery的

$(document).ready(function () {
    $('#divType button').click(function () {
        $(this).addClass('active').siblings().removeClass('active');
        $('#<%= hidType.ClientID%>').val($(this).data('value'));
        //alert($(this).data('value'));             
    });
});

我选择将值存储在一个隐藏字段中,这样我就可以轻松获取服务器端的值。


-2

$(document).ready(function () {
    $('#divType button').click(function () {
        $(this).addClass('active').siblings().removeClass('active');
        $('#<%= hidType.ClientID%>').val($(this).data('value'));
        //alert($(this).data('value'));             
    });
});
<div class="col-xs-12">
    <div class="form-group">
        <asp:HiddenField ID="hidType" runat="server" />
        <div class="btn-group" role="group" aria-label="Selection type" id="divType">
            <button type="button" class="btn btn-default BtnType" data-value="1">Food</button>                        
            <button type="button" class="btn btn-default BtnType" data-value="2">Drink</button>
        </div>
    </div>
</div>


您好,欢迎来到。您对将近10岁的问题感到困惑。除此之外,您的解决方案似乎会在C&P的问题上给出不必要的答案。然后,它无法满足OP的实际需求(您不起诉单选按钮,而且根本不需要JS)。最后但并非最不重要的一点是,您应该知道,您的代码段已经输出了JS解析错误。因此,我认为您的答案是“低质量”和垃圾邮件。
tacoshy

-4

HTML:

<div>
    <label> <input type="radio" name="toggle"> On </label>
    <label> Off <input type="radio" name="toggle"> </label>
</div>

CSS:

div { overflow:auto; border:1px solid #ccc; width:100px; }
label { float:left; padding:3px 0; width:50px; text-align:center; }
input { vertical-align:-2px; }

现场演示: http //jsfiddle.net/scymE/1/


这根本不会使小圆圈消失,因此无法回答问题
John Deverall
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.