2013-04-26 110 views
28

我想为捐款表单设置一组单选按钮,但是我希望它们看起来像按钮而不是圆形拨号。制作单选按钮看起来像是按钮

什么是最好的方法来做这样的事情?另外,请记住,它必须与IE8一起工作。

这里是我到目前为止,http://jsfiddle.net/YB8UW/

.donate-now { 
    list-style-type:none; 
    margin:25px 0 0 0; 
    padding:0; 
} 

.donate-now li { 
    float:left; 
    margin:0 5px 0 0; 
} 

.donate-now label { 
    padding:5px; 
    border:1px solid #CCC; 
    cursor:pointer; 
} 

.donate-now label:hover { 
    background:#DDD; 
} 

谢谢

+1

您是否尝试过在SO上搜索“自定义单选按钮”? [例如。 http://stackoverflow.com/questions/9266868/custom-radio-buttons-ie-will-kill-me] – Orbling 2013-04-26 18:33:16

+0

试试这个http://jqueryui.com/button/#radio,这可能ñ你在找什么。 – PSL 2013-04-26 18:36:12

+0

用户对按钮有一定的期望,您确定这是明智的做法吗? – cimmanon 2013-04-26 18:53:20

回答

73

不要听那些说不能用CSS完成的人,更不要推荐一些大型框架。我一直用复选框和单选按钮来做这件事。

这个工程不需要添加新的HTML或引入任何JS库。 =>jsFiddle

的HTML

<ul class="donate-now"> 
<li> 
    <input type="radio" id="a25" name="amount" /> 
    <label for="a25">$25</label> 
</li> 
<li> 
    <input type="radio" id="a50" name="amount" /> 
    <label for="a50">$50</label> 
</li> 
<li> 
    <input type="radio" id="a75" name="amount" checked="checked" /> 
    <label for="a75">$75</label> 
</li> 
<li> 
    <input type="radio" id="a100" name="amount" /> 
    <label for="a100">$100</label> 
</li> 
<li> 
    <input type="radio" id="other" name="amount" /> 
    <label for="other">other:</label> 
</li> 
<li> 
    <input type="text" id="otherAmount" name="numAmount" /> 
</li> 
</ul> 

的CSS

.donate-now { 
    list-style-type:none; 
    margin:25px 0 0 0; 
    padding:0; 
} 

.donate-now li { 
    float:left; 
    margin:0 5px 0 0; 
    width:100px; 
    height:40px; 
    position:relative; 
} 

.donate-now label, .donate-now input { 
    display:block; 
    position:absolute; 
    top:0; 
    left:0; 
    right:0; 
    bottom:0; 
} 

.donate-now input[type="radio"] { 
    opacity:0.01; 
    z-index:100; 
} 

.donate-now input[type="radio"]:checked + label, 
.Checked + label { 
    background:yellow; 
} 

.donate-now label { 
    padding:5px; 
    border:1px solid #CCC; 
    cursor:pointer; 
    z-index:90; 
} 

.donate-now label:hover { 
    background:#DDD; 
} 

这是10分钟哈克版本新秩序,你甚至可以进一步清理,但它显示了它是多么简单的一个很好的例子。

+0

是的,但它在IE8中工作吗? – Richard 2013-04-26 19:03:20

+0

nope ...但你可以创建一个'Checked'类,如果选中或者不在javascript中,就可以切换类。它就像两行javascript,并且只作为后备,而不是主要的。 “+”选择器一直工作回到IE7。我修改了CSS来展示给你。 – PlantTheIdea 2013-04-26 19:07:31

+0

这可能会奏效。谢谢你 – Richard 2013-04-26 19:08:43

0

不幸的是,你不能直接在任何浏览器风格的单选按钮。要做到这一点的方法是使用<label>元素并正确设置for属性,然后使用visibility: hidden而不是display: none来隐藏单选按钮本身。然后,您可以将标签放在任何需要的位置,并且它们将充当单选按钮。您需要一点javascript才能根据<input>元素的状态控制标签的样式,因为IE8不会支持像:checked这样的高级CSS伪类。

这是一个黑客的一点,但它是使用本地单选按钮与自定义图形,仍然保持可访问性的唯一方法。

+1

你甚至看过小提琴吗?他这样做。 – SeinopSys 2013-04-26 18:34:42

+0

他根本不隐藏单选按钮。你不能设计它们,所以你只需要隐藏它们。 – nullability 2013-04-26 18:39:22

+0

'visibility:hidden;'使它们不可点击,你需要设置它们的'opacity:0.01';保持可点击性。请参阅我的答案以供参考。 – PlantTheIdea 2013-04-26 18:53:18

6

编辑:如果您需要支持IE浏览器,这不是一个解决方案。


你可以使用CSS的外观性:

SEE DEMO

-webkit-appearance: button; /* WebKit */ 
-moz-appearance: button; /* Mozilla */ 
-o-appearance: button; /* Opera */ 
-ms-appearance: button; /* Internet Explorer */ 
appearance: button; /* CSS3 */ 
+0

这看起来很棒,但是我怎么知道什么时候检查了一件物品? – Richard 2013-04-26 19:04:48

+0

它取决于你做你想做什么,例如http://jsfiddle.net/YB8UW/10/ – 2013-04-26 19:16:39

+2

不幸的是,'外观'[在IE中根本不被支持](http://caniuse.com/#feat = css-appearance)(和你在这里包含的'-ms-appearance'属性不存在),很可能永远不会。另外,外观已经从CSS规范中删除(https://wiki.csswg。组织/规格/ CSS4的UI#下降,CSS3的功能)。除非你知道你只是针对支持该属性的浏览器 - 这不适用于为普通网络编写站点的普通Web开发人员 - 但这不是一个有用的现实世界的解决方案。 – 2015-05-13 09:55:25

0

或者如果你想自己做...

我会做的是与<button>元素和隐藏的表单字段元素记住哪一个是“按下”像这样创建的按钮:

<button type="button" id="btn1">Choice 1</button> 
<button type="button" id="btn2">Choice 2</button> 
<button type="button" id="btn3">Choice 3</button> 
<input type="hidden" id="btnValue" value="" /> 

您将CSS来表明按钮被“按下”或不“按下”所以你会需要它们在默认情况下是这样的:

button 
{ 
    border-width: 2px; 
    border-style: outset; 
    border-color: /*Insert a darker version of your button color here*/ 
} 

然后在jQuery的(如果你能在jQuery的做到这一点,你可以做到这一点的直JavaScript,所以请记住,如果你d on't想使用jQuery):

$("#btn1").click(function() { 
    $(this).css("border-style", "inset") 
    $("#btn2").css("border-style", "outset;"); 
    $("#btn3").css("border-style", "outset;"); 
    $("btnValue").val("btn1IsPressed"); 
}); 
$("#btn2").click(function() { 
    $(this).css("border-style", "inset") 
    $("#btn1").css("border-style", "outset;"); 
    $("#btn3").css("border-style", "outset;"); 
    $("btnValue").val("btn2IsPressed"); 
}); 
$("#btn3").click(function() { 
    $(this).css("border-style", "inset") 
    $("#btn1").css("border-style", "outset;"); 
    $("#btn2").css("border-style", "outset;"); 
    $("btnValue").val("btn3IsPressed"); 
}); 

现在,所有你需要做的就是请求#btnValue POST后的值(或GET或其他),就像你通常会告诉他们有哪些“按钮”按下。

请注意,您需要添加一些功能来“解除”按钮,但我认为您明白了。您只需在点击时读取#btnValue的值,并与其他语句一起使用if分支来处理它是否已被按下,并相应地切换边界(不要忘记清除("")值为#btnValue的“解压”按钮,以便您可以判断他们是否将它们全部未按下)。

+0

虽然我认为jquery/javascript是不必要的,我非常感谢有人愿意提供一个DIY的答案。 – PlantTheIdea 2013-04-26 18:46:14

+0

我总是先尝试DIY方法。我讨厌实施我不明白的代码,除非它不可否认是最好的行动方案。此外,学习DIY方法会增加“程序员工具箱”中的工具数量(即,随着时间的推移,您将获得越来越多的编程经验和技能)。进入IMO的好习惯。 – VoidKing 2013-04-26 18:48:32

+0

最好的方法是试图了解车轮 – 2013-04-26 18:53:53