使用CSS Grid重新创建Fool Mate象棋

当Firefox 66发布时,我和其他一些布局爱好者真正兴奋的功能之一就是在使用CSS Grid时能够为网格行和列(除了网格间隙)设置动画。它一直写在规范中,但浏览器实现它需要一些时间。

我之前在Bits博客上写了一篇介绍性文章,但还有更多要探索的内容。那篇文章链接到我能找到的尽可能多的动画演示,但我一直在思考的是Andrew Harvard的DVD徽标。

我首选的确定演示工作原理的方法是使用Firefox DevTools观察它。它让我大吃一惊。来吧,亲自试试吧,我等一下。只要您使用的是Firefox 66或更高版本,徽标就应该在嵌入式设备周围弹跳。

好吧,对于那些选择不以任何理由自己尝试的人,这里有一个GIF,但它并不是那么好的品质。

我不是DevTools工程师,但我希望确保网格检查员完全支持网格行和列的动画,这意味着当行号被切换时,它们也被动画化了。

DVD徽标教给我的是什么

对我来说,当我第一次看到没有检查的动画时,我首先想到的是网格项目正在整个网格中进行动画处理。但事实并非如此。至少,不是直接的。从某种意义上说,网格项目是动画的,但不是我想象的那样。

这就是我认为它的工作原理(扰流板:它不是)

动画的内容是网格行或列。这就是为什么我们使用DevTools产生了很酷的效果(这对我很酷,我不了解你……)但这也意味着你必须扭曲你的网格以使其中的内容生动。

这实际上可以动画

在讨论CSS网格如何改变网页布局时,我最喜欢使用的类比之一就是比较网格项的位置,比如将棋子放在棋盘上。因此,我的下一个想法是创建一个棋盘,棋盘上可以动画。

但是一旦我弄清楚网格项目的动画是如何起作用的,我就意识到了这一挑战。我无法维持一个普通的棋盘并同时移动棋子。

所以你需要移动一些东西

如果你期待这个问题有一些非常智能解决方案,我很抱歉让你失望,但我的解决方案是最不智能。需要移动的每个部件都在自己的网格中,并且所有网格都通过定位堆叠在彼此之上。

朋友,这都是骗局。

但它有效,所以那里。

因此,傻瓜的伴侣也被称为国际象棋中的双动同伴。根据维基百科:

傻瓜的伴侣之所以得名,是因为只有在白方犯下非常大错的情况下才会出现这种情况。

White的开场动作是f3,然后Black用g4回应,然后White回到g4而Black回到Qh4,一切都结束了。这有不同之处,但我选择了维基百科上的默认版本。我之所以选择Fool's Mate是因为它只涉及总共4次动画制作。 _(ツ)_ /¯

创建国际象棋棋盘

让我们谈谈国际象棋棋盘,因为我仍然有点像这样的结果。我选择了黑色位于顶部且白色位于底部的电路板配置。我猜大多数人会首先考虑为棋盘上的每个方块创建64个网格项目。

但我想减少加价。因此,我只创建了28个网格项作为我的静态棋子,而不是这样做 linear-gradient 在网格容器上生成必需的棋盘图案。

此外,每个棋子都有表情符号支持。我的表情符号棋,谢谢。

 class="grid board">    class="grid__item piece">
class="grid__item piece">
class="grid__item piece">
class="grid__item piece">
class="grid__item piece">
class="grid__item piece">
class="grid__item piece">
class="grid__item piece"> class="grid__item piece"> class="grid__item piece"> class="grid__item piece"> class="grid__item piece"> class="grid__item piece"> class="grid__item piece"> class="grid__item piece row7"> class="grid__item piece row7"> class="grid__item piece row7"> class="grid__item piece row7"> class="grid__item piece row7"> class="grid__item piece row7"> class="grid__item piece row8"> class="grid__item piece row8"> class="grid__item piece row8"> class="grid__item piece row8"> class="grid__item piece row8"> class="grid__item piece row8"> class="grid__item piece row8"> class="grid__item piece row8">

至于实际的棋盘,这是它的生成方式。工作得很好,但唯一的事情是取决于视口的大小,你可能会看到一些深色的方块上有一个非常微弱的白色对角线间隙。

.board {   background-color: #eee;   background-image: linear-gradient(45deg, #d18b47 25%, transparent 25%, transparent 75%, #d18b47 75%, #d18b47),   linear-gradient(45deg, #d18b47 25%, transparent 25%, transparent 75%, #d18b47 75%, #d18b47);   background-size: 24vmin 24vmin;   background-position: 0 0, 12vmin 12vmin;   width: 96vmin;   height: 96vmin;   margin: auto; } 

让我们分解这块CSS,不是吗?在平方上应用该线性渐变

它自己给你这样的东西。因为我们正在以45度角施加硬停。我也宣布了2个完全相同的线性渐变,但这是有原因的。你会看到的。

接下来,我们有 background-size 属性。背景属性我觉得很有趣,因为它们通常有很多不同的语法。在这种情况下,您可以使用关键字,1值语法,2值语法,多个背景(使用逗号)和全局值。好玩,对吗?

要记住的一件事是,如果您没有明确声明,浏览器支持的所有CSS属性都将应用默认值。的默认值 background-repeatrepeat

无论如何,通过将背景大小设置为主要宽度和高度的四分之一

,我最终得到了一个4 x 4的重复模式。通过将值设置为,您将获得相同的效果 25% 25%

也许你们中的一些人可以看到它的发展方向,但下一步是将三角形的形状放置成它们组合形成正方形的方式。 background-position 也做1值或2值语法的事情。这是第二个线性渐变的来源。

background-position 通过相应地用逗号匹配它们可以应用于多个背景。所以第一组价值观 0, 0 是第一个线性渐变,第二个是值 12vmin 12vmin 用于第二个线性渐变。

所以我们正在做的是向下和向右推动第二个线性渐变,使三角形相遇并形成正方形。对于我的例子,我使用的是长度值 12vmin 但是你可以通过使用获得相同的效果 50% 同样。

放置棋子

您可能想知道我为国际象棋棋子选择的CSS类。我之前的实验涉及许多网格项目,它们之间存在间隙,并了解到您不必明确放置每个网格项目。

我想要的是让网格与我的网格容器的背景匹配,这就是我选择使用视口单元而不是百分比的原因。所以我的网格行和列看起来像这样,其中值与背景大小匹配:

.board {   display: grid;   grid-template-columns: repeat(8, 12vmin);   grid-template-rows: repeat(8, 12vmin); } 

在32个棋子中,28个是静态的。但我必须考虑需要动画的片段的差距。

.board .piece:nth-child(4) { grid-column: 5 } .board .piece:nth-child(12) { grid-column: 6 } .board .piece:nth-child(20) { grid-column: 8 } .row7 { grid-row: 7 } .row8 { grid-row: 8 } 

由于自动放置,我可以通过明确地将King(第4个孩子)放在第5列,f7(第12个孩子)第6列上的pawn和第2个h2(第20个孩子)上的pawn来“向前”推送网格项目8。

但是所有的白色都处于网格的底部,所以我们有 .row7 将所有白色棋子推到第7行和第7行的类 .row8 将白色非棋子推到第8行的价格。

动画4个动作

图像来源

Black的移动棋子是第一排的女王,第二排的e7的棋子。对于怀特来说,这些棋子位于棋盘网格的第7行和第8行。移动的棋子是f2和g2的棋子。

还记得DVD演示吗?因此,每一步都将成为自己网格中的一个单一部分。例如,这是Black Queen的代码。

.move1 {   grid-template-columns: 72vmin 1fr;   grid-template-rows: 84vmin 1fr;   transition: grid-template-rows 0.5s linear; }  .move1.active {   grid-template-rows: 72vmin 1fr; } 

我选择了过渡而不是关键帧,因为我的作品只是进行了一次移动。 DVD徽标使用关键帧,因为它是连续动画。正确工作的正确工具,不是吗?

这里涉及Javascript,因为我想让它成为一种互动,人们可以点击一个按钮来移动下一个部分。

它只有4个动作,所以我觉得它不会太难。需要一个计数器来跟踪移动的开始和结束,但除此之外,它是添加和删除CSS类。

const prevBtn = document.getElementById('prev') const nextBtn = document.getElementById('next')  let moves = 0  prevBtn.addEventListener('click', prevHandler, false) nextBtn.addEventListener('click', nextHandler, false)  function nextHandler() {   if (moves < 4) {     countUp()     addActive(moves)     console.log(moves)   } else {     console.log('Already checkmate')   } }  function prevHandler() {   if (moves > 0) {     removeActive(moves)     countDown()     console.log(moves)   } else {     console.log('Back to the start')   } }  function addActive(moves) {   const activeMove = document.querySelector('.move' + moves)   activeMove.classList.add('active') }  function removeActive(moves) {   const activeMove = document.querySelector('.move' + moves)   activeMove.classList.remove('active') }  function countUp() {   return moves++ }  function countDown() {   return moves-- } 

总结

如果您想确切了解所有内容是如何组合在一起的话,这就是CodePen上的全部内容。

如果你觉得这很有趣,也许试一试吧?我真的很想知道可以用这种行为设计和构建其他东西,所以请随意用你的创作来ping我。我还要大声呼喊Christopher Powroznik创建One HTML Page Challenge。

我已经在那里提出了这个傻瓜的伴侣演示,但是还有更多可以在一页中完成。在没有外部依赖关系的情况下构建更改非常有趣。

资讯来源:由0x资讯编译自DEV,原文:https://dev.to/huijing/recreating-the-fool-s-mate-chess-move-with-css-grid-3omh ,版权归作者所有,未经许可,不得转载
你可能还喜欢