HTML Dog

跳至导航

Strangeswitcher 医生,或者:我如何学会停止编写脚本,拥抱 CSS

不要使用 JavaScript!不要使用 PHP!你完全可以用 CSS 来制作一个样式切换器!

“好吧,我去过一次世界博览会、一次野餐和一次牛仔竞技表演,这是我在网站上读到的最愚蠢的东西。你确定你拿到了今天的代码吗?”

样式切换,即用户通过选择页面上的链接来切换到备用样式表,以帮助提高可访问性,或者仅仅是为了炫耀,这并不是什么新鲜事。

实现这一目标有两种常用技术——第一种是使用后端脚本语言,例如通过附加不同的 CSS 文件来重新加载页面,第二种是使用 JavaScript 动态切换 CSS 样式。

Strangeswitcher 医生是一种更新鲜、更快、有点有趣、有点可疑,而且有点懒惰的方法。它的方法是抛弃脚本,只使用一些简单的 CSS。

没错。理论上,你可以用 CSS 全部搞定。至于你是否应该这样做,那是另一回事。而且我们会看到,在实践中,我们可能最终还是需要一些脚本的帮助,但这仍然是一个有趣的小花样。

目标练习

诀窍在于使用 :target 伪类,它可以用来为目标锚点设置样式。

假设我们有一些 HTML 代码,看起来像这样


<ul>
	<li><a href="#strangelove">Dr. Strangelove</a></li>
	<li><a href="#mandrake">Lionel Mandrake</a></li>
	<li><a href="#muffley">Merkin Muffley</a></li>
</ul>

<!-- a whole load of content -->

<h2 id=\"strangelove\">Dr. Strangelove</h2>
<!-- more content -->

<h2 id=\"mandrake\">Lionel Mandrake</h2>
<!-- even more content -->

<h2 id=\"muffley\">Merkin Muffley</h2>
<!-- yet more content -->

现在,当你选择一个链接时,页面将跳转到具有相应 ID 的元素。这是基本操作。

现在尝试应用此 CSS


h2:target { background: orange }

在更现代的浏览器中(即非 Internet Explorer 的浏览器),页面不仅会跳转到所需的标题,该标题还会通过 CSS 高亮显示。试试看。它很酷。

一个大页面锚点

现在,为了构建样式切换器,我们将要把**整个页面**变成一个锚点,然后在它被定位时对其进行样式化。

所以我们只需要为打开的 body 标签应用一个 ID……


<body id=\"strangelove_style\">
	<!-- all of your content -->
</body>

……然后,在页面内的某个地方,你会想要链接来激活样式切换器。


<ul>
	<li><a href=\"#strangelove_style\">Switch to alternative style</a></li>
	<li><a href=\"#\">Switch to default style</a></li>
</ul>

现在只需要在你的 CSS 中指定备用样式做什么。


#strangelove_style:target { font-size: 1.5em; }

#strangelove_style:target h2 { background: orange; }

所以现在,当选择“切换到备用样式”链接时,上述样式将被应用于页面。当选择“切换到默认样式”链接时,这些样式将被切换回来。神奇。

因为样式名称会成为 URL 的一部分(因为它被“#”符号附加了),所以首选样式可以被电子邮件、即时消息或书签保存,而无需 cookies。你可以通过将 body 的内容包装在具有不同 ID 的 div 元素中来应用多个备用样式。

这确实是一个非常简单的概念。它是一个巧妙有效的概念

重新开始编写脚本……

最明显缺点是它在 Internet Explorer 中不起作用,考虑到 :target 伪类是 CSS 3 的一部分,这倒是情有可原。但这并不意味着它完全不实用。你仍然可以用 JavaScript 来“修补”这个缺陷,例如使用Suckerfish :target,这显然又依赖于脚本,但只有 21 行代码。

事实上,如果你愿意,你可以用任意多的 JavaScript 将功能扩展到你想要的任何程度,包括 cookies、铃铛和哨子。我个人喜欢精简的代码。

免责声明

为了避免一些批评,最好提出几点简要说明。

最后,作者想声明,他并不是 JavaScript 的仇敌,这篇文章的标题**只是为了好玩**。