简介:JavaScript30是Wes Bos推出的一个 30 天挑战。项目免费提供了 30 个视频教程、30 个挑战的起始文档和 30 个挑战解决方案源代码。
简介
第一天是用JS制作爵士鼓的页面,通过敲击键盘上对应的字母就会发出对应的声音。
效果图
主要解决的难点:
1.将键盘事件与audio建立联系
2.通过键盘按下事件点击实现特效的展现与消失
ES6语法
const声明常量
运用了ES6中的模板字符串和箭头函数
知识点
Array.forEach()函数和Array.from()的使用
html5中的data-*的使用
removeTransition
这个函数主要是实现当按下相应的键盘按键的时候,在页面中显示特效,并移除特效。
playSound
当按下按键的时候,就会发出声音
监听
window.addEventListener('keydown', playSound);监听事件,其中的参数playSound函数是有参数的,通过console.log查看,就可以看见使用addEventListener时,给函数传递的参数是一个事件对象。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<style type="text/css">
html{
background-image: url(http://i.imgur.com/b9r5sEL.jpg);
}
html,body{
margin: 0px;
padding: 0px;
font-family: sans-serif;
}
.keys{
display: flex;
flex: 1;
min-height: 100vh;
align-items: center;
justify-content: center;
}
.key{
font-size: 0.2rem;
border: .4rem solid black;
border-radius: 50%;
margin: 0.6rem;
padding: .2rem .2rem;
transition: all .07s ease;
text-align: center;
background: rgba(0, 0, 0, 0.4);
}
.playing{
transform: scale(1.1);
transform: rotate(360deg);
border-color: #ffc600;
box-shadow: 0 0 2rem #ffc600;
}
kbd{
display: block;
color: #fc60fd;
}
.sound {
text-transform: uppercase;/* 大写字母 */
letter-spacing: .1rem;
color: #ffc600;
}
</style>
</head>
<body>
<div class="keys">
<div data-key="65" class="key">
<kbd>A</kbd>
<span class="sound">clap</span>
</div>
<div data-key="83" class="key">
<kbd>S</kbd>
<span class="sound">hihat</span>
</div>
<div data-key="68" class="key">
<kbd>D</kbd>
<span class="sound">kick</span>
</div>
<div data-key="70" class="key">
<kbd>F</kbd>
<span class="sound">openhat</span>
</div>
<div data-key="71" class="key">
<kbd>G</kbd>
<span class="sound">boom</span>
</div>
<div data-key="72" class="key">
<kbd>H</kbd>
<span class="sound">ride</span>
</div>
<div data-key="74" class="key">
<kbd>J</kbd>
<span class="sound">snare</span>
</div>
<div data-key="75" class="key">
<kbd>K</kbd>
<span class="sound">tom</span>
</div>
<div data-key="76" class="key">
<kbd>L</kbd>
<span class="sound">tink</span>
</div>
<div data-key="32" class="key">
<kbd>SPACE</kbd>
<span class="sound">bgmusic</span>
</div>
<audio data-key="65" src="sounds/clap.wav"></audio>
<audio data-key="83" src="sounds/hihat.wav"></audio>
<audio data-key="68" src="sounds/kick.wav"></audio>
<audio data-key="70" src="sounds/openhat.wav"></audio>
<audio data-key="71" src="sounds/boom.wav"></audio>
<audio data-key="72" src="sounds/ride.wav"></audio>
<audio data-key="74" src="sounds/snare.wav"></audio>
<audio data-key="75" src="sounds/tom.wav"></audio>
<audio data-key="76" src="sounds/tink.wav"></audio>
<audio data-key="32" src="sounds/ss.mp3"></audio>
</div>
</body>
<script type="text/javascript">
function removeTransition(e){
if(e.propertyName!=="transform")return;
e.target.classList.remove("playing");
}
function playSound(e){
//console.dir(e);
const key=document.querySelector(`div[data-key="${e.keyCode}"]`);
const audio=document.querySelector(`audio[data-key="${e.keyCode}"]`);
if(!audio)return;
key.classList.add("playing");
audio.currentTime=0;
audio.play();
}
const keys=Array.from(document.querySelectorAll(".key"));
keys.forEach(keys=>keys.addEventListener("transitionend",removeTransition));
//keys.forEach(()=>addEventListener("keydown",playSound));
window.addEventListener("keydown",playSound);
</script>
</html>
网友评论