目录
首先,我创建了一些标记
设置背景图像
样式网格
样式方块
动画方块
嗯,也许动画应该是可选的……
就这样!
首页 web前端 css教程 棋盘揭示

棋盘揭示

Mar 28, 2025 am 10:12 AM

Checkerboard Reveal

还记得我十岁的时候,表哥来我家做客。他(现在仍然是)个很酷的孩子,那种会带着自己编程的国际象棋游戏光盘的孩子。他的国际象棋版本和他本人一样酷,因为棋盘的一部分会在每一步之后消失。

更酷的是?棋盘上消失的每一块都会显示出一张非常漂亮的图片。

我认为同样的想法可以制作出一些非常酷炫的用户界面。只是,也许不需要用户交互来显示背景,它可以简单地作为动画播放。这就是我的最终成果:

这个想法很简单,还有很多其他的方法可以实现,但这是我遵循的思路……

首先,我创建了一些标记

图像可以在 CSS 中作为背景处理在 body 元素上,或者一些设计成特定大小的 <div> 元素上。因此,暂时不需要处理这个问题。但是棋盘很有趣。这是一个图案,上面写满了 CSS Grid 的字样,所以我用一个元素作为网格容器,里面有很多其他的 <code><div> 元素。我不知道一个合法的国际象棋棋盘有多少方块/正方形/无论什么,所以我只是凭空选择了数字 7,然后将其平方得到 49 个正方形。 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">&lt;div&gt; &lt;div&gt;&lt;/div&gt; &lt;div&gt;&lt;/div&gt; &lt;/div&gt;</pre><div class="contentsignin">登录后复制</div></div> <p>是的,写出所有这些 <code><div> 元素很痛苦,JavaScript 当然可以提供帮助。但是如果我只是在实验,只需要开发人员的便利性,那么使用 Haml 就可以提供帮助: <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">.grid - 49.times do %div</pre><div class="contentsignin">登录后复制</div></div> <p>最终结果都一样。无论哪种方式,这都给了我开始样式设计所需的所有标记!</p> <h2 id="设置背景图像">设置背景图像</h2> <p>同样,这可以在 <code>body 或其他元素上作为 background-image 发生,这取决于它的使用方式——只要它覆盖整个空间即可。因为我无论如何都需要一个网格容器,所以我决定使用它。

.checkerboard {
  background-image: url('walrus.jpg');
  background-size: cover;
  /* 可能需要其他属性来正确定位图像 */
}
登录后复制

渐变是光栅图像文件的一部分,但我可以用某种在 body 元素上的叠加层来巧妙地处理,使用伪元素,例如 :after。哎呀,这正是 CSS-Tricks 当前设计的常用技术。

样式网格

是的,我使用了 CSS Grid。制作一个 7×7 的网格非常容易。

.checkerboard {
  background-image: url('walrus.jpg');
  background-size: cover;
  display: grid;
  grid-template-columns: repeat(7, 1fr);
  grid-template-rows: repeat(7, 1fr);
}
登录后复制

我想一旦我们看到 aspect-ratio 得到广泛支持,这将会好得多,至少如果我正确理解的话。我现在的问题是网格没有保持任何比例。这意味着棋盘的方块在不同的视口大小下都会变得很挤压。不好。如果这非常重要,我们可以在此期间做一些小的技巧,但我决定保持原样。

样式方块

它们在白色和深灰色之间交替出现,因此:

.checkerboard > div {
  background-color: #fff;
}
.checkerboard > div:nth-child(even) {
  background-color: #2f2f2f;
}
登录后复制

信不信由你,我们的标记和样式已经完成了!剩下的就是……

动画方块

所有动画需要做的就是将每个方块从 opacity: 1; 转换为 opacity: 0;,CSS 动画非常适合这个。

@keyframes poof {
  to {
    opacity: 0;
  }
}
登录后复制

太棒了!我甚至不需要设置起始关键帧!我所要做的就是调用方块上的动画。

.checkerboard > div {
  animation-name: poof;
  animation-duration: 0.25s;
  animation-fill-mode: forwards;
  background: #fff;
}
登录后复制

是的,我本可以在这里使用动画简写属性,但我经常发现将它的组成属性单独分开更容易,因为……好吧,它们太多了,在一行中很难阅读和识别。

如果您想知道为什么在这里需要 animation-fill-mode,那是因为它可以防止动画在设置为 forwards 时循环回到动画的开始。换句话说,当动画结束后,每个方块都会保持 opacity: 0;,而不是重新出现。

我真的很想做一些聪明的事情来交错方块的 animation-delay,但我遇到了一些障碍,最终决定放弃我使用 100% 原生 CSS 的努力,改用一些轻量级的 SCSS。这样,我就可以遍历所有方块,并使用一个相当标准的函数为每个方块偏移动画。所以,抱歉突然切换!那只是旅程的一部分。

$columns: 7;
$rows: 7;
$cells: $columns * $rows;

@for $i from 1 through $cells {
  .checkerboard > div:nth-child(#{$i}) {
    animation-delay: (random($cells) / $columns)   s;
  }
}
登录后复制

让我们分解一下:

  • 有网格列数($columns)、网格行数($rows)和单元格总数($cells)的变量。最后一个是前两个相乘的积。如果我们知道我们总是在一个完美的正方形网格中工作,那么我们可以对其进行一些重构,使用指数来计算单元格的数量。
  • 然后对于 1 到 $cells 总数(在本例中为 49)之间的每个单元格实例,每个单独的方块都会根据其 :nth-child() 值获得一个 animation-delay。因此,第一个方块是 div:nth-child(1),然后是 div:nth-child(2),依此类推。查看演示中的编译后的 CSS,您将看到它如何全部展开。
/* Yes, Autoprefixer is in there... */
.checkerboard > div:nth-child(1) {}
.checkerboard > div:nth-child(2) {}
/* etc. */
登录后复制
  • 最后,animation-delay 是一个计算,它取 1 到 $cells 总数之间的随机数,除以 $columns 的数量,并在值后面附加秒。这是最好的方法吗?我不知道。这归结于四处玩弄一些东西,然后找到对你来说感觉“正确”的东西。这对我来说感觉“正确”。

我真的很想发挥创意并使用 CSS 自定义属性,而不是求助于 SCSS。我喜欢自定义属性和值可以在客户端更新,而 SCSS 中计算出的值在构建时编译并保持不变。同样,这正是我非常想改用 JavaScript 的地方。但是,我已经铺好了床,只能睡在上面。

如果您早些时候查看了编译后的 CSS,那么您将看到计算出的值:

.checkerboard > div:nth-child(1) {
  animation-delay: 4.5714285714s;
}

.checkerboard > div:nth-child(2) {
  animation-delay: 5.2857142857s;
}

.checkerboard > div:nth-child(3) {
  animation-delay: 2.7142857143s;
}

.checkerboard > div:nth-child(4) {
  animation-delay: 1.5714285714s;
}
登录后复制

嗯,也许动画应该是可选的……

有些人对运动和移动很敏感,因此最好更改设置,以便仅当用户喜欢时才设置方块的样式和动画。我们有一个媒体查询来实现这一点!

@media screen and (prefers-reduced-motion: no-preference) {
  .checkerboard > div {
    animation-name: poof;
    animation-duration: 0.25s;
    animation-fill-mode: forwards;
    background: #fff;
  }
  .checkerboard > div:nth-child(even) {
    background: #2f2f2f;
  }
}
登录后复制

就这样!

以上是棋盘揭示的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

<🎜>:泡泡胶模拟器无穷大 - 如何获取和使用皇家钥匙
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系统,解释
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆树的耳语 - 如何解锁抓钩
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Java教程
1672
14
CakePHP 教程
1428
52
Laravel 教程
1332
25
PHP教程
1277
29
C# 教程
1257
24
静态表单提供商的比较 静态表单提供商的比较 Apr 16, 2025 am 11:20 AM

让我们尝试在这里造成一个术语:“静态表单提供商”。你带上html

使Sass更快的概念证明 使Sass更快的概念证明 Apr 16, 2025 am 10:38 AM

在一个新项目开始时,Sass汇编发生在眼睛的眨眼中。感觉很棒,尤其是当它与browsersync配对时,它重新加载

每周平台新闻:HTML加载属性,主要的ARIA规格以及从iframe转移到Shadow dom 每周平台新闻:HTML加载属性,主要的ARIA规格以及从iframe转移到Shadow dom Apr 17, 2025 am 10:55 AM

在本周的平台新闻综述中,Chrome引入了一个用于加载的新属性,Web开发人员的可访问性规范以及BBC Move

带有HTML对话框元素的一些动手 带有HTML对话框元素的一些动手 Apr 16, 2025 am 11:33 AM

这是我第一次查看HTML元素。我已经意识到了一段时间,但是尚未将其旋转。它很酷,

纸张形式 纸张形式 Apr 16, 2025 am 11:24 AM

购买或建造是技术的经典辩论。自己构建东西可能会感觉更便宜,因为您的信用卡账单上没有订单项,但是

'订阅播客”链接应在哪里? '订阅播客”链接应在哪里? Apr 16, 2025 pm 12:04 PM

有一段时间,iTunes是播客中的大狗,因此,如果您将“订阅播客”链接到喜欢:

托管您自己的非JavaScript分析的选项 托管您自己的非JavaScript分析的选项 Apr 15, 2025 am 11:09 AM

有很多分析平台可帮助您跟踪网站上的访问者和使用数据。也许最著名的是Google Analytics(广泛使用)

See all articles