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

【javscript30天挑战之】Day1Drumkit

实现的效果如下:当按下键盘上对应字母时,产生不同的击鼓声音,相应盒子的样式发生改变。这个效果是JavaScript30天挑战的第一个小项

实现的效果如下:
在这里插入图片描述
当按下键盘上对应字母时,产生不同的击鼓声音,相应盒子的样式发生改变。

这个效果是Javascript30天挑战的第一个小项目,具体项目可见如下官网:


Javascript30 挑战官网地址: Javascript30.com/

Javascript30 挑战github源码地址: github.com/wesbos/Java…



接下来,让我们了解一下这个效果是怎么做出来的吧~

在我做的时候,我将它分成了css和js两个部分:


  1. css方面,我们需要一个大盒子装9个小盒子,为使他们整齐的排列在页面中间,我们需要用到flex布局,添加justify-contentalign-items实现该效果,然后在小盒子中添加span等元素来写入文字。
    如何实现对应的鼓声音效呢? 我们需要用到audio标签,然后为每个audio和小盒子中放对应字母的盒子添加相同的data-属性,方便之后在js中选出对应的元素。不了解data-属性的可以看这个博客:
    (1条消息) html5中data-*属性的作用是什么_persistence勿忘初心-CSDN博客

  2. 接着我们来看js的部分。首先我们来分析一下我们需要做出的效果:
    (1)点击键盘上对应字母时,会发出相应的击鼓声;
    (2)点击键盘上对应字母时,装字母的盒子外边框会出现高亮,其中的字母会放大;
    (3)高亮和字母放大效果产生之后,效果会消失,恢复原状

下面我们对应这三点展开解释:

首先我们需要用到onkeydown响应函数,传入event参数,表示当键盘上有键按下时,会进入该函数;我们如何知道按下的是哪个键呢?这时候需要用到event参数的keyCode属性,该属性和键盘上的键一一对应,我们可以通过console.log(event.keyCode)获取;

接着,知识点来了,我们要如何选择对应的键呢?这时我们之前提到的data-属性就派上用场了,拿audio举例,我们需要通过document.querySelector(audio[data-key="${event.keyCode}"])来获取对应的元素。


  1. 第一个效果,我们通过上面的步骤获取到对应的audio元素后,将其current Time设置为0,然后调用play()函数令该音效播放;
  2. 第二个效果,我们需要提前在style中写好想要的效果,然后同第一点,获取到装字母的div元素之后,使用该盒子classList属性中的add()函数,为该盒子添加样式。
  3. 第三个效果,在之前的效果全都实现之后,令效果消失。我们可以使用ontransitionend响应函数或者使用addEventListener监听transitionend事件,当前面的效果产生之后,会进入该事件响应函数,我们可以在其中实现:当事件的transition未进行时return,当已进行时抵用class List属性中的remove()函数删掉之前添加的css选择器。具体可以见下面的代码

一些小tips:

transitionend事件的响应函数中,我们需要判断事件的propertyName属性是否为transform,这一点我们可以通过console.log查看该事件,在其中就能查看到该属性;以及之后的target,都可以查看到。

代码如下:

<!DOCTYPE html>
<html lang&#61;"en"><head><meta charset&#61;"UTF-8"><meta http-equiv&#61;"X-UA-Compatible" content&#61;"IE&#61;edge"><meta name&#61;"viewport" content&#61;"width&#61;device-width, initial-scale&#61;1.0"><title>Document</title><style>html{background: url(background.jpg) bottom center;background-size: cover;}*{margin: 0;padding: 0;}.container {display: flex;justify-content: center;align-items: center;height: 100vh; /* 整个大盒子的内容放中间 */}.box {width: 90px;border: 4px solid black;background-color: rgba(0, 0, 0, .4);text-align: center;margin:10px;padding:10px;transition: all .07s ease;/* 要加动画 */}kbd {font-size: 34px;color: white;display: block;text-shadow: 0 0 2px black;}.clap {font-size: 14px;margin-top: 5px;color: #ffc600;display: block;text-transform: uppercase;letter-spacing: 2px;/* 字母都变成大写 */}.high {border-color: #ffc600;box-shadow: 0 0 1rem #ffc600;transform: scale(1.1);}</style>
</head><body><div class&#61;"container"><div class&#61;"box" data-key&#61;"65"><kbd>A</kbd><span class&#61;"clap">boom</span></div><div class&#61;"box" data-key&#61;"83"><kbd>S</kbd><span class&#61;"clap">clap</span></div><div class&#61;"box" data-key&#61;"68"><kbd>D</kbd><span class&#61;"clap">hihat</span></div><div class&#61;"box" data-key&#61;"70"><kbd>F</kbd><span class&#61;"clap">kick</span></div><div class&#61;"box" data-key&#61;"71"><kbd>G</kbd><span class&#61;"clap">openhat</span></div><div class&#61;"box" data-key&#61;"72"><kbd>H</kbd><span class&#61;"clap">ride</span></div><div class&#61;"box" data-key&#61;"74"><kbd>J</kbd><span class&#61;"clap">snare</span></div><div class&#61;"box" data-key&#61;"75"><kbd>K</kbd><span class&#61;"clap">tink</span></div><div class&#61;"box" data-key&#61;"76"><kbd>L</kbd><span class&#61;"clap">tom</span></div></div><audio src&#61;"sounds/boom.wav" data-key&#61;"65"></audio><audio src&#61;"sounds/clap.wav" data-key&#61;"83"></audio><audio src&#61;"sounds/hihat.wav" data-key&#61;"68"></audio><audio src&#61;"sounds/kick.wav" data-key&#61;"70"></audio><audio src&#61;"sounds/openhat.wav" data-key&#61;"71"></audio><audio src&#61;"sounds/ride.wav" data-key&#61;"72"></audio><audio src&#61;"sounds/snare.wav" data-key&#61;"74"></audio><audio src&#61;"sounds/tink.wav" data-key&#61;"75"></audio><audio src&#61;"sounds/tom.wav" data-key&#61;"76"></audio><script>function fun(e){//e是一个transitionevent事件console.log(e)if(e.propertyName !&#61;&#61; &#39;transform&#39;) return;e.target.classList.remove(&#39;high&#39;);}let box&#61;Array.from(document.querySelectorAll(".box"));box.forEach(x&#61;>x.addEventListener("transitionend",fun));window.onkeydown &#61; function (event) {let now &#61; document.querySelector(&#96;div[data-key&#61;"${event.keyCode}"]&#96;);let sound&#61;document.querySelector(&#96;audio[data-key&#61;"${event.keyCode}"]&#96;);if(!now || !sound) return;now.classList.add("high");sound.currentTime&#61;0;sound.play();}</script>
</body></html>

推荐阅读
  • 使用nodejs爬取b站番剧数据,计算最佳追番推荐
    本文介绍了如何使用nodejs爬取b站番剧数据,并通过计算得出最佳追番推荐。通过调用相关接口获取番剧数据和评分数据,以及使用相应的算法进行计算。该方法可以帮助用户找到适合自己的番剧进行观看。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 本文介绍了在Linux下安装Perl的步骤,并提供了一个简单的Perl程序示例。同时,还展示了运行该程序的结果。 ... [详细]
  • ASP.NET2.0数据教程之十四:使用FormView的模板
    本文介绍了在ASP.NET 2.0中使用FormView控件来实现自定义的显示外观,与GridView和DetailsView不同,FormView使用模板来呈现,可以实现不规则的外观呈现。同时还介绍了TemplateField的用法和FormView与DetailsView的区别。 ... [详细]
  • Ihavethefollowingonhtml我在html上有以下内容<html><head><scriptsrc..3003_Tes ... [详细]
  • 本文介绍了腾讯最近开源的BERT推理模型TurboTransformers,该模型在推理速度上比PyTorch快1~4倍。TurboTransformers采用了分层设计的思想,通过简化问题和加速开发,实现了快速推理能力。同时,文章还探讨了PyTorch在中间层延迟和深度神经网络中存在的问题,并提出了合并计算的解决方案。 ... [详细]
  • 在Kubernetes上部署JupyterHub的步骤和实验依赖
    本文介绍了在Kubernetes上部署JupyterHub的步骤和实验所需的依赖,包括安装Docker和K8s,使用kubeadm进行安装,以及更新下载的镜像等。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 本文介绍了关于apache、phpmyadmin、mysql、php、emacs、path等知识点,以及如何搭建php环境。文章提供了详细的安装步骤和所需软件列表,希望能帮助读者解决与LAMP相关的技术问题。 ... [详细]
  • 标题: ... [详细]
  • iOS超签签名服务器搭建及其优劣势
    本文介绍了搭建iOS超签签名服务器的原因和优势,包括不掉签、用户可以直接安装不需要信任、体验好等。同时也提到了超签的劣势,即一个证书只能安装100个,成本较高。文章还详细介绍了超签的实现原理,包括用户请求服务器安装mobileconfig文件、服务器调用苹果接口添加udid等步骤。最后,还提到了生成mobileconfig文件和导出AppleWorldwideDeveloperRelationsCertificationAuthority证书的方法。 ... [详细]
author-avatar
款款迷恋_420
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有