还记得我十岁的时候,表哥来我家做客。他(现在仍然是)个很酷的孩子,那种会带着自己编程的国际象棋游戏光盘的孩子。他的国际象棋版本和他本人一样酷,因为棋盘的一部分会在每一步之后消失。
更酷的是?棋盘上消失的每一块都会显示出一张非常漂亮的图片。
我认为同样的想法可以制作出一些非常酷炫的用户界面。只是,也许不需要用户交互来显示背景,它可以简单地作为动画播放。这就是我的最终成果:
这个想法很简单,还有很多其他的方法可以实现,但这是我遵循的思路……
首先,我创建了一些标记
图像可以在 CSS 中作为背景处理在 body
元素上,或者一些设计成特定大小的 <div> 元素上。因此,暂时不需要处理这个问题。但是棋盘很有趣。这是一个图案,上面写满了 CSS Grid 的字样,所以我用一个元素作为网格容器,里面有很多其他的 <code><div> 元素。我不知道一个合法的国际象棋棋盘有多少方块/正方形/无论什么,所以我只是凭空选择了数字 7,然后将其平方得到 49 个正方形。
<pre class="brush:php;toolbar:false"><div>
<div></div>
<div></div>
</div></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中文网其他相关文章!

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

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

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


热AI工具

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

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

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

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

热门文章

热工具

禅工作室 13.0.1
功能强大的PHP集成开发环境

EditPlus 中文破解版
体积小,语法高亮,不支持代码提示功能

VSCode Windows 64位 下载
微软推出的免费、功能强大的一款IDE编辑器

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

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