“复选框黑客”是指使用关联的 <label>
和 <input type="checkbox">
,通常还包括 另一个元素,用于试图控制它,如下所示
<label for="toggle">Do Something</label>
<input type="checkbox" id="toggle">
<div class="control-me">Control me</div>
然后使用 CSS 将复选框完全隐藏。可能是通过使用绝对定位将其从页面中移除,或者将其不透明度设置为零。但是,即使复选框被隐藏,单击 <label>
仍然会使其值在打开和关闭之间切换。然后,您可以使用相邻兄弟选择器根据输入的 :checked
状态对 <div>
进行不同的样式设置。
.control-me {
/* Default state */
}
#toggle:checked ~ .control-me {
/* A toggled state! No JavaScript! */
}
因此,您可以根据该复选框的状态(您甚至看不到)对元素进行完全不同的样式设置。很酷。让我们看一下“复选框黑客”可以做的一些事情。
查看笔
复选框黑客 by Chris Coyier (@chriscoyier)
在 CodePen 上。
其中一些东西超出了您“应该”使用 CSS 进行的操作的界限,并引入了一些有问题的语义。它仍然非常有趣,而且它可以实现,但总的来说,功能行为应该由 JavaScript 控制。
自定义设计的单选按钮和复选框
查看笔
仅使用 CSS 的自定义复选框 by Geoffrey Crofte (@GeoffreyCrofte)
在 CodePen 上。
您可以隐藏单选按钮或复选框的默认 UI,并在其顶部显示自定义版本。
类似文件系统的“树形菜单”
选项卡区域
“选项卡”设计模式只是打开和关闭区域,非常适合复选框黑客。但是,与任何复选框都可以独立于彼此打开或关闭的复选框不同,这些选项卡使用单选按钮,其中每组中只有一个可以打开(就像一次只能激活一个选项卡一样)。
演示来自 重新审视功能性 CSS 选项卡
查看笔
功能性 CSS 选项卡 by Chris Coyier (@chriscoyier)
在 CodePen 上。
下拉菜单
查看笔
单选按钮下拉菜单 by Chris Coyier (@chriscoyier)
在 CodePen 上。
推动切换
切换可以采用 ON/OFF 的形式,这可以通过一个 <input type="checkbox">
来完成。就像 表情符号切换 一样!
查看笔
CSS 复选框切换开关 by Chris Coyier (@chriscoyier)
在 CodePen 上。
或者它可以是多个 <input type="checkbox">
元素,在不同的独立值之间切换。
常见问题解答答案揭示
您现在可能只是使用 <details>
/<summary>
组合,但可以使用复选框黑客完成可扩展部分。
查看笔
没有 Details/Summary 的常见问题解答(复选框黑客) by Chris Coyier (@chriscoyier)
在 CodePen 上。
隐藏边栏
就像老式的 Octopress 主题。
查看笔
使用复选框黑客隐藏边栏 by Chris Coyier (@chriscoyier)
在 CodePen 上。
“常见问题解答答案揭示”示例是 HTML5
details
/summary
元素的完美用例。当然,而且有了 某个人的 jQuery 回退,这是一个很棒的选择。
@Mathias:我的第一个想法也是这样。但后来我仔细想了想;我不这么认为。那该怎么办?对于支持
details
/summary
的浏览器,不需要这样的东西。对于所有其他浏览器,无论如何都需要一个 polyfill 脚本。我假设您不是建议我们在每个details
/summary
实例旁边手动包含一个复选框,因为那样会是两全其美。确实很酷的技巧,但语义很糟糕 :)
更多痛苦:我刚用它为我刚为自己制作的自定义博客编辑器制作了一个颜色选择器。它在所有地方都能完美运行,除了 iOS。我该如何解决?
我喜欢您对 Soul Coughing 的引用!不错!
Soul Coughing 很棒!非常棒!
我过去对 css ninja 使用相同技巧制作的模态对话框演示印象深刻(请查看 此处)。
大约一个月前,我使用这种技术制作了一个 iOS 风格的开/关切换。http://forrst.com/posts/iOS_Pure_CSS_On_Off_switch_Now_with_100_less_i-rMA 值得一看。
实际上。删除它。不同的方法,但仍然很酷。
这是一个非常糟糕的想法:使用像“left: -9999px”这样的样式。一旦您将方向更改为 rtl,就会出现巨大的水平滚动。也许,如果具有希伯来语、阿拉伯语或印地语等系统 RTL 设置的人访问您的网站,它可能已经存在——我没有测试过这一点。
使用像“position:absolute;clip:rect(0 0 0 0);”这样的样式是一个更好的主意(见 Lea Verou 演示)。如果不需要考虑 IE 浏览器,“visibility:hidden”也可以。
我在 Whats My MPG 中对本文中介绍的单选按钮示例使用了剪切方法。
如果父元素具有
overflow: hidden
,则left: -9999px
就可以了。visibility:hidden
用于复选框是一个糟糕的主意,因为input.checked > label
在 IE7/8 中将不起作用这些真的很有趣!我真的很想读一读那些认为即使玩弄这些技巧也会对行业有害的人的观点。对我来说,它们只是看起来像一个非常有趣的思维练习。
从 CSS 部分可以学到很多东西,但 HTML 部分是胡说八道:表单元素应该用于表单 (*),而不是用于导航列表、选项卡或树形列表。
简单的问题:表单元素在哪里?提交按钮在哪里?
建议:如果它不是表单,就不要使用表单元素。
另一个“问题”是 CSS Tricks 是一个成功的网站,拥有许多访问者:Chris Coyer 应该获得这样的成功,但另一方面也对那些不确定自己的技能和良好实践知识的初学者和非初学者承担着“一定程度的”责任。
在我看来,这属于“你不能做但仍然可以从中学习的东西”。Chris 添加了一个免责声明(即使是大量的免责声明也无法阻止一些人复制粘贴他们看到的所有内容,但这应该是他们的问题),但我仍然将标题理解为“我可以做这些事情吗?好吧,我会做”。而像我这样的人会抱怨“其中一些内容越界”,“一些不好的语义”太含糊了(虽然我没有在这里看到好的语义,但再次强调,从 CSS 部分可以学到很多东西)。
如果你在你的网站上需要选项卡或树形列表,使用 JS 来隐藏和显示内容,并查看 http://hanshillen.github.com/jqtest/
(*) 我知道由于 HTML4.01 规范的局限性(没有办法表达输入可以嵌套在一个 %block% 中,比如 p 或 fieldset,或者 fieldset 嵌套在 fieldset 中等等),很多东西,比如在表单外部的 fieldset,都是有效的,但它仍然在网站中没有意义。
我通常同意输入不应该在表单之外使用,但使用
<button type="button">
在表单之外没有任何问题,因此肯定存在适合所有情况的情况。它是一个可聚焦元素,在某些情况下,它比目前流行的方法更易于访问,可以用于隐藏/显示内容。你的评论有点苛刻,我认为你把这个概念验证的东西看得太认真了。
互联网主要是由一堆链接、表单和文本组成的。偶尔看到一些不同的东西总是好的。
@Felipe Chris 确实在那里放了一个免责声明,那些想学习的人可以做任何你想做的事情。如今表单的使用如此广泛,以至于它们几乎不再被称为表单了。这更像是一篇博客文章而不是教程。
人们可以用他们学到的东西做任何他们想做的事情;如果你在独立工作,你实际上只需要像你需要的那样语义化。
好吧,我没有看到任何“技巧”……
这纯粹是 CSS :) 里面的一些东西我几乎每天都在使用……
对我来说,免责声明就在标题中。“技巧”。Chris 清楚地表明,这是一种可以让你对正在绘制的画布有更深入理解的东西,并且由于其非语义性,实际上只应该在最有趣的情况下实施(或者那些与我们作为网页操作员相关的情况,比如 Dabblet)。
Chris 写得很好!
你应该为标签添加 user-select: none; 以防止选择按钮中的文本,并提高可用性。
添加
我正要这么说(是的,我和 Arto 是不同的人,只是名字巧合地相似)。不过,如果我记得没错的话,你最终仍然会遇到一种情况,即快速点击标签不会将每次点击都注册为切换关联的复选框。
鉴于此,我通常必须使用 JavaScript 和一个非标签触发器,并进行双向状态更改(点击非标签触发器会更新复选框状态,更改复选框状态会更新触发器的外观)。结合将复选框放置在页面外但不可见,这仍然可以通过键盘快捷键访问复选框(当替换现有元素时,这始终是一个需要关注的问题)。
我很想看到这个技巧的版本,即使在快速连续点击标签的情况下也能正常工作。上面的 JavaScript 并不完全简单。
这行代码中的“~”是什么意思
input[type=checkbox]:checked ~ div { … }
谢谢。
那是通用兄弟组合器。参见 此处。
验证了以上内容。即使在标签和输入上设置了 user-select,快速点击标签也不会注册每次点击。
http://dabblet.com/gist/1510457
这在 Firefox 8 中进行了测试,但我记得我在其他浏览器中也见过同样的行为。
为什么我应该遵守语义?使用可用的东西来创建最佳解决方案不是更好吗?(优化、重复、可读性等等)
如果选项卡是嵌套的,我似乎无法让它们工作。有谁知道如何解决这个问题吗?
http://dl.dropbox.com/u/14080718/CSSTabs/index.html
在我的 Safari 5.1.2 和 Firefox 8.0.1 上正常工作。
我注意到,上次我玩的时候,在 Safari 上,任何包含多个组合器的选择器都不起作用。Firefox 会接受两个组合器,但不会接受超过两个的组合器。例如,
:checked + div p
在 Safari 上不会匹配p
元素。我最近创建了一个 lion css ui 工具包,并使用选中状态来表示源列表,因此单选按钮会跟踪选定的项目,而复选框则会处理树视图。
手动编写树形菜单的 HTML 代码很快就会变得很麻烦。对于分段推送切换,这种技术感觉有点合适。
虽然我同意大多数这些示例可能不应在实践中使用,但我认为“推送切换”示例实际上是这种技术的完美用例。从语义上来说,它们是单选按钮,因此在标记中使用实际的单选按钮是有意义的。你可以在不支持的浏览器中回退到普通的单选按钮和标签。
我已经使用额外的标记来实现相同的效果,这些标记用于样式化的切换,并使用 JavaScript 来管理隐藏的单选按钮的状态,但这是一种更简洁的方法。
为了使其在 IE7/8 中工作,你可以添加一些 jquery 脚本
只需复制样式并将
:checked
替换为.checked
即可如果在所有文章的标题区域中添加一个类似作者的小标题,或者添加一个图标或类似的东西来对文章中所针对的 HTML 和 CSS 版本进行分类(例如 HTML5 & CSS3 或 HTML4 & CSS3 等),那就太好了。
不幸的是,对于我们中的一些人(也许只是我),目标版本并不立即明了。
非常棒且有帮助的文章。技巧总是用于捷径,但那些总是有效并成为长期解决方案。我找到了一篇关于 CSS 技巧的好文章。
http://wordpressapi.com/2011/01/24/50-css-tequniqe-tips-web-developer-check/
有谁知道是否可以使用纯 CSS 对选项卡应用一些过渡效果。我正在尝试让选项卡淡入淡出。我已经尝试过一些方法,但似乎无法实现。
我喜欢评论风格,我如何在自己的网站上使用这种风格
如果有人在 iOS 中使用标签点击遇到问题,请尝试在父元素(例如 <form>)中添加一个空的 onclick=””……
感谢你指出除了显而易见的功能之外,input@type=checkbox 的其他用途。
我曾经 写过一篇关于如何使用复选框来控制当前活动图像的旋转图像的文章。
我以为现在应该将输入嵌套在标签中了
另外,想到一点,这可能可以消除对其他额外 div 的需求……?
我在 IE 8 中遇到了这个问题……。
有谁知道如何在邪恶的浏览器中让它工作?
我的代码如下
input[type=checkbox]{
position: absolute;
left: -9999px;
overflow: hidden;
}
input[type=checkbox].checked ~ div {
background-position: 5% -19px;
background-color: #E5F6FF;
border: 1px solid #D1EFFF;
}
IE 8 忽略了它,而所有其他浏览器(Chrome、FF、Safari 和 Opera)都能轻松地处理它。
我该怎么办?
有没有办法防止用户选择标签时页面跳动?如果需要滚动才能到达标签,单击它会导致页面跳到顶部。
有什么想法可以解决这个问题吗?
还需要注意的是,将标签放在复选框之前不允许对其进行样式设置,因为据我所知,CSS 无法向上遍历 DOM(只能向下遍历)。像这样的代码
无法正常工作,但是将这两行 HTML 代码颠倒顺序的完全相同的代码可以正常工作。这是因为对于 CSS
:checked
选择器,label
元素不存在。由于
~
选择器只能访问直接同级元素,因此将复选框嵌套在标签内也不会起作用,除非目标也在标签内。非常有用的帖子,我正在将其用于移动设备的响应式下拉导航面板,效果很好!
为什么不直接对 input.checkbox 元素使用
display:none
?为什么要将它推到页面上?