搜索

棋盘揭示

Mar 28, 2025 am 10:12 AM

Checkerboard Reveal

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

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

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

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

首先,我创建了一些标记

图像可以在 CSS 中作为背景处理在 body 元素上,或者一些设计成特定大小的 <div> 元素上。因此,暂时不需要处理这个问题。但是棋盘很有趣。这是一个图案,上面写满了 CSS Grid 的字样,所以我用一个元素作为网格容器,里面有很多其他的 <code><div> 元素。我不知道一个合法的国际象棋棋盘有多少方块/正方形/无论什么,所以我只是凭空选择了数字 7,然后将其平方得到 49 个正方形。 <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> <p>是的,写出所有这些 <code><div> 元素很痛苦,JavaScript 当然可以提供帮助。但是如果我只是在实验,只需要开发人员的便利性,那么使用 Haml 就可以提供帮助: <pre class="brush:php;toolbar:false">.grid - 49.times do %div</pre> <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
锚定位只是不关心来源订单锚定位只是不关心来源订单Apr 29, 2025 am 09:37 AM

锚定定位避开HTML源顺序的事实是如此css-y,因为它在内容和演示文稿之间的另一个关注点分离。

保证金是什么:40px 100px 120px 80px表示?保证金是什么:40px 100px 120px 80px表示?Apr 28, 2025 pm 05:31 PM

文章讨论了CSS保证金属性,特别是“保证金:40px 100px 120px 80px”,其应用程序以及对网页布局的影响。

什么是不同的CSS边框特性?什么是不同的CSS边框特性?Apr 28, 2025 pm 05:30 PM

本文讨论了CSS边境属性,重点是自定义,最佳实践和响应能力。主要论点:边境 - 拉迪乌斯(Border-Radius)对响应式设计最有效。

什么是CSS背景,列出属性?什么是CSS背景,列出属性?Apr 28, 2025 pm 05:29 PM

本文讨论了CSS背景属性,它们在增强网站设计方面的用途以及避免的常见错误。重点是使用背景大小的响应式设计。

什么是CSS HSL颜色?什么是CSS HSL颜色?Apr 28, 2025 pm 05:28 PM

文章讨论了CSS HSL颜色,其在网络设计中的使用以及比RGB的优势。主要重点是通过直观的颜色操纵来增强设计和可访问性。

我们如何在CSS中添加评论?我们如何在CSS中添加评论?Apr 28, 2025 pm 05:27 PM

本文讨论了CSS中评论的使用,详细介绍了单线和多行评论语法。它认为注释可以增强代码可读性,可维护性和协作,但如果无法正确管理,可能会影响网站性能。

什么是CSS选择器?什么是CSS选择器?Apr 28, 2025 pm 05:26 PM

本文讨论了CSS选择器,其类型和用于造型HTML元素的用法。它比较ID和类选择器,并与复杂的选择器解决性能问题。

哪种类型的CSS持有最高优先级?哪种类型的CSS持有最高优先级?Apr 28, 2025 pm 05:25 PM

本文讨论了CSS优先级,重点是具有最高特异性的内联风格。它解释了特异性级别,覆盖方法和用于管理CSS冲突的工具。

See all articles

热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

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

热工具

禅工作室 13.0.1

禅工作室 13.0.1

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

EditPlus 中文破解版

EditPlus 中文破解版

体积小,语法高亮,不支持代码提示功能

VSCode Windows 64位 下载

VSCode Windows 64位 下载

微软推出的免费、功能强大的一款IDE编辑器

SecLists

SecLists

SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

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