打地鼠:CSS 版本

Avatar of Will Yu
Will Yu

DigitalOcean 为您旅途的每个阶段提供云产品。 立即开始使用 $200 免费积分!

我们已经了解了 复选框黑客,以及它如何用于在 CSS 中构建 完整的状态机。 今天,我们将把这种思路更进一步,构建一个简单的打地鼠游戏,玩家需要快速反应才能获胜……完全不使用 JavaScript。

这在没有计时器或间隔概念的语言中可能看起来有点愚蠢,但秘密在于 CSS 确实有——它只是封装在一个名为 CSS 动画的小功能中。

看一看这个双击处理程序。 请注意,CSS 不知道什么是点击,更不用说双击了

它是如何工作的? 以下是重要元素的记录,重新着色并减速

当您第一次点击按钮时,它会将双击元素移动到光标下方,但它还会导致遮罩元素开始向上移动以覆盖它。

  • 如果第二次点击在第一次点击后足够快(如记录左侧),它将发生在双击(蓝色)元素上。
  • 否则(如记录右侧),它将发生在遮罩(黄色)元素上,这具有单击元素的效果。

(有关深入说明,请查看我在纯 CSS 双击处理程序上的文章 此处。)

这里有两个想法在起作用

  1. 动画可用于根据设定的模式管理状态。(我在这里松散地使用“状态”一词。)
  2. 通过更改元素的位置,我们可以更改用户是否可以执行操作。

这就是我们需要的全部!

现在,我们不是让目标滚动到视图中,而是可以使用 animation-timing-function: step-end 让它弹出和消失,就像地鼠在地洞里一样

我尝试了几种不同的方法来将地鼠移开,并更改其绝对位置——这里是 left——似乎效果最好。 使用平移会很方便,但不幸的是,Firefox 认为光标在错误的元素上,因为在 Gecko 布局引擎中更改 transform 不会触发重新布局。(通常,这对性能来说是一件好事,但对我们的小演示来说并不那么好!)

通过一些样式,我们可以让它看起来更像一个游戏元素

这里的“地鼠”基本上是一个重新设计的 CSS 标签,它触发复选框黑客。 洞也是如此。 当地鼠的动画将其移到洞上时,在该区域点击会触发地鼠的单选按钮; 当地鼠不在时,点击会触发洞的单选按钮。

下一步是将几个洞并排放置,让地鼠在其中弹跳,每个地鼠都有不同的负 animation-delay。 通过状态机读取哪些地鼠被击中以及哪些洞被塌陷,它就变成了一个有趣的小游戏。

我使用了 简短的 Python 脚本 来生成状态机选择器和地鼠关键帧。 否则,手工编码会变得有点难以处理。 这主要是因为 CSS 也 没有随机数的概念,这使我们别无选择,只能对“随机”地鼠行为进行硬编码。

我们已经有了:一个完整的基于反应的游戏,完全用 HTML 和 CSS 实现。