热门标签 | 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的提问。





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








推荐阅读
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 合并列值-合并为一列问题需求:createtabletab(Aint,Bint,Cint)inserttabselect1,2,3unionallsel ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 本文介绍了前端人员必须知道的三个问题,即前端都做哪些事、前端都需要哪些技术,以及前端的发展阶段。初级阶段包括HTML、CSS、JavaScript和jQuery的基础知识。进阶阶段涵盖了面向对象编程、响应式设计、Ajax、HTML5等新兴技术。高级阶段包括架构基础、模块化开发、预编译和前沿规范等内容。此外,还介绍了一些后端服务,如Node.js。 ... [详细]
  • 【shell】网络处理:判断IP是否在网段、两个ip是否同网段、IP地址范围、网段包含关系
    本文介绍了使用shell脚本判断IP是否在同一网段、判断IP地址是否在某个范围内、计算IP地址范围、判断网段之间的包含关系的方法和原理。通过对IP和掩码进行与计算,可以判断两个IP是否在同一网段。同时,还提供了一段用于验证IP地址的正则表达式和判断特殊IP地址的方法。 ... [详细]
  • JavaScript和HTML之间的交互是经由过程事宜完成的。事宜:文档或浏览器窗口中发作的一些特定的交互霎时。能够运用侦听器(或处置惩罚递次来预订事宜),以便事宜发作时实行相应的 ... [详细]
  • Hibernate延迟加载深入分析-集合属性的延迟加载策略
    本文深入分析了Hibernate延迟加载的机制,特别是集合属性的延迟加载策略。通过延迟加载,可以降低系统的内存开销,提高Hibernate的运行性能。对于集合属性,推荐使用延迟加载策略,即在系统需要使用集合属性时才从数据库装载关联的数据,避免一次加载所有集合属性导致性能下降。 ... [详细]
  • 本文介绍了2015年九月八日的js学习总结及相关知识点,包括参考书《javaScript Dom编程的艺术》、js简史、Dom、DHTML、解释型程序设计和编译型程序设计等内容。同时还提到了最佳实践是将标签放到HTML文档的最后,并且对语句和注释的使用进行了说明。 ... [详细]
  • 本文总结了在编写JS代码时,不同浏览器间的兼容性差异,并提供了相应的解决方法。其中包括阻止默认事件的代码示例和猎取兄弟节点的函数。这些方法可以帮助开发者在不同浏览器上实现一致的功能。 ... [详细]
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社区 版权所有