将复选框样式设置成切换按钮

10

在我的网站上,用户可以发布文章并使用一些预设标签对其进行标记。这些标签采用复选框的形式。以下是示例:

<input type="checkbox" name="wpuf_post_tags[]" class="new-post-tags" value="Aliens" /> Aliens
<input type="checkbox" name="wpuf_post_tags[]" class="new-post-tags" value="Ghosts" /> Ghosts
<input type="checkbox" name="wpuf_post_tags[]" class="new-post-tags" value="Monsters" /> Monsters

你可能知道,复选框看起来像这样:

[ ] 外星人

[o] 鬼魂

[ ] 怪物

我想要的是将复选框变成一个带有值的大按钮。然后让它具有“切换”效果。

[ 外星人 ] [ 鬼魂 ] [ 怪物 ]

我应该如何做到这一点?


你有一個在線上激勵你的範例嗎? - klewis
当你说“切换效果”时,是指鼠标悬停?点击?它是否移动复选框? - klewis
@blackhawk 我没有在网上找到任何激发我的示例。通过切换效果,我指的是单击按钮后,复选框将被“标记”,并保持这种状态,直到表单被提交。之后,所有“标记”复选框将用作文章的标签。 - Swen
@blachawk 我认为它应该看起来像 MS Word 中的文本格式化按钮(斜体、粗体等)。 - Voitcus
我的小例子 - http://jsfiddle.net/r37boLbr/ - Silver Moon
5个回答

9

请查看此链接

HTML

<input id="chk_aliens" type="checkbox" name="wpuf_post_tags[]" class="vis-hidden new-post-tags" value="Aliens" />
<label for="chk_aliens">Aliens</label>

<input id="chk_ghosts" type="checkbox" name="wpuf_post_tags[]" class="vis-hidden new-post-tags" value="Ghosts" />
<label for="chk_ghosts">Ghosts</label>

<input id="chk_monsters" type="checkbox" name="wpuf_post_tags[]" class="vis-hidden new-post-tags" value="Monsters" />
<label for="chk_monsters">Monsters</label>

CSS

.vis-hidden {
    border: 0;
    clip: rect(0 0 0 0);
    height: 1px;
    margin: -1px;
    overflow: hidden;
    padding: 0;
    position: absolute;
    width: 1px;
}

label {
  margin: 10px;
  padding: 5px;
  border: 1px solid gray;
}

input:focus + label {
  border-color: blue;
}

input:checked + label {
  border-color: red;
}

input:focus:checked + label {
  border-color: green;
}

请注意,最后一个选择器可能无法在较旧的IE浏览器中工作。

3
我这里有一个相似的例子这里,基于这篇CSS Ninja文章。根据那篇文章,IE8及以下版本不支持:checked伪类,因此在这些浏览器中将无法显示效果。因此,您需要确保只为能力足够的浏览器提供这些样式 - 一种方法是使用not()伪类,或者将它们全部放在媒体查询中。 - CherryFlavourPez
@CherryFlavourPez 我刚刚查看了你的示例,我真的很喜欢它。不过我想知道,使用CSS来实现切换效果会更好还是使用javascript/jquery更好呢?你会推荐哪个? - Swen
你也可以使用条件IE body类,并为新于IE8的浏览器应用这些样式。因此,在IE8及以下版本中,您将看到普通复选框,而对于更新的浏览器,您将拥有时尚的样式标签。 - Simon
正如@Simon所说,我认为这是渐进增强的完美例子。只需为支持它的浏览器使用CSS版本,而回退则是一系列(完全可用的)复选框。JavaScript只会增加另一层复杂性(在这种情况下,您需要做两个版本,以允许那些禁用它的用户)。 - CherryFlavourPez

7
可以使用复选框和标签、相邻兄弟选择器以及CSS3的:selected伪类来实现此功能。
HTML:
<span><input type="checkbox" id="c1"><label for="c1">[ Aliens ]</label></span>
<span><input type="checkbox" id="c2"><label for="c2">[ Ghosts ]</label></span>
<span><input type="checkbox" id="c3"><label for="c3">[ Monsters ]</label></span>

CSS:

input { display:none; }
input:checked ~ label { color:red; }

http://jsfiddle.net/drTg2/

请注意,这种方法在旧的浏览器中很容易失败 - 因为它们不认识 ~:checked。而且旧版 IE 在复选框设置为 display:none 时存在问题 - 当表单提交时不会传输它们(虽然可以通过其他方式隐藏,例如屏幕的绝对定位来克服这个问题)。

如果您不坚持使用纯 HTML/CSS 解决方案 - 有许多脚本/{js-framework-of-your-choice}-插件可用,可帮助实现相同的效果。


这正是我想做的!在我的网站上使用这个(隐藏复选框并使用标签来勾选/取消勾选),会有多“危险”? - Swen
这取决于它在每个浏览器中的工作是否很重要 - 或者您是否可以接受它在一些较旧的浏览器中无法工作... - CBroe
请注意,如果您设置了display:none,则无法通过复选框进行制表符,而且它们的值不会在表单中提交。您应该使用visibility-hidden类。 - Simon
2
实际上,Simon的答案使用选择器input:checked + label更可取 - 我的答案使用~取决于输入和标签被封装在进一步的元素(span)中。 - CBroe

3

复选框(Checkboxes)单选按钮(radio buttons)下拉菜单(SELECT)元素的样式能力非常有限,并且在不同的浏览器中差异很大。

最好使用带样式的链接或按钮来实现这些,然后使用JavaScript设置实际的开/关外观和表单值。


1
这正是我想说的,样式化表单元素真是一件让人头疼的事情,特别是需要跨浏览器兼容时。 - Adrenaxus
切换按钮需要通过表单提交。但是我不确定如何使用样式化链接或按钮实现这一点。 - Swen
1
它们不仅各自具有被广泛接受的用例,而且将复选框功能化为单选按钮会破坏用户体验标准。 - isherwood
1
是的,如果可能的话,让另一个元素更像“复选框”比让复选框更像其他任何元素(在样式方面)要容易得多。 - VoidKing
Swen: 你需要制作 CSS 按钮,交换类以切换开/关状态,并使用隐藏表单字段通过将 JS 点击事件连接到设置值来存储数据。 - Diodeus - James MacFarlane

1
你可以借鉴这个页面的想法!尝试将文本和复选框绑定在一起。然后尝试使用jQuery来“切换”与复选框相关联的标签。
然后,您可以使用样式和图像使标签看起来像复选框的容器。那是我会做的事情。

0

您可以尝试使用带有JavaScript onclick事件的图片,该事件将更改img source属性。然后,放置具有给定id的隐藏控件,并在相同的onclick事件中使用document.getElementById('hiddencontrol').value = 1 - document.getElementById('hiddencontrol').value(默认为0或1)。

但是,我不知道如何在没有JavaScript的情况下实现它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接