有趣的周五活动! Natalya 在 CodePen 上 制作了一个超级有趣的 Pen。
您知道如何点击带有 <label>
的 for
属性(与复选框输入匹配),它会将输入切换到选中或未选中状态吗? 这与 CSS 中的 :checked 选择器和同级组合器相结合,形成了 复选框技巧,您可以用它来做各种有趣的事情。
Natalya 使用它构建了一个切换开关,在关闭/左侧位置显示一个表情符号,并滑动到打开/右侧位置,切换到另一个表情符号。
查看 Pen Kitty Toggle by Natalya (@tallys) on CodePen。
我认为可以将其简化到我能达到的最基本级别,所以如果您想为正在处理的事情获取这个想法,您将拥有一个更清晰的构建块。
查看 Pen Emoji Toggles by Chris Coyier (@chriscoyier) on CodePen。
<!-- The wrap for everything, so you can position it wherever.
Also, so all the other elements are siblings. -->
<div class="emoji-toggle emoji-travel">
<!-- The input is first, so the ~ selector can select siblings after it. -->
<input type="checkbox" id="toggle2" class="toggle">
<!-- The emoji is a psuedo element on this. -->
<div class="emoji"></div>
<!-- This is absolutely positioned over everything.
Also, the split/label comes from using both :before and :after -->
<label for="toggle2" class="well"></label>
</div>
输入本身在视觉上是隐藏的,但绝对定位在所有内容的顶部,以便点击几乎任何地方都会切换复选框,从而更改表情符号及其位置。
代码比这多一点,但这些是 CSS 中最重要的部分
.emoji-toggle {
position: relative;
.well { // the label
cursor: pointer;
}
.toggle { // the checkbox
appearance: none;
background: transparent;
position: absolute;
width: 100%;
height: 100%;
cursor: pointer;
z-index: 100;
// "off"
~.emoji:before {
content: "emoji unicode here";
position: absolute;
left: 0;
top: -15px;
font-size: 40px;
z-index: 1;
transition: 0.2s;
}
// "on"
&:checked {
~.emoji:before {
content: "different emoji unicode here";
left: 100%;
margin-left: -1em;
}
}
}
}
Sass 版本
为了制作它的不同版本,需要更改四个具有嵌套状态的不同选择器上的伪元素内容。 这有点令人费解,所以我制作了一个快速的 Sass @mixin
来帮助我。 这就是我喜欢使用预处理器的原因——它不太花哨,它只是帮助抽象化否则会非常冗长的事情。
@mixin emojiType($leftEmoji, $rightEmoji, $leftLabel, $rightLabel) {
.toggle {
~.emoji:before {
content: $leftEmoji;
}
&:checked {
~.emoji:before {
content: $rightEmoji;
}
}
~label {
&:before {
content: $leftLabel;
}
&:after {
content: $rightLabel;
}
}
}
}
// Usage
.emoji-happy {
@include emojiType(
"\01F604", "\01F620", "Happy", "Mad"
);
}
获取表情符号的 Unicode
您可能已经注意到表情符号的 Unicode 值在 CSS 内容中类似于“\01F604”。 幸运的是,Tim Whitlock 有一个 非常可靠的参考页面 提供此信息。

因此,如果“咧嘴笑脸”的 Unicode 是“U+1F601”,则在 CSS 伪内容中,它将变为“\01F601” 因为 CSS 如何转义内容。
里程可能会有所不同
表情符号很奇怪。 我听说这在所有设置上都不能正常工作。 不同的浏览器/平台/版本具有不同的可用表情符号。 我敢肯定我们没有人感到惊讶。
第一个示例在 Chrome 中不起作用(第二个表情符号没有显示;当我在 Firefox 中切换时,第一个示例有效;但第二个示例都显示输入框并在表情符号上方。在 Chrome 中,第二个示例的第一行没有任何表情符号。
但总的来说,这是一个非常酷的示例;一个也应该与图标(如 fontawesome)配合使用的示例。
Robert,它可能在你的评论和此回复之间的时间段内得到了修复,但对我来说看起来/工作正常(在 OS 10.7、Chrome 45 上)。
我仍然看到我报告的问题。 Chris 说在各种浏览器上表情符号有一些问题,所以我不感到惊讶;我相信调整一下 CSS 就可以修复 Firefox。 我仍然相信这是一个很棒的 UI——直观且用户友好。
我可以在我的 Windows 7 电脑上确认同样的问题(只在工作时,我发誓)。 无论如何,我也非常喜欢这个例子!
啊哈。
这里似乎工作正常。
但是我注意到可以通过以任何顺序点击 :before 和 :after 内容来更改状态,从而使其失去顺序,因为您可以点击看起来像相反标签的内容。
在第二个示例中,带有五个表情符号图标的那个可以通过添加以下内容来克服
甚至在 IE 中也能工作,这在任何一天都是一个额外的好处。
嘿,Chris!感谢您查看小猫咪切换。 我将在今年 10 月参加 CSS Dev Conf,以便亲自给你一个适当的击掌! 😺
这是我在 OS X 上看到的
这是我在 Windows 7 上看到的
OS X 的“关闭”表情符号比 Windows 7 的表情符号更悲伤。 这也许可以说明为什么使用像这样的 Unicode 表情符号是有问题的,有时我想知道将它们包含在 Unicode 中是否是一个好主意。
看起来我的屏幕截图被过滤掉了! 它们在这里
OS X 屏幕截图:https://imgur.com/Tw8PIK7.png
Windows 7 屏幕截图:http://imgur.com/QVPf93M.png
(也许评论的发布指南应该提到不支持图像,如果图像不打算出现在最终评论中,则预览选项卡不应显示图像。)
一个问题。 人们会尝试来回拖动开关而不是简单地点击——并且移动不起作用。 在我的公司同事身上进行了测试。
嗨,我有一个问题。 我们可以更改这些图标的颜色吗? 我在 Windows 的 WordPad 上尝试过,我可以做到,但是我无法使用 CSS 在浏览器中做到这一点。