热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

一文入坑【Canvas】多图与案例详解

游戏玩法游戏主要考验玩家的空间感和记忆能力,玩家需要通过开局的3秒内尽可能多的记忆两个空间内相同元素的位置,3秒后将会翻牌把图案盖住,玩




游戏玩法

游戏主要考验玩家的空间感和记忆能力,玩家需要通过开局的3秒内尽可能多的记忆两个空间内相同元素的位置,3秒后将会翻牌把图案盖住,玩家需要点击卡牌来翻转牌面,两张相同图案的卡牌即可保留,游戏计时将在卡牌翻转之后开始,完全翻转所有卡牌则计时结束,我打赌没人能在60秒内通关这个游戏


游戏彩蛋

假如有好事者将鼠标移动到我们的标题看谁翻得快的时候,会发现这是一个复古魂斗罗标题样式,具体实现依赖的是background-image里的repeating-linear-gradient与-webkit-background-clip,我们利用伪元素::before::after ,来实现复古的重叠文字效果。


  • repeating-linear-gradient 重复径向渐变
  • -webkit-background-clip 以盒子内的文字作为裁剪区域向外裁剪,文字之外的区域都将被裁剪掉

看谁翻得快

.title {width: 380px;position: absolute;left: 0;right: 0;top: 0;margin: auto;display: block;color: #1e80ff;font-size: 64px;letter-spacing: 8px;cursor: pointer;
}.title::before {content: "看谁翻得快";position: absolute;color: transparent;background-image: repeating-linear-gradient(45deg,transparent 0,transparent 2px,white 2px,white 4px);-webkit-background-clip: text;top: 0px;left: 0;z-index: -1;transition: 1s;}.title::after {content: "看谁翻得快";position: absolute;color: transparent;background-image: repeating-linear-gradient(135deg,transparent 0,transparent 2px,white 2px,white 4px);-webkit-background-clip: text;top: 0px;left: 0px;transition: 1s;}.title:hover:before {top: 10px;left: 10px;}.title:hover:after {top: -10px;left: -10px;}

核心实现


  • 容器 容器是由720x450的盒子拆成的两个350x450的小盒子构成,大盒子通过flex布局水平垂直居中,小盒子也是通过flex布局实现水平拆分。


#box{width: 720px;height: 450px;display: flex;justify-content: space-between;align-items: center;}.left,.right{width: 350px;height: 450px;background: #fff;border-radius: 8px;overflow: hidden;display: flex;justify-content: space-around;align-items: center;flex-wrap: wrap;transform-style: preserve-3d;}

  • 元素,元素样式是100x100的小卡片,背景图随机生成,背景图来源于掘金商城,随机生成算法还是通过标记法去重,图片一共12张,所以我们需要生成不重复的随机顺序的12个数字,从0开始。将生成的数字以 自定义属性key记录在对应的dom上, 牌面的翻转覆盖效果通过transition配合transform来实现,不管是添加还是移除,都会应用过渡效果,所以看起来像是在翻转一样

// 样式
.left div, .right div{width: 100px;height: 100px;border-radius: 8px;cursor: pointer;box-shadow: inset 0 0 15px 3px rgb(12, 133, 215);background-position: center;background-size: contain;background-repeat: no-repeat;transform: rotateY(180deg);transition: all ease .5s;}#box .shine{transform: rotateZ(360deg) rotateY(360deg);}// 随机算法// 参数map是标记对象,from是为了将dom正确append, imgSrc比较多,不在这里罗列了function randomKey (map, from) {let ket = nulldo {key = Math.floor(Math.random()*len)} while (map[key])let div = $('

')div.addClass('item')div.addClass('shine')div.attr('key', key)div.css('background-image', `url(${imgSrc[key]})`)map[key] = div$(`.${from}`).append(div)}for(let i =0;i
  • 倒计时3s翻转卡牌 ,这里采用了定时器的方法,上面讲过,添加移除transfrom都会响应过渡,那么我们只需要在倒计时结束时统一为卡牌更换背景图即可

let t =setTimeout(function () {for(let i in left_Map) {left_Map[i].removeClass('shine')left_Map[i].css('background-image', `url(https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/0a4ce25d48b8405cbf5444b6195928d4~tplv-k3u1fbpfcp-no-mark:0:0:0:0.awebp)`)}for(let i in right_Map) {right_Map[i].removeClass('shine')right_Map[i].css('background-image', `url(https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/0a4ce25d48b8405cbf5444b6195928d4~tplv-k3u1fbpfcp-no-mark:0:0:0:0.awebp)`)}},3000)

  • 添加点击事件,处理翻牌相同和翻牌不同的情况, 这里,我们需要一个缓存数组cache,将点击获得的属性key缓存在cache里,然后进行判断即可,这里我们只需要判断,cache有长度和cache没长度的情况,有长度则需要进行比较,没长度直接将key缓存在cache内即可,相关注释都在代码里了

$('.item').click(function () {
// 这里判断的是 假如已经翻转了牌面,就不再响应点击事件if ($(this).hasClass('shine')) {return false}// 获取key,将牌面翻转并设置key对应的背景图let key = Number($(this).attr('key'))$(this).addClass('shine')$(this).css('background-image', `url(${imgSrc[key]})`)// 判断缓存数组长度if (cache.length === 1) {// 判断当前点击Key与缓存的key是否一致if (cache.find(v => v===key)

结语 & 码上掘金地址

笔者多次尝试,哪怕作弊,时间也在110秒左右,真的很考验记忆力


最后

整理了75个JS高频面试题,并给出了答案和解析,基本上可以保证你能应付面试官关于JS的提问。





有需要的小伙伴,可以点击下方卡片领取,无偿分享








推荐阅读
  • Ihavetwomethodsofgeneratingmdistinctrandomnumbersintherange[0..n-1]我有两种方法在范围[0.n-1]中生 ... [详细]
  • 本文详细探讨了使用纯JavaScript开发经典贪吃蛇游戏的技术细节和实现方法。通过具体的代码示例,深入解析了游戏逻辑、动画效果及用户交互的实现过程,为开发者提供了宝贵的参考和实践经验。 ... [详细]
  • 每日前端实战:148# 视频教程展示纯 CSS 实现按钮两侧滑入装饰元素的悬停效果
    通过点击页面右侧的“预览”按钮,您可以直接在当前页面查看效果,或点击链接进入全屏预览模式。该视频教程展示了如何使用纯 CSS 实现按钮两侧滑入装饰元素的悬停效果。视频内容具有互动性,观众可以实时调整代码并观察变化。访问以下链接体验完整效果:https://codepen.io/comehope/pen/yRyOZr。 ... [详细]
  • 本文介绍了UUID(通用唯一标识符)的概念及其在JavaScript中生成Java兼容UUID的代码实现与优化技巧。UUID是一个128位的唯一标识符,广泛应用于分布式系统中以确保唯一性。文章详细探讨了如何利用JavaScript生成符合Java标准的UUID,并提供了多种优化方法,以提高生成效率和兼容性。 ... [详细]
  • 通过使用CIFAR-10数据集,本文详细介绍了如何快速掌握Mixup数据增强技术,并展示了该方法在图像分类任务中的显著效果。实验结果表明,Mixup能够有效提高模型的泛化能力和分类精度,为图像识别领域的研究提供了有价值的参考。 ... [详细]
  • 本文介绍如何使用OpenCV和线性支持向量机(SVM)模型来开发一个简单的人脸识别系统,特别关注在只有一个用户数据集时的处理方法。 ... [详细]
  • 本文介绍了如何利用 `matplotlib` 库中的 `FuncAnimation` 类将 Python 中的动态图像保存为视频文件。通过详细解释 `FuncAnimation` 类的参数和方法,文章提供了多种实用技巧,帮助用户高效地生成高质量的动态图像视频。此外,还探讨了不同视频编码器的选择及其对输出文件质量的影响,为读者提供了全面的技术指导。 ... [详细]
  • OpenAI首席执行官Sam Altman展望:人工智能的未来发展方向与挑战
    OpenAI首席执行官Sam Altman展望:人工智能的未来发展方向与挑战 ... [详细]
  • 如何使用 `org.eclipse.rdf4j.query.impl.MapBindingSet.getValue()` 方法及其代码示例详解 ... [详细]
  • Java Socket 关键参数详解与优化建议
    Java Socket 的 API 虽然被广泛使用,但其关键参数的用途却鲜为人知。本文详细解析了 Java Socket 中的重要参数,如 backlog 参数,它用于控制服务器等待连接请求的队列长度。此外,还探讨了其他参数如 SO_TIMEOUT、SO_REUSEADDR 等的配置方法及其对性能的影响,并提供了优化建议,帮助开发者提升网络通信的稳定性和效率。 ... [详细]
  • 利用 Python Socket 实现 ICMP 协议下的网络通信
    在计算机网络课程的2.1实验中,学生需要通过Python Socket编程实现一种基于ICMP协议的网络通信功能。与操作系统自带的Ping命令类似,该实验要求学生开发一个简化的、非标准的ICMP通信程序,以加深对ICMP协议及其在网络通信中的应用的理解。通过这一实验,学生将掌握如何使用Python Socket库来构建和解析ICMP数据包,并实现基本的网络探测功能。 ... [详细]
  • 本指南从零开始介绍Scala编程语言的基础知识,重点讲解了Scala解释器REPL(读取-求值-打印-循环)的使用方法。REPL是Scala开发中的重要工具,能够帮助初学者快速理解和实践Scala的基本语法和特性。通过详细的示例和练习,读者将能够熟练掌握Scala的基础概念和编程技巧。 ... [详细]
  • 每年,意甲、德甲、英超和西甲等各大足球联赛的赛程表都是球迷们关注的焦点。本文通过 Python 编程实现了一种生成赛程表的方法,该方法基于蛇形环算法。具体而言,将所有球队排列成两列的环形结构,左侧球队对阵右侧球队,首支队伍固定不动,其余队伍按顺时针方向循环移动,从而确保每场比赛不重复。此算法不仅高效,而且易于实现,为赛程安排提供了可靠的解决方案。 ... [详细]
  • 针对图像分类任务的训练方案进行了优化设计。通过引入PyTorch等深度学习框架,利用其丰富的工具包和模块,如 `torch.nn` 和 `torch.nn.functional`,提升了模型的训练效率和分类准确性。优化方案包括数据预处理、模型架构选择和损失函数的设计等方面,旨在提高图像分类任务的整体性能。 ... [详细]
  • HTML 页面中调用 JavaScript 函数生成随机数值并自动展示
    在HTML页面中,通过调用JavaScript函数生成随机数值,并将其自动展示在页面上。具体实现包括构建HTML页面结构,定义JavaScript函数以生成随机数,以及在页面加载时自动调用该函数并将结果呈现给用户。 ... [详细]
author-avatar
北干吴
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有