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

news2024/11/25 0:37:39

游戏玩法

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

游戏彩蛋

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

  • repeating-linear-gradient 重复径向渐变
  • -webkit-background-clip 以盒子内的文字作为裁剪区域向外裁剪,文字之外的区域都将被裁剪掉
<div class="title">看谁翻得快</div>
.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布局实现水平拆分。
<div id="box"><div class="left"></div><div class="right"></div></div>
#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>')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<imgSrc.length;i++) {randomKey(left_Map, 'left')randomKey(right_Map, 'right')} 
  • 倒计时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) <img src="https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/0a4ce25d48b8405cbf5444b6195928d4~tplv-k3u1fbpfcp-no-mark:0:0:0:0.awebp)`)$(self).removeClass('shine')$(self).css('background-image', `url(https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/0a4ce25d48b8405cbf5444b6195928d4~tplv-k3u1fbpfcp-no-mark:0:0:0:0.awebp)`)}, 500)}} else { // 没长度直接记录缓存cache.push(key)}})" style="margin: auto" />

结语 & 码上掘金地址

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

最后

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



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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/89416.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

小型水库雨水情测报及大坝安全监测建设介绍

一、背景介绍 二、站点布设 布局示意图&#xff1a; 红色&#xff1a;坝轴线 兰色&#xff1a;监测横断面&#xff0c;一般不少于3个&#xff0c;300m内间距2050m&#xff0c;300m外间距5010m。黄色:监测纵断面&#xff0c;一般不少于4个。上游坝坡正常蓄水位以上应布设1个。…

ssm+Vue计算机毕业设计校园闲置物品管理系统的实现(程序+LW文档)

ssmVue计算机毕业设计校园闲置物品管理系统的实现&#xff08;程序LW文档&#xff09; 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff0…

WPF TreeView拖动排序拖拽排列

底部附有Demo示例。需要的朋友可以去下载参考 一、图示 先上图&#xff0c;不知为啥&#xff0c;GIF总看起来特别卡&#xff0c;实际却很流畅。 由于录制问题&#xff0c;GIF动画只会播放一次&#xff0c;需要重复观看的&#xff0c;请将网页关闭后重新打开再观看 WPF的资料…

自动化运维与普通运维有什么区别?

本文首发于知乎&#xff0c;由嘉为蓝鲸原创。 商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。 01. 何为自动化运维&普通运维&#xff1f; 在了解两者的区别前&#xff0c;我们得先明确对二者的定义&#xff0c;总的来说运维工作的目的都是为了保障企业业…

Gateway简介

文档&#xff1a;Spring Cloud Gateway 小结&#xff1a; nacos &#xff1a;注册中心&#xff0c;解决服务的注册与发现 nacos &#xff1a;配置中心&#xff0c;配置文件中心化管理 Ribbon&#xff1a;客户端负载均衡器&#xff0c;解决微服务集群负载均衡的问题 Openfeign…

网络工程毕业设计 SSM游戏攻略资讯补丁售卖系统(源码+论文)

文章目录1 项目简介2 实现效果2.1 界面展示3 设计方案3.1 概述3.2 系统流程3.3 系统结构设计4 项目获取1 项目简介 Hi&#xff0c;各位同学好呀&#xff0c;这里是M学姐&#xff01; 今天向大家分享一个今年(2022)最新完成的毕业设计项目作品&#xff0c;【基于SSM的游戏攻略…

容器安全——云原生中镜像容器全生命周期防护思路

文章目录容器简介容器镜像传统安全面对容器安全的表现无法匹配动态IP无法侦测到容器内的各种行为无法扫描各种分层存储的镜像文件无法适应新的容器引擎和框架镜像容器全生命周期的安全防护Build防护Ship防护Run防护容器简介 我们都知道&#xff0c;VM是通过Hypervisor虚拟化技…

没有备份电脑照片怎么恢复?分享3种找回照片方法

随着科学技术的不断发展&#xff0c;越来越多的人喜欢使用手机或相机进行拍摄&#xff0c;但是这些设备存储照片量多后&#xff0c;容易导致卡顿甚至无法拍摄的情况发生&#xff0c;对此&#xff0c;婚纱/新闻/美食/广告摄影等职业人员&#xff0c;会习惯性将这些设备上的照片导…

VR如何改变办公场所,听一听Meta的预测

近期&#xff0c;为了更好的了解人们对于元宇宙、VR的看法&#xff0c;以及这对办公场景带来的影响&#xff0c;Meta对全球2000多名企业员工和400名企业领导进行调研。调查结果显示&#xff0c;66%的受调查者认为VR有助于还原线下办公的团结感&#xff08;togetherness&#xf…

Linux系统Initramfs机制

概述 现代Linux系统都使用到了一种功能比较特殊的微型系统&#xff0c;作为Linux内核初始化完成但未进入最终系统时的过渡系统&#xff0c;主要的目的是为了将最终系统载入到根文件系统上&#xff0c;辅助内核启动最终系统&#xff0c;可以称之为“辅助系统”。 辅助系统的作…

【C语言数据结构(基础篇)】第三站:链表(一)

目录 一、动态顺序表的缺陷以及链表的引入 1.动态顺序表的缺陷&#xff0c;以及链表的引入 2. 链表的概念 3.链表的声明 4.链表的逻辑结构与物理结构 二、单链表的实现 1.单链表的创建 2.单链表的打印 3.单链表的尾插 4.单链表的头插 5.单链表的头删、尾删 6.查找链表…

WPF入门第四篇 WPF模板

WPF模板 1、ControlTemplate 上一篇已经试用过控件模板&#xff0c;我们知道WPF的控件都是继承自Control&#xff0c;在Control类中有一个Template属性&#xff0c;类型就是ControlTemplate。那么利用这个ControlTemplate就可以彻底的颠覆控件的默认外观。 <Window x:Cla…

如何使用Unity ARFoundation和XR Interaction Toolkit对Prefab进行选择、缩放、移动、和旋转操作?

本文分享一种很常见的AR体验的实现。这种AR体验即&#xff0c;手机相机检测到指定图片/平面/实物之后&#xff0c;虚拟模型随之出现&#xff0c;并允许用户在屏幕上使用手势&#xff08;例如双指捏合&#xff09;对该虚拟模型进行选择、缩放、移动、和旋转操作。 这种体验有很…

【Spring】——14、如何使用@Value注解为bean的属性赋值呢?

&#x1f4eb;作者简介&#xff1a;zhz小白 公众号&#xff1a;小白的Java进阶之路 专业技能&#xff1a; 1、Java基础&#xff0c;并精通多线程的开发&#xff0c;熟悉JVM原理 2、熟悉Java基础&#xff0c;并精通多线程的开发&#xff0c;熟悉JVM原理&#xff0c;具备⼀定的线…

flask之g对象、flask-session使用、数据库连接池、信号

目录 g对象 flask-session的使用 数据库连接池 flask中集成mysql wtfroms使用(了解) 信号 g对象 全称global&#xff0c;是一个全局对象在此次请求过程中一直有效&#xff0c;其实就是请求的上下文从请求进来就一直存在直到请求结束&#xff0c;所以在当次请求过程中&…

华为云WeLink云空间,企业的多啦A梦「百宝袋」办公助手

我们知道&#xff0c;源自华为19万员工的数字化办公实践的华为云WeLink&#xff0c;作为新一代智能工作平台、远程办公平台、移动办公平台、协同办公软件&#xff0c;已经给成为企业数字化转型的连接器。今天&#xff0c;我们来聊一聊WeLink提供的一项优质服务——云空间。 We…

论文复现-2代码研读:Black-Box Tuning for Language-Model-as-a-Service

第一步&#xff1a;将作者所给代码跑通。 下载代码&#xff0c;放置在本地文件夹。 报错问题一&#xff1a; 使用hugging face 中loaddataset函数报错。显示connect error。 修改如下&#xff1a;将数据集下载文件.py文件在本地&#xff0c;然后从.py文件中加载数据集。 解决…

【深度学习】PyTorch深度学习实践 - Lecture_13_RNN_Classifier

文章目录一、问题描述二、OurModel三、准备数据3.1 Data Convert3.2 Padding Data3.3 Label Convert四、双向RNN五、PyTorch代码实现5.1 引入相关库5.2 创建Tensors函数5.3 将名字转化为字符列表函数5.4 国家名字数据集对象5.5 RNN&#xff08;GRU&#xff09;分类器对象5.6 训…

Nacos--多环境的实现方案

原文网址&#xff1a;Nacos--多环境的实现方案_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍Nacos实现多环境的方案。 方案概述 多环境有很多方案&#xff0c;如下&#xff1a; 单租户方案&#xff08;适用于项目很少的场景&#xff09; 命名空间区分环境&#xff0c;GR…

Python简介

Python简介 目录1. 概述2. 安装3. 编译器4. 注释5. 缩进6. 编码规范7. 基本输入输出使用print()函数输出使用input()函数输入8. 练习1. 概述 Python的中文意思是蟒蛇&#xff0c;python是一种面向对象的解释型的计算机程序设计语言。支持面向过程&#xff0c;面向对象&#xff…