用60行代码实现一个高性能的圣诞抽抽乐H5小游戏(含源码)
效果展示一个人几乎可以在任何他怀有无限热忱的事情上成功.
图片
将收获•防抖函数的应用•用css实现九宫格布局•生成n维环形坐标的算法•如何实现环形随机轨道运动函数•实现加速度动画•性能分析与优化
(资料图片仅供参考)
图片
具体实现由于目前已有很多方案可以实现九宫格抽奖动画,比如使用动态active实现边框动画,用随机算法和定时器设置在何处停止等等. 为了进一步提高性能,本文介绍的方法,将使用坐标法,将操作dom的成本降低,完全由js实现滑块的路径的计算,滑块元素采用绝对定位,让其脱离文档流,避免其他元素的重绘等等,最后点击按钮我们会使用防抖函数来避免频繁执行函数,造成不必要的性能损失.
1. 九宫格布局实现为了让大家更加熟悉dom结构,这里我就不用js动态生成了.如下html结构:
圣诞抽抽乐 我爱你 你爱我 我不爱你 你爱我 开始 你爱我 再见 谢谢惠顾 你爱我 九宫格布局我们使用flex来实现,核心代码如下:
.box { display: flex; flex-wrap: wrap; width: 300px; height: 300px; position: relative; .item { box-sizing: border-box; width: 100px; } // 滑块 .spin { box-sizing: border-box; position: absolute; left: 0; top: 0; display: inline-block; width: 100px; height: 100px; background-color: rgba(0,0,0,.2); }}由上可知容器box采用flex布局,要想让flex子元素换行,我们这里要设置flex-wrap: wrap;此时九宫格布局就实现了. 滑块采用绝对定位,至于具体如何去沿着环形轨道运动,请继续看下文介绍.
2.生成n维环形坐标的算法图片
由上图我们可以知道,一个九宫格的4条边,可以用以上8个坐标收尾连接起来,那么我们可以基于这个规律.来生成环形坐标集合.代码如下:
/** * 生成n维环形坐标 * @param {number} n 维度 * @param {number} cell 单位坐标长度 */function generateCirclePath(n, cell) { let arr = [] for(let i=0; i< n; i++) { arr.push([i*cell, 0]) } for(let i=0; i< n-1; i++) { arr.push([(n-1)*cell, (i+1)*cell]) } for(let i=0; i< n-1; i++) { arr.push([(n-i-2)*cell, (n-1)*cell]) } for(let i=0; i< n-2; i++) { arr.push([0, (n-i-2)*cell]) } return arr}如果是单位坐标,那么cell为1,cell设计的目的就位为了和现实的元素相结合,我们可以手动设置单元格的宽度来实现不同大小的n维环形坐标集.
3.实现环形随机轨道运动函数由抽奖动画分析可知,我们滑块运动的轨迹,其实就是环形坐标集合,所以我们只要让滑块的顶点(默认左上角)沿着环形坐标集合一步步变化就好了.
function run(el, path, n = 1, i = 0, len = path.length) { setTimeout(() => { if(n > 0) { if(len <= i) { i = n === 1 ? len : 0 n-- } el.css("transform", `translate(${path[i][0]}px, ${path[i][1]}px)`) run(el, path, n, ++i, len) } }, 300) }这样就能实现我们的滑块按照九宫格边框运动的动画了,当然以上函数只是基本的动画, 还没有实现在随机位置停止, 以及滑块的加速度运动,这块需要一定的技巧和js基础知识比如闭包.
3.1 加速度运动加速度运动其实很简单,比如每转过一圈将setTimeout的延迟时间改变即可.代码如下:
function run(el, path, n = 1, speed = 60, i = 0, len = path.length) { setTimeout(() => { if(n > 0) { if(len <= i) { i = n === 1 ? len : 0 n-- speed += (300 - speed) / n } el.css("transform", `translate(${path[i][0]}px, ${path[i][1]}px)`) run(el, path, n, speed, ++i, len) } }, speed) }3.2 随机停止实现随机停止这块主要是用了Math.random这个API, 我们在最后一圈的时候, 根据随机返回的数值来决定何时停止,这里我们在函数内部实现随机数值,完整代码如下:
/*** 环形随机轨道运动函数* @param {element} el 运动的dom元素* @param {array} path 运动的环形坐标集合* @param {number} speed 运动的初始速度* @param {number} i 运动的初始位置* @param {number} len 路径的长度* @param {number} random 中奖坐标*/function run(el, path, n = 1, speed = 60, i = 0, len = path.length, random = Math.floor(Math.random() * len)) { setTimeout(() => { if(n > 0) { // 如果n为1,则设置中奖数值 if(n === 1) { len = random } if(len <= i) { i = n === 1 ? len : 0 n-- speed += (300 - speed) / n } el.css("transform", `translate(${path[i][0]}px, ${path[i][1]}px)`) run(el, path, n, speed, ++i, len, random) } }, speed) }4.实现点击开始的防抖函数以及应用防抖函数实现:
// 防抖函数,避免频繁点击执行多次函数function debounce(fn, interval = 300) { let timeout = null return function () { clearTimeout(timeout) timeout = setTimeout(() => { fn.apply(this, arguments) }, interval) }}那么我们点击时,代码应该长这样:
// 点击开始按钮,开始抽奖$(".start").on("click",debounce(() => { run($(".spin"), generateCirclePath(3, 100), 3) }))总结该实现方式的好处是支持n维环形坐标的抽奖,基于坐标法的应用还有很多,尤其是游戏和图形领域,在实现过程中一定要考虑性能和可扩展性,这样我们就可以在不同场景使用同一套方法论,岂不乐哉?
最后如果想了解更多H5游戏,webpack,node,gulp,css3,javascript,nodeJS,canvas数据可视化等前端知识和实战,关注《趣谈前端》加入我们一起学习讨论,共同探索前端的边界。
标签:
- 用60行代码实现一个高性能的圣诞抽抽乐H5小游戏(含源码)
- 永春9岁女孩被蛇咬伤 奶奶用蜘蛛吸毒致其“毒上加毒”
- 达亿瓦纺车轮_达亿瓦
- “泰坦”号潜水器运营公司宣布暂停运营
- 热射病就是中暑?车内暴晒的矿泉水会致癌?真相→
- 山东省节能审查实行分级分类管理
- 特斯拉全新Model 3:电池选择有误读!磷酸铁锂非首选
- 为情所伤的心情说说(被情所伤的说说简介介绍)
- 切尔西跟队记者:为普利希奇报价1890万英镑后,...
- 周星驰晒看《八角笼中》擦泪照 称王宝强是最优秀导演
- 男单林高远和王楚钦 林高远夺男单冠军 基本情况讲解
- 聚焦数字经济新趋势 2023数交会今日开幕
- 国家卫生健康委成立国家级医疗应急工作专家组
- 敲警钟!赣州8起电梯违法违规行为被立案调查
- 定西市技工学校揭牌仪式举行
- 10省市老牌汽水:冰峰北冰洋回忆
- 财通证券:地产销售环比有所上涨,多地政策持续宽松
- 甜蜜果高产养护秘籍
- 山东省启动2023年省内高校医学生“三下乡”社会实践活动
- 龙岩高速执法员一小时追回路产损失7万元
- 如何做好培训工作心得(如何做好培训工作)
- 地铁上男子利器伤人,00后秒出手!-全球播资讯
- 深圳:住宅类建设项目应在1年内开工、4年内竣工
- 工商银行喜结良缘金条20克价格今天多少一克(2023年07月06日)
- 4399元起!来京东参与红魔8S Pro系列预售 享以旧换新至高补贴1300元
- 环球新动态:宗教App出海新气象,网文厂商参与、“AI神父”抢戏
- 定期存款到期银行却不给取钱?原因主要有4方面,很多人还不知道
- 环球快播:快速恢复wmdmlog.dll文件丢失的方法
- 【焦点热闻】湖南规模以上服务业运行稳健 前五月营收超二千三百亿元
- iPhone15系列传来好消息:电池容量大幅提升,续航终于有救了|今日报
- 剑河:参军立功,喜报送家中-环球热点
- 视点!智慧防汛 守护黄河安澜
- 山东男篮官宣:朱荣振杨林祎租借至四川 马鑫鑫交流至宁波
- 当前头条:著名男中音歌唱家廖昌永悼念李玟:特别震惊,特别难过!
- 为电力保供提供坚强支撑_每日速读
- 环球观热点:雪铁龙世嘉质量怎么样(09年雪铁龙世嘉雨刮器保险丝在哪里?)
- 原神3.8铸境研炼无量疾战通关攻略合集 要闻
- 两位95后企业家走进岳麓山大学科技城,分享VUCA时代下的创业思路
- 全球看点:昆明这个片区上新127亩商住用地,本月开拍
- 强援即将归队,深圳队积极备战超三联赛“双倍积分争霸赛”
- 今年上半年云南铁路发送旅客量同比增长113.9% 世界今日讯
- 泡泡玛特7月5日回购17.00万股 耗资313.90万港币-全球今头条
- 贵州绿叶集团:党建联建庆“七一” 凝心聚力谋发展
- 新资讯:防水和防水有什么区别
- 逆水寒手游四大皆空怎么获得_焦点速读
- 当前时讯:记者:米兰引进赖恩德斯达成协议,转会费1800万欧加浮动
- 属马的今年多少岁 属鼠的今年多少岁
- 马自达新车降价引共鸣_环球热点评
- 北京高招录取7月6日启动!主要日程安排保存收藏|世界时讯
- 武义交通旅游投资建设集团10亿元公司债更新至“已反馈”-世界热推荐
- 世界快资讯:中国铝业现涨超4% 镓、锗相关物出口管制 公司为国内金属镓龙头
- 每日视讯:投资83.35亿!庆元抽水蓄能电站正式开工
- 【环球报资讯】新发现的肠道细胞滋养毛细淋巴管
- 机构:港股下半年有哪些机会?关注这六大方向
- 热讯:国标电动自行车哪个牌子好_电动自行车哪个牌子好
- 盗墓北派叫什么名字_北派盗墓小说最后结局
- 最新快讯!滨城日历|高温又来了|滨海文明网站改版上线|全球检测行业巨头在新区投建北方总部
- Here We Go!罗马诺&TA:赖斯1.05...
- 全球快资讯丨法国总统马克龙:骚乱顶峰已过去 仍需保持警惕
- 当前资讯!女神异闻录5:战略版新角色曝光:Joker和 Morgana
- 辽港股份(601880):7月4日北向资金减持228.57万股_世界微资讯
- 第三套人民币2元图片_第三套人民币2元
- 盈宽期货官网(盈宽期货) 当前快报
- 竹纤维凉席怎么清洗_凉席怎么清洗
- 强降雨导致四川46.1万人受灾 重庆多条河流出现超警超保洪水
- 环球看热讯:三年级下册数学期中测试题_六年级上册期中测试题数学的
- 移液管操作时应注意什么_使用移液管时正确的操作方法|全球视点
- 平安重疾险有必要买吗?适合什么样的人买?
- 【全球聚看点】奥迪A4和CC哪个好?对比外观、性能与配置,选择最佳车型!
- 当前速看:韩媒:韩国与墨西哥原定的友谊赛取消,韩国正在寻找新对手
- 今日热议:肌理壁膜优点和缺点_一起去深入了解
- 本川智能:拟不超3亿元在泰国投建印制电路板生产基地
- 援疆进行时|同心筑梦 情满博河——湖北省第八批援疆工作综述
- 翔宇医疗:目前在研和预研机器人新产品项目达30个左右
- 全球今热点:内蒙古赤峰一车辆连撞多人?警方:9人受伤,肇事司机已被抓
- 焦点信息:一个标准大气压为多少pa怎么计算_一个标准大气压为多少pa
- 北京属于哪个省的(上海属于哪个省的)
- 2023年7月4日正丙醛价格最新行情预测
- 火山引擎A/B测试推出智能流量调优实验,助力汽车行业破局营销困境
- 世界今头条!妖精的尾巴244话主题曲_妖精的尾巴10月最终章
- 亚太股份:7月3日融资净买入434.85万元,连续3日累计净买入1348.52万元_环球快讯
- 以越级之作打造“中国智造”新范本!众权威媒体共鉴雅迪领航实力
- 李大霄:人民币汇率回升属重大利好 从3144点回升是反转不是反弹
- 王能全:风谲云诡的国际油运市场-环球速递
- 男士夏天衣服没兜,可建议你看一下这几款东西,随身带着也方便
- 观天下!上期拿下和值、奇偶比!快乐8第23175期森伯预测:奇偶出号详情
- 今日要闻!五部门联合发文!这些重点行业,将有大变化!
- 每日资讯:中远海控07月03日获沪股通增持631.29万股
- 立方风控鸟·早报(7月4日) 天天要闻
- 焦点播报:手机home键在哪_home键有什么用
- 在市场上无人问津,湖人可以签回这位天赋异禀的内线潜力股?
- 阿斯利康ADR收跌将近9%,分析师称其肺癌药品试验结果逊色于预期
- 苹果要求美国最高法院撤销 App Store 在 Epic Games 案件中的命令 当前关注
- 世界观天下!桑德兰总监:迪亚洛不会再次为我们效力了,他应该在一级联赛踢球
- 环球速读:经典搞笑短信大全短句_经典搞笑短信大全
- 珠海住房公积金,最新调整!-当前资讯
- 天天快消息!佰奥智能(300836)每日收评(07-03)
- 青旅是什么意思_青旅什么意思 报资讯
- 安徽省粮食和物资储备局原二级巡视员关飞一审获刑12年_世界实时
- 济南边检站全力保障济南往返新加坡航线复航-环球新视野
广告
广告
- 长治襄垣县增收11517万元 提前15天实现首季“开门红”
- 黑龙江讷河新增1例确诊4例无症状 病例详情公布
- 浙江宁波余姚奉化宁海三地开展核酸检测 结果均为阴性
- 浙江湖州南浔三处棋牌室经营者被行拘
- 那年今日 | 一张漫画涨知识之12月13日
- 在宁波乘火车跨省出行须持48小时内核酸阴性证明
- 浙江温州一地发现核酸弱阳性?复采复检结果均为阴性
- 浙江三门发现一名密接者:二次核酸检测结果均为阴性
- 贱卖的发电机 新买的制茶机——安徽水电供区改革两周年回访见闻
- 浙江杭州新增1例新冠肺炎确诊病例 为集中隔离人员
- 2022年研考在即,学硕缩招,专硕时代真的来了?
- 探访杭州核酸检测点:排队高峰多在夜间 医院24小时运转
- 浙江发挥零售药店“哨点”作用 织就疫情防控监测网
- 哈尔滨市本轮疫情首批1名确诊患者出院
- 宁波镇海第三轮全员核酸检测574181人 结果均为阴性
- 陕西新增本土确诊病例1例、境外输入无症状感染者2例
- 齐齐哈尔讷河一地调整为中风险地区
- 浙江新增新冠肺炎确诊病例75例 其中本土74例
- 内蒙古新增本土确诊病例5例 均在呼伦贝尔满洲里市
- 黑龙江无新增确诊病例 新增本土核酸检测初筛阳性人员5例





