今天得到一个github练习项目,是30个原生js写成的小例子,麻雀虽小五脏俱全,现在记录一下第一个。
第一个是键盘按键时页面上对应的键高亮,同时播放音频,松开后不再高亮。

我自己实现了一下,然后查看了他的代码,发现比我精妙许多,下面是他的代码,我把一些我原来自己写代码时不熟悉的进行了注释。
function removeTransition(e) {
// 动画结束会重绘一下,这个是找到执行了transform的元素.
if (e.propertyName !== 'transform') return;
e.target.classList.remove('playing');
} function playSound(e) {
// element = baseElement.querySelector(selectors),selectors 是一个CSS选择器字符串,我原来只使用id和class选择器,此处使用了css属性选择器,省事
const audio = document.querySelector(`audio[data-key="${e.keyCode}"]`);
const key = document.querySelector(`div[data-key="${e.keyCode}"]`);
//这里应该是等待音频文件加载
if (!audio) return;
// 原生用得少,给css加class我以前只知道直接key.className = XXX这种方式
// Element.classList 是一个只读属性,可以使用add()和remove()方法修改它
// 其还有item, toggle, contains, replace这几个方法.具体可以到https://developer.mozilla.org/zh-CN/docs/Web/API/Element/classList上面查看
key.classList.add('playing');
// currentTime,设置audio的初始时间为0秒
audio.currentTime = 0;
audio.play();
} //获取所有代表着键位的dom
// Array.from(arrayLike, mapFn, thisArg) es6新方法,从一个类似数组或可迭代对象中创建一个新的数组实例
// arrayLike: 想要转换成数组的伪数组对象或可迭代对象
// mapFn(可选): 如果指定了该参数,新数组中的每个元素会执行该回调函数
// thisArg (可选): 可选参数,执行回调函数 mapFn 时 this 对象
const keys = Array.from(document.querySelectorAll('.key'));
// transitionend,在CSS完成过渡后触发,这里大概相当于keyup的作用,很巧妙
keys.forEach(key => key.addEventListener('transitionend', removeTransition));
window.addEventListener('keydown', playSound);

备注:不过他的实现效果我感觉还是有一点点瑕疵,按住键位不放时,会不停在高亮与不高亮之间切换,最后保持高亮不变,松开也不再还原。不过思想值得借鉴。

下一个案例: https://www.cnblogs.com/wangxi01/p/10641210.html

最新文章

  1. javaWeb中 servlet 、request 、response
  2. 大视野3562 [SHOI2014]神奇化合物
  3. 《JAVA 从入门到精通》 - 正式走向JAVA项目开发的路
  4. input 获取当前id,name
  5. 高性能图片服务器–ZIMG
  6. eclipse优化与标准化记录
  7. metasploit-post模块信息
  8. Sublime安装插件的方法
  9. 【基础】Asp.Net操作Cookie总结
  10. ORM框架SQLAlchemy与权限管理系统的数据库设计
  11. 应用canvas绘制动态时钟--每秒自动动态更新时间
  12. 不是标准execl转换处理方法
  13. 佳佳的Fibonacci
  14. 面试必备技能-HiveSQL优化
  15. Codeforces Round #468 Div. 1
  16. 基准对象object中的基础类型----数字 (二)
  17. luogu5024 [NOIp2018]保卫王国 (动态dp)
  18. Git 基础 - 删除暂存区的文件
  19. 输入URL地址到最终页面渲染完成,发生了什么事
  20. thinkphp 控制器继承

热门文章

  1. 创建类模式大PK(总结)
  2. springMVC之异常处理
  3. YTU 2629: E1 一种颜色,三个分量
  4. P1196 [NOI2002]银河英雄传说(并查集)
  5. codeforces 963B Destruction of a Tree
  6. [luogu2620]虫洞
  7. POJ1259 The Picnic 最大空凸包问题 DP
  8. bzoj3196 二逼平衡树——线段树套平衡树
  9. bzoj 2101: [Usaco2010 Dec]Treasure Chest 藏宝箱【区间dp】
  10. JS自定义右键菜单案例