01 JavaScript Dump Kit 中文指南

by 緝熙Soyaine
這是純 JavaScript 系列指南的第一篇
存檔于 GitHub 嫂便,如果覺得有幫助楼吃,請(qǐng)點(diǎn) Star

實(shí)現(xiàn)效果

Drum Kit

動(dòng)圖請(qǐng)戳:https://cl.ly/1N1e2q082P20

模擬一個(gè)打鼓的頁面勃救。用戶在鍵盤上按下 ASDFGHJKL 這幾個(gè)鍵時(shí)君编,頁面上與字母對(duì)應(yīng)的按鈕變大變亮干毅,對(duì)應(yīng)的鼓點(diǎn)聲音響起來循未。

關(guān)鍵點(diǎn)

  1. 鍵盤事件
  2. 播放聲音
  3. 改變樣式

步驟分解

  1. 添加鍵盤事件監(jiān)聽。在 window 上添加鍵盤 keydown 事件搏存。
  2. 對(duì)應(yīng)事件處理程序瑰步。
    1. 獲取鍵碼
    2. querySelector 獲取元素
    3. 獲取 data-key 為對(duì)應(yīng)鍵碼的元素
    4. 處理元素。播放音頻祭埂、添加樣式面氓。
  3. 為所有的 div.key 添加 transitionened 事件
    1. 獲取所有樣式為 key 的元素
    2. 為其添加事件監(jiān)聽
  4. 去除樣式的事件處理程序

基礎(chǔ)語法

一些 ES6 語法

  1. const :聲明一個(gè)只讀的常量蛆橡,標(biāo)識(shí)符的值只能賦值一次舌界。

  2. `字符串 ${ 變量、屬性名 } `:模板字面量(Template literals)中用于表示模板字符串的標(biāo)識(shí)泰演。特點(diǎn)是字符串首尾用反引號(hào)(`)呻拌,內(nèi)部的模板部分用 ${ } 括起來表示,具體請(qǐng)看MDN文檔睦焕。簡單例子如下:

          var a = 1;
          var b = 2;
          //不用模板的寫法
          console.log("三是" + (a + b) + "不是" + (2 * a + b)); //"三是3不是4"
          //使用模板字符串的寫法
          console.log(`三是${a + b}不是${2 * a + b}`); //"三是3不是4"
    

forEach 與箭頭函數(shù)

使用 document.querySelector 獲取一組符合 CSS 選擇符的元素快照藐握,類型為 NodeList,對(duì)其進(jìn)行遍歷時(shí)可采用 forEach 方法垃喊。

// Code from http://es6-features.org/#StatementBodies

// ES6
nums.forEach(v => {
    if (v % 5 === 0)
        fives.push(v);
})

// ES5
nums.forEach(function (v) {
    if (v % 5 === 0)
        five.push(v);
})

解決難點(diǎn)

如何將鍵盤按鍵與頁面按鈕對(duì)應(yīng)起來猾普?

連接的幫手是 keydown 事件中的 keyCode 屬性,keyCode 屬性的值和 ASCII 編碼值相同(對(duì)應(yīng)小寫字母)本谜。在這個(gè)網(wǎng)站可以用按鍵盤來查看對(duì)應(yīng)的鍵碼初家。

我們能獲取到的初始頁面中,按鈕 div 和音頻 audio 標(biāo)簽中都添加了一個(gè)屬性 data-key 用于存儲(chǔ)對(duì)應(yīng)的鍵碼,這樣做的目的是溜在,添加鍵盤事件監(jiān)聽后陌知,觸發(fā)鍵盤事件時(shí)即可獲取事件的 keyCode 屬性值,以此為線索掖肋,操作對(duì)應(yīng)的按鈕及音頻仆葡。

const audio = document.querySelector(`audio[data-key="${e.keyCode}"]`);
const key = document.querySelector(`div[data-key="${e.keyCode}"]`);

如何保證按鍵被按住不放時(shí),可以馬上響起連續(xù)鼓點(diǎn)聲志笼?

每次播放音頻之前沿盅,設(shè)置播放時(shí)間戳為 0:

var audio = document.getElementById("video"); 
audio.currentTime = 0;
audio.play();

如何使頁面按鈕恢復(fù)原狀?

利用一個(gè)叫 transitionened 的事件纫溃,它在 CSS transition 結(jié)束后會(huì)被觸發(fā)嗡呼。我們就可以利用這個(gè)事件,在每次打鼓的效果(尺寸變大皇耗、顏色變化)完成之后,去除相應(yīng)樣式揍很。

在這個(gè)頁面中郎楼,發(fā)生 transition 的樣式屬性不止一個(gè)(box-shadow, transform, border-color),所以需要添加一個(gè)判斷語句窒悔,使每發(fā)生一次按鍵事件時(shí)呜袁,只去除一次樣式。

funciton remove(event) {
  if (event.propertyName !== 'border-left-color') return;
  this.classList.remove('playing');
  // event.target.classList.remove('playing');
}

系列目錄
JavaScript30 - 三十天純JS挑戰(zhàn) 中文指南
01 JavaScript Dump Kit 中文指南
02 純 JavaScript+CSS 時(shí)鐘指南
03 用 CSS 變量實(shí)現(xiàn)拖動(dòng)控制 CSS 參數(shù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末简珠,一起剝皮案震驚了整個(gè)濱河市阶界,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌聋庵,老刑警劉巖膘融,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異祭玉,居然都是意外死亡氧映,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門脱货,熙熙樓的掌柜王于貴愁眉苦臉地迎上來岛都,“玉大人,你說我怎么就攤上這事振峻【室撸” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵扣孟,是天一觀的道長烫堤。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么塔逃? 我笑而不...
    開封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任讯壶,我火速辦了婚禮,結(jié)果婚禮上湾盗,老公的妹妹穿的比我還像新娘伏蚊。我一直安慰自己,他們只是感情好格粪,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開白布躏吊。 她就那樣靜靜地躺著,像睡著了一般帐萎。 火紅的嫁衣襯著肌膚如雪比伏。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天疆导,我揣著相機(jī)與錄音赁项,去河邊找鬼。 笑死澈段,一個(gè)胖子當(dāng)著我的面吹牛悠菜,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播败富,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼悔醋,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了兽叮?” 一聲冷哼從身側(cè)響起芬骄,我...
    開封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎鹦聪,沒想到半個(gè)月后账阻,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡椎麦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年宰僧,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片观挎。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡琴儿,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出嘁捷,到底是詐尸還是另有隱情造成,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布雄嚣,位于F島的核電站晒屎,受9級(jí)特大地震影響喘蟆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜鼓鲁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一蕴轨、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧骇吭,春花似錦橙弱、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至龙致,卻和暖如春蛀缝,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背目代。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來泰國打工屈梁, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人榛了。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓俘闯,卻偏偏與公主長得像,于是被迫代替她去往敵國和親忽冻。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容