精彩的!纯CSS实现拼图_0
时间:2023-03-19 22:23:10
科技观察
本文将向大家介绍一种将多种CSS技巧发挥到极致,纯CSS实现拼图的技巧。此技巧源自TemaniAfif[1]的CodePenCSSOnlyPuzzlegame[2]。一个完全用CSS实现的拼图游戏。我们要做的就是把零散的图片碎片还原成一张完整的图片,像这样:注意这里完全是用CSS实现的。下面来拆解核心难点:如何让一个元素可以拖拉?如何通过从固定位置拖动使元素停留在另一个位置?最难的是,在(2)的基础上,拖动元素释放后,只有在特定位置释放元素才会固定到新的位置,否则会回到原来的位置OhNo,上面的(2),(3)看起来不是纯CSS就能解决的问题。那么,如何巧妙的搭配组合,最终才能用CSS实现这样的效果呢?让我们逐步分解这个过程。使用draggable属性实现元素的拖动基于上面第一点,如何让一个元素成为可拖动的是最简单的解决方案。在HTML5中,标签被添加了一个draggable属性。设置为true后,即可实现元素的拖动效果。简单的说:
draggablefalse
draggabletrue 我们这样实现两个div,其中第二个设置为draggable="true":setdraggable=For“true”元素,长按鼠标拖动元素:这样就解决了拖动的问题。CodePen演示--HTML可拖动演示[3]。要实现元素从A位置到B位置的移动OK,接下来的难点在于如何将元素从A位置移动到B位置。这里的核心是巧妙地应用过渡元素。我们看这样一个例子,如果有一个元素被translate(120px,120px)偏移了,当我们悬停这个元素时,让它回到原来的位置:div{transform:translate(120px,120px);}div:hover{transform:translate(0,0);}效果如下:这里比较有意思的是:当我们悬停元素时,由于元素的返回,元素又回到了原来的位置,失去了hover状态又回到原来的状态,然后hover状态又被触发了,如此反复,所以你会看到剧烈的跳跃。有没有办法重置它并停止跳回?是的,我们可以通过设置非常大的transition-duraiotn和非常大的transition-delay,让整个过渡效果变得非常慢,慢到我们察觉不到:div{transform:translate(120px,120px);转换:999999s999999s;}div:hover{transform:translate(0,0);transition:0s;}这样元素重置后,就再也不会跳回了(理论上):如果,我们把上面的transition:999999s999999s表示应该设置transitionduration和transitiondelaytime**更短。比如两者都设置为2s,transition:2s2s,效果如下:这样,你应该能大致明白发生了什么。通过:active伪类实现触发器当然,以上知识还不够。首先,元素的移动不是悬停触发的,而是需要拖动到特定位置,释放鼠标的拖动效果,才能实现元素的移动。此外,元素只有在特定位置被释放时才能移动。这怎么可能?这里,我们还需要通过事件冒泡。我们简单修改一下代码,给元素添加一个父元素,然后添加一个标签元素:
FLAG