《從案例中學(xué)習(xí)JavaScript》之酷炫音樂播放器(一)

接觸簡書也有一段日子了列牺,這中間的時(shí)光還是比較輕松加愉快的整陌,那種可以和他人分享知識(shí)的欣喜和愉悅的確是非常棒。我一向都是覺得專心寫自己的文就可以了瞎领,不會(huì)總是糾結(jié)有多少人在看泌辫,有多少點(diǎn)擊等等。用心寫好自己的文九默,體會(huì)那種分享的快樂震放,就可以了。

之前寫的《js常用方法和一些封裝》系列暫且告一段落驼修,接下來殿遂,我會(huì)通過各種案例,來分享javascript的各種技巧乙各,所以最終將這個(gè)系列的名稱定為:《從案例中學(xué)習(xí)JavaScript》,回想到自己初學(xué)編程時(shí)候的各種艱辛墨礁,買了很多書,然而這些書大多為泛泛而談耳峦,或者東拼西湊恩静。市面上充斥著各種多少多少天從入門到精通的書籍,我曾經(jīng)也花了好多大洋,滿懷信心地買了類似的書驶乾,結(jié)果我就零基礎(chǔ)從入門到蒙逼了邑飒。

經(jīng)過幾年的摸索,我最終發(fā)現(xiàn)级乐,知識(shí)點(diǎn)還是必須在工作中去練習(xí)才能真正的理解疙咸,或者通過一個(gè)具體的案例來融匯貫通。當(dāng)然风科,我指的案例不是那種很多線下培訓(xùn)機(jī)構(gòu)為了講知識(shí)點(diǎn)而弄出來的案例撒轮。

比如這樣的:

for (var i = 0; i < 3 ; i ++) {
    alert(i);
}

這就是典型的為了講而講,案例非池ぶ兀枯燥不說腔召,而且花費(fèi)大量的時(shí)間來練習(xí)這種語法級(jí)別的東西杆查,堆砌這種并沒有什么意思的案例扮惦,真的很難引起初學(xué)者的興趣。

很多線下的培訓(xùn)機(jī)構(gòu)亲桦,包括大多數(shù)大學(xué)里的課程崖蜜,就是這么做的。比如JAVA客峭,一開始都會(huì)教著打印一個(gè)HelloWorld,然后中規(guī)中矩地講解for循環(huán)豫领,打印九九乘法表。

接著舔琅,一個(gè)必然會(huì)講的東西就是冒泡排序等恐,很多初學(xué)者在此卡殼,覺得JAVA怎么這么難氨蛤尽课蔬!于是,他們開始自暴自棄郊尝,為了學(xué)而學(xué)二跋,也不知道學(xué)了有什么用?

好不容易培訓(xùn)完了流昏,工作了幾年扎即,突然發(fā)現(xiàn),我好像從來沒用到什么冒泡排序翱隽埂谚鄙?

誠然,你不去當(dāng)算法工程師刁绒,就算會(huì)了冒泡排序又怎樣呢闷营?算法這東西,需要時(shí)間的積累和技術(shù)的沉淀膛锭,我始終認(rèn)為初學(xué)編程應(yīng)該將重心放在方法的調(diào)用和興趣的培養(yǎng)上面粮坞,最起碼蚊荣,必須得做點(diǎn)東西出來∧荆基本的算法互例,時(shí)間長了自然會(huì),初學(xué)者真沒必要花太多的時(shí)間在算法上筝闹,邏輯思維清晰的話還好一些媳叨,如果不是呢,那么很可能就會(huì)在剛開始學(xué)編程的時(shí)候就產(chǎn)生煩躁的情緒关顷,這實(shí)在是得不償失糊秆。

好了,扯犢子結(jié)束了议双,下面開始愉快的編程之旅吧痘番!

第一個(gè)案例,就做一個(gè)簡單的音樂播放器吧平痰。

目錄結(jié)構(gòu)
Paste_Image.png

如圖汞舱,我已經(jīng)在mp3文件夾內(nèi)添加了兩首歌,現(xiàn)在打開index.html宗雇,里面是一個(gè)簡單的模板昂芜。

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <title>音樂小站</title>
    </head>
    <body>
        
    </body>
    <script type="text/javascript">
        
    </script>
</html>

1. 利用audio標(biāo)簽渲染一個(gè)播放器

<audio src='mp3/1.mp3' controls=""></audio>

audio是h5的一個(gè)標(biāo)簽,以上代碼表示創(chuàng)建了一個(gè)播放器赔蒲,并且播放文件指向了1.mp3這首歌泌神,controls代表使用瀏覽器自帶的播放器界面。

Paste_Image.png

渲染效果如圖舞虱,感覺還不錯(cuò)欢际,點(diǎn)擊左邊的播放按鈕就可以播放這首歌了哦。

2. 用js來控制音樂播放器

現(xiàn)在砾嫉,我們不用瀏覽器自帶的控制界面幼苛,單純地用js來操作。因?yàn)樽詭У慕缑嫖幢啬軡M足我們的需要焕刮,比如上一首舶沿,下一首,歌詞等等配并。

我們將這一行代碼刪除括荡。

<audio src='mp3/1.mp3' controls=""></audio>
第一步. 用js來創(chuàng)建一個(gè)audio元素。
var musicDom = document.createElement('audio');
第二步. 加載一首音樂溉旋。
musicDom.src = 'mp3/2.mp3';
第三步. 播放音樂畸冲。
musicDom.play();

這樣的話,當(dāng)我們?cè)诖怂⑿马撁妫枨蜁?huì)被自動(dòng)播放邑闲。

第四步. 開始將基本的方法封裝起來

一個(gè)音樂播放器算行,最基本的功能有:
1.初始化
2.添加歌曲
3.播放
4.暫停
5.下一首
6.上一首

var musicBox= {
    
    musicDom : null, //播放器對(duì)象
    songs : [],      //歌曲目錄,用數(shù)組來存儲(chǔ)
    
    //初始化音樂盒
    init : function(){
        this.musicDom = document.createElement('audio');
    },
    
    //添加一首音樂
    add : function(src){
        this.songs.push(src);
    },
    
    //根據(jù)數(shù)組下標(biāo)決定播放哪一首歌
    play : function(index){
        this.musicDom.src = this.songs[index];
        this.musicDom.play();
    },
    
    //暫停音樂
    stop : function(){
        this.musicDom.pause();
    },
    
    //下一首(待編寫)
    next : function(){
        
    },
    
    //上一首(待編寫)
    prev : function(){
        
    }
}

我們將邏輯代碼用一個(gè)json對(duì)象包裹了起來苫耸,對(duì)音樂播放器進(jìn)行了簡單的封裝州邢,這樣看起來?xiàng)l理會(huì)比較清晰。其實(shí)褪子,這已經(jīng)是一個(gè)簡單的js小插件了量淌,不是嗎?等以后做得比較完善的時(shí)候嫌褪,我們完全可以將這個(gè)對(duì)象放到j(luò)s文件里呀枢,作為一個(gè)js插件被其他頁面來調(diào)用。

js基礎(chǔ)我以后會(huì)專門開貼來總結(jié)笼痛,現(xiàn)在先就這么寫下去吧裙秋。

封裝插件也是學(xué)習(xí)js的一大樂趣呢!

好了晃痴,來測(cè)試一下吧:

musicBox.init(); //初始化
musicBox.add('mp3/1.mp3');
musicBox.add('mp3/2.mp3');
musicBox.play(0); //聽第一首歌

刷新頁面残吩,雖然啥也沒有,但是動(dòng)聽的音樂已然響起倘核,我這邊的第一首歌曲是火影忍者的主題曲,很帶感哦即彪。

第五步. 畫一個(gè)樣式吧紧唱!

這一步,我們來簡單繪制一個(gè)播放器的樣式隶校,我盡可能寫詳細(xì)一點(diǎn):
css:

width: 200px;
height:300px;
background:#ccc;

html:

<div id='music' class='music'></div>

效果:

Paste_Image.png

接下來漏益,讓這個(gè)div盒子相對(duì)于body居中。

還記得上一節(jié)《js常用方法和一些封裝》-- 時(shí)間相關(guān)(附案例詳解)嗎深胳,里面就有一個(gè)現(xiàn)成的居中方法绰疤,還有獲取元素的方法。現(xiàn)在我們拿過來直接用:

//讓元素居中的方法
function _center(dom){
    dom.style.position = 'absolute';
    dom.style.top = '50%';
    dom.style.left = '50%';
    dom.style['margin-top'] = - dom.offsetHeight / 2 + 'px';
    dom.style['margin-left'] = - dom.offsetWidth / 2 + 'px';
}

//根據(jù)id獲取元素
function dom(id){
    if(id.toString().indexOf('#') != -1) {
        id = id.replace('#','');
    }
    return document.getElementById(id);
};

調(diào)用

var musicDom = dom('#music');
_center(musicDom);  
Paste_Image.png

成功居中了舞终。

接下來轻庆,我們將顏色調(diào)深一點(diǎn),然后加上一點(diǎn)圓角:

background:#333;
border-radius: 5px;
Paste_Image.png

再加上一點(diǎn)盒陰影 :

box-shadow: 3px -3px 3px #666;
Paste_Image.png

這樣就有一點(diǎn)陰影效果了敛劝。

下面余爆,我們來繪制屏幕和按鈕區(qū):

css:

.music {
    width: 200px;
    height:300px;
    background:#333;
    border-radius: 5px;
    box-shadow: 3px -3px 3px #666;
    position: relative;
}
.music .screen {
    height:70%;
    width:96%;
    background: #ccc;
    margin-left:2%;
    margin-top: 2%;
}

.music .buttons {
    height:25%;
    width:96%;
    background: wheat;
    margin-left:2%;
    margin-top: 2%;
}

html:

<div id='music' class='music'>
    <div class='screen'></div>
    <div class='buttons'></div>
</div>

效果:

Paste_Image.png

我打算在屏幕區(qū)域加一個(gè)音樂的圖標(biāo),順便分享一下iconfont的使用吧夸盟。

番外:矢量圖標(biāo)icontont的使用

這是阿里巴巴的一個(gè)矢量圖標(biāo)庫蛾方,打開官網(wǎng):

http://www.iconfont.cn/

Paste_Image.png

點(diǎn)擊所有公開庫,
搜索音樂,尋找我們需要的圖標(biāo)::

Paste_Image.png

在搜索你喜歡的按鈕:

Paste_Image.png

總之桩砰,你想要什么圖標(biāo)拓春,直接搜索就可以了。

我隨便挑了幾個(gè)按鈕亚隅,


Paste_Image.png

點(diǎn)擊下載至本地痘儡,然后解壓:

Paste_Image.png
Paste_Image.png

里面有一個(gè)demo.html頁面,里面詳細(xì)介紹了iconfont的使用方法枢步。

Paste_Image.png

1.將如圖框起來的文件拷貝到項(xiàng)目的css文件夾沉删,引入css文件

  <link rel="stylesheet" type="text/css" href="css/iconfont.css"/>

2.現(xiàn)在我們引入這個(gè)圖標(biāo)

Paste_Image.png
<div id='music' class='music'>
    <div class='screen'>
        <i id='music-icon' class="iconfont"></i>
    </div>
    <div class='buttons'></div>
</div>

效果:

Paste_Image.png

](http://upload-images.jianshu.io/upload_images/1929342-3ea9916e3ae15311.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

成功了。

現(xiàn)在醉途,我們還是要把這個(gè)小圖標(biāo)居中顯示矾瑰。

var musicIcon = dom('#music-icon');
_center(musicIcon); 
Paste_Image.png

咦,好像不對(duì)哦隘擎,看樣子是相對(duì)于最外面的music盒子居中定位了呢殴穴。

這是咋回事呢?通過這個(gè)小bug货葬,可以引出一個(gè)定位的知識(shí)點(diǎn)采幌。

原來,我們居中的原理是設(shè)置子元素的position為absolute震桶,然后用top和left來實(shí)現(xiàn)的休傍,如果父盒子沒有設(shè)置position,那么子元素會(huì)一直往上找,直到碰上一個(gè)有position并且不是static的元素來做定位蹲姐。

在這個(gè)案例中 ,<div id='music' class='music'></div>是有定位的磨取,所以就相對(duì)于它居中了。

了解原因之后柴墩,我們來給屏幕區(qū)域加一個(gè)position吧忙厌!

問題來了,給它設(shè)置absolute還是relative呢江咳?

先看看加absolute的效果吧:

position: absolute;
Paste_Image.png

靠逢净,按鈕去不見了,嚇得我馬上F12打開調(diào)試模式一探究竟歼指。

Paste_Image.png

如圖爹土,原來是擠上去了呀。其實(shí)道理也很簡單东臀,當(dāng)一個(gè)元素的position設(shè)置為absolute的時(shí)候着饥,它就脫離文檔流,也就是說不占位置了惰赋。所以下面的div元素就會(huì)擠上來宰掉。就這么簡單呵哨。

而relative會(huì)保持之前的位置,不脫離文檔流轨奄。

position: relative;
Paste_Image.png

成了孟害,然后我們來調(diào)個(gè)色,把圖標(biāo)也弄得大一點(diǎn)挪拟。

.music {
    width: 200px;
    height:300px;
    background:#333;
    border-radius: 5px;
    box-shadow: 3px -3px 1px #666;
    position: relative;
}
.music .screen {
    height:70%;
    width:96%;
    background: linear-gradient(#403d3d,65%,#5f5b5b);
    margin-left:2%;
    margin-top: 2%;
    position: relative;
    
}

.music .screen i {
    color:#fff;
    font-size: 88px;
}

.music .buttons {
    height:25%;
    width:96%;
    margin-left:2%;
    margin-top: 2%;
}
Paste_Image.png

然后把按鈕添加上去:
css:

.music .screen i {
    color:#fff;
    font-size: 88px;
}

.music .buttons i {
    color:#fff;
    font-size: 24px;
        margin-left: 28px;
    position: relative;
    top:25px;
}

.music .buttons i:hover {
    cursor: pointer;
}

html:

<div id='music' class='music'>
    <div class='screen'>
        <i id='music-icon' class="iconfont"></i>
    </div>
    <div class='buttons'>
        <i id='prev' class="iconfont"></i>
        <i id='play' class="iconfont"></i>
        <i id='next' class="iconfont"></i>
    </div>
</div>

效果圖:

Paste_Image.png

這是一套純黑色系的皮膚挨务,你也可以自己設(shè)置css樣式來自定義喜歡的皮膚哦。

F12進(jìn)入調(diào)試模式玉组,像這樣:

666.gif

你想要什么顏色都可以谎柄!

紅色:

Paste_Image.png

藍(lán)色:

Paste_Image.png

銀色:

Paste_Image.png

土豪金:

Paste_Image.png

在下一節(jié),我們嘗試把各種皮膚封裝到組件里惯雳。

時(shí)間不早了朝巫,今天只完成了一個(gè)模板,下次我們?cè)倭陌桑?/p>

勘誤:

iconfont的圖片編碼沒能正常顯示石景,可能是markdown編輯器不支持吧劈猿。

Paste_Image.png

就是如圖所示的編碼,markdown編輯器沒有正常顯示出來潮孽,額揪荣,這個(gè)小細(xì)節(jié)就先忽略吧,嘿嘿往史。

本章結(jié)束 ...

剽悍一小兔仗颈,電氣自動(dòng)化畢業(yè)。
參加工作后對(duì)計(jì)算機(jī)感興趣怠堪,深知初學(xué)編程之艱辛揽乱。
希望將自己所學(xué)記錄下來,給初學(xué)者一點(diǎn)幫助粟矿。

免責(zé)聲明: 博客中所有的圖片素材均來自百度搜索,僅供學(xué)習(xí)交流损拢,如有問題請(qǐng)聯(lián)系我陌粹,侵立刪,謝謝福压。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末掏秩,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子荆姆,更是在濱河造成了極大的恐慌蒙幻,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件胆筒,死亡現(xiàn)場(chǎng)離奇詭異邮破,居然都是意外死亡诈豌,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門抒和,熙熙樓的掌柜王于貴愁眉苦臉地迎上來矫渔,“玉大人,你說我怎么就攤上這事摧莽∶硗荩” “怎么了?”我有些...
    開封第一講書人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵镊辕,是天一觀的道長油够。 經(jīng)常有香客問我,道長征懈,這世上最難降的妖魔是什么石咬? 我笑而不...
    開封第一講書人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮受裹,結(jié)果婚禮上碌补,老公的妹妹穿的比我還像新娘。我一直安慰自己棉饶,他們只是感情好厦章,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著照藻,像睡著了一般袜啃。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上幸缕,一...
    開封第一講書人閱讀 49,046評(píng)論 1 285
  • 那天群发,我揣著相機(jī)與錄音,去河邊找鬼发乔。 笑死熟妓,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的栏尚。 我是一名探鬼主播起愈,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼译仗!你這毒婦竟也來了抬虽?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤纵菌,失蹤者是張志新(化名)和其女友劉穎阐污,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體咱圆,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡笛辟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年功氨,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片隘膘。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡疑故,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出弯菊,到底是詐尸還是另有隱情纵势,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布管钳,位于F島的核電站钦铁,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏才漆。R本人自食惡果不足惜牛曹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望醇滥。 院中可真熱鬧黎比,春花似錦、人聲如沸鸳玩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽寨典。三九已至,卻和暖如春谷丸,著一層夾襖步出監(jiān)牢的瞬間窝革,已是汗流浹背购城。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留虐译,地道東北人瘪板。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像漆诽,于是被迫代替她去往敵國和親篷帅。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

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